TimeAccounting
1.4.3
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for TimeAccounting 1.4.3.
Optimized DB.
First stable release.
Second beta with one timezone related bugfix.
First beta release of version 1.4.
A TimeAccounting Modul.
Ein Zeiterfassungsmodul.
2.4.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package TimeAccounting.<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket TimeAccounting zu installieren.<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standardmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>BIENVENIDO</b>
<br>
<br>
Ud. está a punto de instalar el paquete Contabilidad de Tiempo de OTRS.<br>
<br>
<br>
<b>NOTA</b>
<br>
<br>
Asegúrese de que su base de datos acepte paquetes de tamaño superior a 5 MB. Una base de datos MySQL, por ejemplo, acepta por defecto paquetes de 1 MB, como máximo. En este caso, el valor de max_allowed_packet debe incrementarse. El tamaño que se recomienda es de 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
In order to grant users access to the time accounting module, you need to add them as member to the group 'time_accounting'.
<br>
<br>
The menu items that were added by this package will be visible after you log-in to the system again.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>HINWEIS</b>
<br>
<br>
Um Benutzern Zugriff auf die Zeiterfassung zu gewähren, müssen diese Mitglied der neuen Gruppe 'time_accounting' sein.
<br>
<br>
Die von diesem Paket hinzugefügten Menü-Punkte sind erst nach einem erneuten Anmeldevorgang im System sichtbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTA</b>
<br>
<br>
Para permitirles s los usuarios el acceso al módulo de contabilidad de tiempo, es necesario añadirlos como miembros del grupo 'time_accounting'.
<br>
<br>
Los elementos del menú agregados por este paquete, serán visibles luego de reiniciar sesión en el sistema.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
<br>
<br>
The group 'time_accounting' that was created during package installation will be deactivated.
You can activate this group again in the admin area.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
Die von diesem Paket angelegte Gruppe 'time_accounting' wird deaktiviert.
Sie kann jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ATTENTION</b>
<br>
<br>
Si usted desinstala este paquete, todas las tablas de la base de datos que se crearon durante la instalación del mismo, se eliminarán y
el contenido de dichas tablas se perderá irrevocablemente.
<br>
<br>
El grupo 'time_accounting' que se dió de alta durante la instalación del paquete, se desactivará.
Es posible reactivar dicho grupo en el área de administración.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WELCOME</b>
<br>
<br>
You are about to upgrade the OTRS package TimeAccounting.<br>
<br>
<br>
</b>ATTENTION</b>
<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket TimeAccounting zu aktualisieren.<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standardmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>BIENVENIDO</b>
<br>
<br>
Ud. está a punto de actualizar el paquete Contabilidad de Tiempo de OTRS.<br>
<br>
<br>
<b>NOTA</b>
<br>
<br>
Asegúrese de que su base de datos acepte paquetes de tamaño superior a 5 MB. Una base de datos MySQL, por ejemplo, acepta por defecto paquetes de 1 MB, como máximo. En este caso, el valor de max_allowed_packet debe incrementarse. El tamaño que se recomienda es de 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
# 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."
);
}
}
2017-10-09 16:01:09
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpbWVBY2NvdW50aW5nLnhtbCx2IDEuMTQuMi4xIDIwMTAtMTEtMjYgMTM6NTE6NDMgbW4gRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFRpbWVBY2NvdW50aW5nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24gZm9yIFRpbWVBY2NvdW50aW5nTW9kdWxlICB0byBkZWZpbmUgdGhlIHJlZ2lzdHJhdGlvbiBzZXR0aW5ncyBpbiB0aGUgcHJvZ3JhbSBhbmQgdG8gc2V0IHJpZ2h0cyBhbmQgcG9zaXRpb25zIG9mIGljb25zIGluIHRoZSBuYXZpZ2F0aW9uIGJhci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRNb2R1bFJlZ2lzdHJhdGlvbiBm/HIgZGFzIFplaXRlcmZhc3N1bmdzTW9kdWwuICBIaWVyCmv2bm5lbiBTaWUgZGllIEFuZ2FiZW4gZvxyIGRpZSBSZWdpc3RyaWVydW5nIGRlcyBNb2R1bHMgaW0gUHJvZ3JhbW0gdOR0aWdlbi4gRmVybmVyCmv2bm5lbiBkaWUgUmVjaHRlIHVuZCBkaWUgUG9zaXRpb25lbiBkZXIgSWNvbnMgaW4gZGVyIE5hdmlnYXRpb25zbGVpc3RlIGdlc2V0enQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+dGltZV9hY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxHcm91cFJvPnRpbWVfYWNjb3VudGluZzwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UaW1lQWNjb3VudGluZzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaW1lQWNjb3VudGluZzwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5UaW1lQWNjb3VudGluZzwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UaW1lQWNjb3VudGluZzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+VGltZUFjY291bnRpbmc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPnRpbWVfYWNjb3VudGluZy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249RWRpdDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz42MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgIDxHcm91cFJvPnRpbWVfYWNjb3VudGluZzwvR3JvdXBSbz4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+T3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5vdmVydmlldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249T3ZlcnZpZXc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+VGltZUFjY291bnRpbmc8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pm88L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz50aW1lX2FjY291bnRpbmc8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkVkaXQgdGltZSByZWNvcmQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkVkaXQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm5ldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249RWRpdDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgIDxHcm91cD50aW1lX2FjY291bnRpbmc8L0dyb3VwPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Qcm9qZWN0IHRpbWUgcmVwb3J0aW5nPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5SZXBvcnRpbmc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPnJlcG9ydGluZy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249UmVwb3J0aW5nPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlRpbWVBY2NvdW50aW5nPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz41MDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwPnRpbWVfYWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkVkaXQgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5TZXR0aW5nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5tb2R1bGVfc2V0dGluZy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJmFtcDtTdWJhY3Rpb249U2V0dGluZzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5UaW1lQWNjb3VudGluZzwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+OTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRQcm9qZWN0TmFtZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmFtZSBmb3IgbmV3IHByb2plY3RzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Jbml0aWFsZXIgUHJvamVrdG5hbWUgYmVpbSBFcnN0ZWxsZW4gZWluZXMgbmV1ZW4gUHJvamVrdHMgaW4gZGVyIFplaXRlcmZhc3N1bmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdFN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyBwcm9qZWN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIFByb2pla3RzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+aW52YWxpZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+dmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0QWN0aW9uTmFtZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmFtZSBmb3IgbmV3IGFjdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkluaXRpYWxlciBOYW1lIGVpbmVyIG5ldWVuIFTkdGlna2VpdCBpbiBkZXIgWmVpdGVyZmFzc3VuZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25TdGF0dXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHN0YXR1cyBvZiBhbiBuZXcgYWN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVyIG5ldWVuIFTkdGlna2VpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJXZWVrbHlIb3VycyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHN0YW5kYXJkIHdlZWtseSBob3Vycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgV29jaGVuYXJiZWl0c3plaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjQwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyTGVhdmVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBsZWF2ZSBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBVcmxhdWJzdGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjM8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJPdmVydGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc2V0dGluZyBmb3Igb3ZlcnRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkV2ZW50dWVsbCB2b3JoYW5kZW5lciDcYmVyc3R1bmRlbvxiZXJ0cmFnLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4wPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGF0ZVN0YXJ0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIHN0YXJ0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFydGRhdHVtIGb8ciBkaWUgRWluZ2FiZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjIwMTAtMDEtMDE8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlRW5kIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIGVuZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RW5kZGF0dW0gZvxyIGRpZSBFaW5nYWJlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MjAxMC0xMi0zMTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlclN0YXR1cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdHVzIG9mIGFuIG5ldyB1c2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmZhbmdzc3RhdHVzIGVpbmVzIG5ldWVuIEJlbnV0emVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPmludmFsaWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPnZhbGlkPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V29ya2luZyBkYXlzIGFmdGVyIGF0IHRoZSBsYXRlc3Qgd29ya2luZyB1bml0cyBoYXZlIHRvIGluc2VydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGVndCBmZXN0LCBuYWNoIHdpZXZpZWxlbiBXZXJrdGFnZW4gc3DkdGVzdGVucyBkaWUgQXJiZWl0c3N0dW5kZW4gZWluZ2V0cmFnZW4gd2VyZGVuIG38c3Nlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhJbnRlcnZhbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB3YXJuaW5nLCBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5aZWlndCBlaW5lIFdhcm51bmcsIHdlbm4genV2aWVsZSBBcmJlaXRzdGFnZSBuaWNodCBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjI8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6Tm90aWZ5TW9kdWxlIyMjODg4LVRpbWVBY2NvdW50aW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBub3RpZmljYXRpb24gbW9kdWxlIGdpdmVzIGEgd2FybmluZyBpZiB0byBtdWNoIGluY29tcGxldGUgd29ya2luZyBkYXlzIGF2YWlsYWJsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwsIGRhcyBkZW4gQWdlbnQgaW0gTm90aWZpY2F0aW9uLUJlcmVpY2ggZGVzIEFnZW50LUludGVyZmFjZXMgZGFy/GJlciBpbmZvcm1pZXJ0LCB3ZW5uIHNjaG9uIHp1IGxhbmdlIGtlaW5lIFN0dW5kZW4gbWVociBlaW5nZXRyYWdlbiB3dXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZU5vdGlmeTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOb3RpZmljYXRpb25UaW1lQWNjb3VudGluZzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpNYXhBbGxvd2VkSW5zZXJ0RGF5cyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZvciBob3cgbWFueSBkYXlzIGFnbyB5b3UgY2FuIGluc2VydCB3b3JraW5nIHVuaXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIGJpcyB3YW5uIG1hbiBpbiDkbHRlcmUgWmVpdGVpbnRy5GdlIGJlYXJiZWl0ZW4ga2FubiAoei4gQi4gMTAgVGFnZSB6dXL8Y2tsaWVnZW5kKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6UmVkdWNlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRvIHVzZSwgaWYgc29tZSBhY3Rpb25zIGFjb3VudCByZWR1Y2VkIHdvcmtpbmcgaG91cnMoS2V5ID0mZ3Q7IHRyYXZlbGluZzsgQ29udGVudCA9Jmd0OyA1MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBtYW4gZWluZ2ViZW4sIG9iIGb8ciBlaW5lIGJlc3RpbW10ZSBU5HRpZ2tlaXQsIGRpZSB6dSB2ZXJyZWNobmVuZGVuIFN0dW5kZW4gZ2Vr/HJ6dCB3ZXJkZW4uIFouIEIgd2VubiBSZWlzZXplaXRlbiBudXIgenVyIEjkbGZ0ZSB2ZXJn/HRldCB3ZXJkZW4gKEtleSA9Jmd0OyBqb3VybmV5OyBDb250ZW50ID0mZ3Q7IDUwKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJ0cmF2ZWxpbmciPjUwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGltZUFjY291bnRpbmc6OklucHV0SG91cnNXaXRob3V0U3RhcnRFbmRUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0dGluZywgaWYgd29ya2luZyBob3VycyBjYW4gaW5zZXJ0IHdpdGhvdXQgc3RhcnQtIGFuZCBlbmR0aW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MZWd0IGZlc3QsIG9iIG1hbiBBcmJlaXRzc3R1bmRlbiBhdWNoIG9obmUgQW5mYW5ncy0gdW5kIEVuZHplaXQgZWluZ2ViZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlByZUFwcGxpY2F0aW9uTW9kdWxlIyMjQWdlbnRUaW1lQWNjb3VudGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgbW9kdWxlIHlvdSBjYW4gZm9yY2UgaW5zZXJ0cyBpbiB0aGUgVGltZUFjY291bnRpbmcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBIaWxmZSBkaWVzZXMgTW9kdWxzIGv2bm5lbiBFaW50cuRnZSBpbiBkaWUgWmVpdGVyZmFzc3VuZyBlcnp3dW5nZW4gd2VyZGVuLCBpbiBkZW0gYmVpbSBFaW5sb2dnZW4gZGFzIFBvcnRhbCBnZWJsb2NrdCB3aXJkIHVuZCBudXIgZGFzIFplaXRlcmZhc3N1bmdzZmVuc3RlciBlcnNjaGVpbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPktlcm5lbDo6TW9kdWxlczo6QWdlbnRUaW1lQWNjb3VudGluZzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpQcm9qZWN0MlJlbWFya1JlZ0V4cCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZvciB3aGljaCBwcm9qZWN0cyBpcyBhIHJlbWFyayByZXF1aXJlZC4gSWYgdGhlIFJlZ0V4cCBtYXRjaCBvbiB0aGUgcHJvamVjdCwgeW91IGhhdmUgdG8gaW5zZXJ0IGEgcmVtYXJrIHRvby4gVGhlIFJlZ0V4cCB1c2UgdGhlIHNteCBwYXJhbWV0ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklubmVyaGFsYiBkaWVzZXIgS29uZmlndXJhdGlvbnNvcHRpb24ga2FubiBlaW5lIFJlZ0V4cCBkZWZpbmllcnQgd2VyZGVuLCBkaWUgZmVzdGxlZ3QsIGJlaSB3ZWxjaGVuIFByb2pla3RlbiBlaW5lIEJlbWVya3VuZyBlaW5nZXRyYWdlbiB3ZXJkZW4gbXVzcyAoZGllIFJlZ0V4cCBhcmJlaXRldCBtaXQgc214LVBhcmFtZXRlcm4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpbWVBY2NvdW50aW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5eKD86IFBST0pFQ1RcIyB8IElORlJBOiB8IFBST0RVQ1Q6ICk8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaW1lQWNjb3VudGluZzo6UHJvamVjdExpc3RDb25zdHJhaW50cyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGNvbnN0cmFpbmluZyBwcm9qZWN0IGxpc3QgYWNjb3JkaW5nIHRvIHVzZXIgZ3JvdXBzLiBLZXkgY29udGFpbnMgcmVndWxhciBleHByZXNzaW9uIGZvciBwcm9qZWN0KHMpLCBjb250ZW50IGNvbnRhaW5zIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGdyb3Vwcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+UmVndWzkcmUgQXVzZHL8Y2tlIHp1ciBFaW5zY2hy5G5rdW5nIGRlciBQcm9qZWt0bGlzdGUgYWJo5G5naWcgdm9uIEdydXBwZW56dW9yZG51bmcgZGVzIEJlbnV0emVycy4gU2NobPxzc2VsIGVudGjkbHQgUmVnRXhwIGb8ciBQcm9qZWt0KGUpLCBJbmhhbHQgZW50aORsdCBrb21tYXNlcGFyaWVydGUgTGlzdGUgdm9uIEdydXBwZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGltZUFjY291bnRpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpbWVBY2NvdW50aW5nOjpBY3Rpb25MaXN0Q29uc3RyYWludHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZWd1bGFyIGV4cHJlc3Npb25zIGZvciBjb25zdHJhaW5pbmcgYWN0aW9uIGxpc3QgYWNjb3JkaW5nIHRvIHNlbGVjdGVkIHByb2plY3QuIEtleSBjb250YWlucyByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHByb2plY3QocyksIGNvbnRlbnQgY29udGFpbnMgcmVndWxhciBleHByZXNzaW9ucyBmb3IgYWN0aW9uKHMpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5SZWd1bORyZSBBdXNkcvxja2UgenVyIEVpbnNjaHLkbmt1bmcgZGVyIFTkdGlna2VpdGVubGlzdGUgYWJo5G5naWcgdm9tIGdld+RobHRlbiBQcm9qZWt0LiBTY2hs/HNzZWwgZW50aORsdCBSZWdFeHAgZvxyIFByb2pla3QsIEluaGFsdCBlbnRo5Gx0IFJlZ0V4cCBm/HIgVOR0aWdrZWl0KGVuKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaW1lQWNjb3VudGluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gdGhlIGRlIGxhbmd1YWdlIGZvciBBZ2VudFRpbWVBY2NvdW50aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS40NS4yLjEgMjAxMC0xMS0yNiAxMzo1MTo0MyBtbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BZ2VudFRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufSA9IHsKICAgICAgICAleyAkU2VsZi0+e1RyYW5zbGF0aW9ufSB9LAoKICAgICAgICAjIFRlbXBsYXRlOiBBZ2VudFRpbWVBY2NvdW50aW5nCiAgICAgICAgJ1NldHRpbmcnICAgICAgICAgID0+ICdLb25maWd1cmF0aW9uJywKICAgICAgICAnUHJvamVjdCBzZXR0aW5ncycgPT4gJ1Byb2pla3Rrb25maWd1cmF0aW9uZW4nLAoKICAgICAgICAnTmV4dCBkYXknICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ07kY2hzdGVyIFRhZycsCiAgICAgICAgJ09uZSBkYXkgYmFjaycgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdFaW5lbiBUYWcgenVy/GNrJywKICAgICAgICAnRGF0ZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdHVtJywKICAgICAgICAnQ29tbWVudHMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0tvbW1lbnRhcmUnLAogICAgICAgICd1bnRpbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnYmlzJywKICAgICAgICAnVG90YWwgaG91cnMgd29ya2VkJyAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FyYmVpdHNzdHVuZGVuJywKICAgICAgICAnV29ya2luZyBIb3VycycgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0FyYmVpdHNzdHVuZGVuJywKICAgICAgICAnSG91cnMgcGVyIHdlZWsnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1dvY2hlbnN0dW5kZW4nLAogICAgICAgICd0aGlzIG1vbnRoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnZGllc2VyIE1vbmF0JywKICAgICAgICAnT3ZlcnRpbWUgKEhvdXJzKScgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzdHVuZGVuIChpbiBTdHVuZGVuKScsCiAgICAgICAgJ092ZXJ0aW1lICh0b3RhbCknICAgICAgICAgICAgICAgICAgICAgICAgID0+ICfcYmVyc3R1bmRlbiAoZGllc2VyIE1vbmF0KScsCiAgICAgICAgJ092ZXJ0aW1lICh0aGlzIG1vbnRoKScgICAgICAgICAgICAgICAgICAgID0+ICfcYmVyc3R1bmRlbiAoU3VtbWUpJywKICAgICAgICAnUmVtYWluaW5nIG92ZXJ0aW1lIGxlYXZlJyAgICAgICAgICAgICAgICAgPT4gJ9xiZXJzdHVuZGVuICh2ZXJibGVpYmVuZCknLAogICAgICAgICdWYWNhdGlvbicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXJsYXViJywKICAgICAgICAnVmFjYXRpb24gKERheXMpJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VybGF1YiAoaW4gVGFnZW4pJywKICAgICAgICAnVmFjYXRpb24gdGFrZW4gKHRoaXMgbW9udGgpJyAgICAgICAgICAgICAgPT4gJ1VybGF1YnN0YWdlIChkaWVzZXIgTW9uYXQpJywKICAgICAgICAnVmFjYXRpb24gdGFrZW4gKHRvdGFsKScgICAgICAgICAgICAgICAgICAgPT4gJ1VybGF1YnN0YWdlIChTdW1tZSknLAogICAgICAgICdSZW1haW5pbmcgdmFjYXRpb24nICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXJsYXVic3RhZ2UgKHZlcmJsZWliZW5kKScsCiAgICAgICAgJ1NpY2sgbGVhdmUgdGFrZW4gKHRoaXMgbW9udGgpJyAgICAgICAgICAgID0+ICdFcmtyYW5rdCAoZGllc2VyIE1vbmF0KScsCiAgICAgICAgJ1NpY2sgbGVhdmUgdGFrZW4gKHRvdGFsKScgICAgICAgICAgICAgICAgID0+ICdFcmtyYW5rdCAoU3VtbWUpJywKICAgICAgICAnVGltZUFjY291bnRpbmcnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmcnLAogICAgICAgICdUaW1lIHJlcG9ydGluZyBtb250aGx5IG92ZXJ2aWV3JyAgICAgICAgICA9PiAnTW9uYXRz/GJlcnNpY2h0IFplaXRlcmZhc3N1bmcnLAogICAgICAgICdFZGl0IHRpbWUgcmVjb3JkJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnWmVpdGVyZmFzc3VuZyBiZWFyYmVpdGVuJywKICAgICAgICAnRWRpdCB0aW1lIGFjY291bnRpbmcgc2V0dGluZ3MnICAgICAgICAgICAgPT4gJ1plaXRlcmZhc3N1bmdzZWluc3RlbGx1bmdlbiBiZWFyYmVpdGVuJywKICAgICAgICAnVXNlciByZXBvcnRzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ051dHplcmJlcmljaHRlJywKICAgICAgICAnVXNlclwncyBwcm9qZWN0IG92ZXJ2aWV3JyAgICAgICAgICAgICAgICAgPT4gJ051dHplcmJlcmljaHRlJywKICAgICAgICAnUHJvamVjdCByZXBvcnQnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Byb2pla3RiZXJpY2h0JywKICAgICAgICAnUHJvamVjdCByZXBvcnRzJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1Byb2pla3RiZXJpY2h0ZScsCiAgICAgICAgJ1RpbWUgcmVwb3J0aW5nJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdaZWl0YmVyaWNodGUnLAogICAgICAgICdMZWF2ZURheSBSZW1haW5pbmcnICAgICAgICAgICAgICAgICAgICAgICA9PiAnVmVyYmxlaWJlbmRlIFVybGF1YnN0YWdlJywKICAgICAgICAnTW9udGhseSB0b3RhbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ3BybyBNb25hdCcsCiAgICAgICAgJ1ZpZXcgdGltZSByZWNvcmQnICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdaZWl0cmVrb3JkIGFuc2ljaHQnLAogICAgICAgICdWaWV3IG9mICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQW5zaWNodCB2b24nLAogICAgICAgICdNb250aGx5JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAncHJvIE1vbmF0JywKICAgICAgICAnSG91cnMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1N0dW5kZW4nLAogICAgICAgICdEYXRlIG5hdmlnYXRpb24nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQXVzd2FobCBEYXR1bScsCiAgICAgICAgJ01vbnRoIG5hdmlnYXRpb24nICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBdXN3YWhsIERhdHVtJywKICAgICAgICAnRGF5cyB3aXRob3V0IGVudHJpZXMnICAgICAgICAgICAgICAgICAgICAgPT4gJ25pY2h0IGF1c2dlZvxsbHRlIFRhZ2UnLAogICAgICAgICdQcm9qZWN0JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdCcsCiAgICAgICAgJ1Byb2plY3RzJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQcm9qZWt0ZScsCiAgICAgICAgJ0dyYW5kIHRvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdW1tZScsCiAgICAgICAgJ0xpZmV0aW1lJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdW1tZScsCiAgICAgICAgJ0xpZmV0aW1lIHRvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdW1tZScsCiAgICAgICAgJ1JlcG9ydGluZycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdCZXJpY2h0c3dlc2VuJywKICAgICAgICAnVGFzayBzZXR0aW5ncycgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1TkdGlna2VpdHNlaW5zdGVsbHVuZ2VuJywKICAgICAgICAnVXNlciBzZXR0aW5ncycgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ051dHplcmVpbnN0ZWxsdW5nZW4nLAogICAgICAgICdTaG93IE92ZXJ0aW1lJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAn3GJlcnN0dW5kZW4gYW56ZWlnZW4nLAogICAgICAgICdBbGxvdyBwcm9qZWN0IGNyZWF0aW9uJyAgICAgICAgICAgICAgICAgICA9PiAnUHJvamVrdCBlcnN0ZWxsZW4nLAogICAgICAgICdBZGQgdGltZSBwZXJpb2QnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTmV1ZSBOdXR6ZXJlaW5zdGVsbHVuZycsCiAgICAgICAgJ1JlbWFyaycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdBbm1lcmt1bmcnLAogICAgICAgICdTdGFydCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQmVnaW5uJywKICAgICAgICAnRW5kJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0VuZGUnLAogICAgICAgICdQZXJpb2QgYmVnaW4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0dW0gQmVnaW5uJywKICAgICAgICAnUGVyaW9kIGVuZCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0RhdHVtIEVuZGUnLAogICAgICAgICdQZXJpb2QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF1ZXInLAogICAgICAgICdEYXlzIG9mIHZhY2F0aW9uJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXJsYXVic3RhZ2UnLAogICAgICAgICdPbiB2YWNhdGlvbicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnaW0gVXJsYXViJywKICAgICAgICAnU2ljayBkYXknICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0Vya3Jhbmt0JywKICAgICAgICAnU2ljayBsZWF2ZSAoRGF5cyknICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0Vya3Jhbmt0IChpbiBUYWdlbiknLAogICAgICAgICdTaWNrIGxlYXZlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QnLAogICAgICAgICdPbiBzaWNrIGxlYXZlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJrcmFua3QnLAogICAgICAgICdUYXNrJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVOR0aWdrZWl0JywKICAgICAgICAnQXV0aG9yaXplZCBvdmVydGltZScgICAgICAgICAgICAgICAgICAgICAgPT4gJ2F1dG9yaXNpZXJ0ZSDcYmVyc3R1bmRlbicsCiAgICAgICAgJ09uIG92ZXJ0aW1lIGxlYXZlJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICfcYmVyc3R1bmRlbicsCiAgICAgICAgJ092ZXJ0aW1lIGxlYXZlJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICfcYmVyc3R1bmRlbicsCiAgICAgICAgJ1RvdGFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdW1tZScsCiAgICAgICAgJ092ZXJ2aWV3IG9mICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICfcYmVyc2ljaHQgLSAnLAogICAgICAgICdUaW1lQWNjb3VudGluZyBvZicgICAgICAgICAgICAgICAgICAgICAgICA9PiAnWmVpdGVyZmFzc3VuZyB2b20nLAogICAgICAgICdTdWNjZXNzZnVsIGluc2VydCEnICAgICAgICAgICAgICAgICAgICAgICA9PiAnRXJmb2xncmVpY2ggZWluZ2Vm/Gd0IScsCiAgICAgICAgJ01vcmUgaW5wdXQgZmllbGRzJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICdXZWl0ZXJlIEVpbmdhYmVmZWxkZXInLAogICAgICAgICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0JyA9PiAnV29sbGVuIFNpZSBkaWVzZW4gRWludHJhZyB3aXJrbGljaCBs9nNjaGVuJywKICAgICAgICAnQ2FuXCd0IGluc2VydCBXb3JraW5nIFVuaXRzIScgICAgICAgICAgICAgPT4gJ0thbm4gZGllIEFyYmVpdHNzdHVuZGVuIG5pY2h0IGVpbmb8Z2VuIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgdGFzayEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIFTkdGlna2VpdCBmZWhsdCEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHByb2plY3QhJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBQcm9qZWt0YW5nYWJlIGZlaGx0IScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIHRoZSBQZXJpb2QgaXMgYmlnZ2VyIHRoYW4gdGhlIGludGVydmFsIGJldHdlZW4gU3RhcnR0aW1lIGFuZCBFbmR0aW1lIScKICAgICAgICAgICAgPT4gJ05pY2h0IHNwZWljaGVyYmFyIC0gRGF1ZXIgaXN0IGdy9t9lciBhbHMgZGVyIFplaXRyYXVtIHp3aXNjaGVuIEJlZ2lubiB1bmQgRW5kZSEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBTdGFydHRpbWUgaXMgb2xkZXIgdGhhbiBFbmR0aW1lIScgPT4KICAgICAgICAgICAgJ05pY2h0IHNwZWljaGVyYmFyIC0gQmVnaW5uIGxpZWd0IG5hY2ggRW5kZSEnLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHBlcmlvZCEnID0+CiAgICAgICAgICAgICdOaWNodCBzcGVpY2hlcmJhciAtIERhdWVyIChlcmdpYnQgc2ljaCBhdXMgU3RhcnQtIHVuZCBFbmR6ZWl0KSBpc3QgbmljaHQgYW5nZWdlYmVuIScsCiAgICAgICAgJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIFBlcmlvZCBpcyBub3QgZ2l2ZW4gZ2l2ZW4hJyA9PgogICAgICAgICAgICAnTmljaHQgc3BlaWNoZXJiYXIgLSBEYXVlciAoZXJnaWJ0IHNpY2ggYXVzIFN0YXJ0LSB1bmQgRW5kemVpdCkgaXN0IG5pY2h0IGFuZ2VnZWJlbiEnLAogICAgICAgICdBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiBzaWNrIGxlYXZlPycgPT4KICAgICAgICAgICAgJ1NpZSB3YXJlbiBrcmFuayB1bmQgaGFiZW4gZ2VhcmJlaXRldD8gV2lyIGJyYXVjaGVuIG1laHIgc29sY2hlIE1pdGFyYmVpdGVyLicsCiAgICAgICAgJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIHZhY2F0aW9uPycgPT4KICAgICAgICAgICAgJ1NpZSBoYXR0ZW4gVXJsYXViIHVuZCBoYWJlbiBnZWFyYmVpdGV0PyBXaXIgYnJhdWNoZW4gbWVociBzb2xjaGUgTWl0YXJiZWl0ZXIuJywKICAgICAgICAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IHdlcmUgb24gb3ZlcnRpbWUgbGVhdmU/JyA9PgogICAgICAgICAgICAnSGFiZW4gU2llIHfkaHJlbmQgZGVyINxiZXJzdHVuZGVuIGF1Y2ggZ2VhcmJlaXRldD8nLAogICAgICAgICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBhIGRheSBoYXMgb25seSAyNCBob3VycyEnID0+ICdFaW4gVGFnIGhhdCBudXIgMjQgU3R1bmRlbiEnLAogICAgICAgICdDYW5cJ3QgZGVsZXRlIFdvcmtpbmcgVW5pdHMhJyAgICAgID0+ICdLYW5uIEFyYmVpdHNzdHVuZGVuIG5pY2h0IGz2c2NoZW4hJywKICAgICAgICAnUGxlYXNlIGluc2VydCB5b3VyIHdvcmtpbmcgaG91cnMhJyA9PiAnQml0dGUgdHJhZ2VuIFNpZSBJaHJlIEFyYmVpdHN6ZWl0ZW4gZWluIScsCiAgICAgICAgJ1lvdSBoYXZlIHRvIGluc2VydCBhIHN0YXJ0IGFuZCBhbiBlbmQgdGltZSBvciBhIHBlcmlvZCcgPT4KICAgICAgICAgICAgJ1NpZSBt/HNzZW4gQmVnaW5uLSB1bmQgRW5kZXplaXQgb2RlciBkaWUgRGF1ZXIgYW5nZWJlbi4nLAogICAgICAgICdZb3UgY2FuIG9ubHkgc2VsZWN0IG9uZSBjaGVja2JveCBlbGVtZW50IScgPT4gJ1NpZSBr9m5uZW4gbnVyIGVpbmUgQ2hlY2tib3ggbWFya2llcmVuIScsCiAgICAgICAgJ0VkaXQgdGltZSBhY2NvdW50aW5nIHByb2plY3Qgc2V0dGluZ3MnID0+CiAgICAgICAgICAgICdaZWl0ZXJmYXNzdW5nOiBCZWFyYmVpdHVuZyBkZXIgUHJvamVrdGtvbmZpZ3VyYXRpb24nLAogICAgICAgICdQcm9qZWN0IHNldHRpbmdzJyA9PiAnUHJvamVrdGtvbmZpZ3VyYXRpb24nLAogICAgICAgICdJZiB5b3Ugc2VsZWN0ICJNaXNjZWxsYW5lb3VzIChtaXNjKSIgdGhlIHRhc2ssIHBsZWFzZSBleHBsYWluIHRoaXMgaW4gdGhlIHJlbWFya3MgZmllbGQnID0+CiAgICAgICAgICAgICdXZW5uIFNpZSBhbHMgVOR0aWdrZWl0IFNvbnN0aWdlcyBhdXN35GhsZW4sIGdlYmVuIFNpZSBiaXR0ZSBlaW5lIEJlc2NocmVpYnVuZyB1bSBGZWxkIEFubWVya3VuZyBhbi4nLAogICAgICAgICdQbGVhc2UgYWRkIGEgcmVtYXJrIHdpdGggbW9yZSB0aGFuIDggY2hhcmFjdGVycyEnID0+CiAgICAgICAgICAgICdCaXR0ZSBnZWJlbiBTaWUgZWluZSBBbm1lcmt1bmcgZWluIGRpZSBs5G5nZXIgYWxzIDggWmVpY2hlbiBpc3QhJywKCiMgRklYTUUgYWN0dWFsbHkgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZmlsZSBkZS5wbSwgaG93ZXZlciB0aGV5J3JlIG5vdCBzbyBJIHB1dCdlbSBoZXJlLi4uCiAgICAgICAgJ01vbicgICAgICA9PiAnTW8nLAogICAgICAgICdUdWUnICAgICAgPT4gJ0RpJywKICAgICAgICAnV2VkJyAgICAgID0+ICdNaScsCiAgICAgICAgJ1RodScgICAgICA9PiAnRG8nLAogICAgICAgICdGcmknICAgICAgPT4gJ0ZyJywKICAgICAgICAnU2F0JyAgICAgID0+ICdTYScsCiAgICAgICAgJ1N1bicgICAgICA9PiAnU28nLAogICAgICAgICdKYW51YXJ5JyAgPT4gJ0phbnVhcicsCiAgICAgICAgJ0ZlYnJ1YXJ5JyA9PiAnRmVicnVhcicsCiAgICAgICAgJ01hcmNoJyAgICA9PiAnTeRyeicsCiAgICAgICAgJ01heScgICAgICA9PiAnTWFpJywKICAgICAgICAnSnVuZScgICAgID0+ICdKdW5pJywKICAgICAgICAnSnVseScgICAgID0+ICdKdWxpJywKICAgICAgICAnT2N0b2JlcicgID0+ICdPa3RvYmVyJywKICAgICAgICAnRGVjZW1iZXInID0+ICdEZXplbWJlcicsCiAgICB9OwogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9BZ2VudFRpbWVBY2NvdW50aW5nLnBtIC0gUGVyc2lhbiB0cmFuc2xhdGlvbiBmb3IgQWdlbnRUaW1lQWNjb3VudGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDExIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZmFfQWdlbnRUaW1lQWNjb3VudGluZy5wbSx2IDEuMi4yLjIgMjAxMS0wMS0wNSAxMDowNDowOCBtbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9BZ2VudFRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yLjIuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnU2V0dGluZyd9ID0gJ9iq2YbYuNuM2YXYp9iqJzsKICAgICRMYW5nLT57J1Byb2plY3Qgc2V0dGluZ3MnfSA9ICfYqtmG2LjbjNmF2KfYqiDZvtix2YjamNmHJzsKICAgICRMYW5nLT57J05leHQgZGF5J30gPSAn2LHZiNiyINio2LnYryc7CiAgICAkTGFuZy0+eydPbmUgZGF5IGJhY2snfSA9ICfYqNix2q/YtNiqINio2Ycg2LHZiNiyINmC2KjZhCc7CiAgICAkTGFuZy0+eydEYXRlJ30gPSAn2KrYp9ix24zYric7CiAgICAkTGFuZy0+eydDb21tZW50cyd9ID0gJ9iq2YjYttuM2K3Yp9iqJzsKICAgICRMYW5nLT57J3VudGlsJ30gPSAn2KrYpyc7CiAgICAkTGFuZy0+eydUb3RhbCByYXMgZXVycyB3b3JrZWQnfSA9ICfYrNmF2Lkg2LPYp9i52KfYqiDaqdin2LHbjCc7CiAgICAkTGFuZy0+eydXb3JraW5nIEhvdXJzJ30gPSAn2LPYp9i52KfYqiDaqdin2LHbjCc7CiAgICAkTGFuZy0+eydIb3VycyBwZXIgd2Vlayd9ID0gJ9mF24zYstin2YYg2LPYp9i52KfYqiDYr9ixINmH2YHYqtmHJzsKICAgICRMYW5nLT57J3RoaXMgbW9udGgnfSA9ICfYp9uM2YYg2YXYp9mHJzsKICAgICRMYW5nLT57J092ZXJ0aW1lIChIb3VycyknfSA9ICfYs9in2LnYp9iqINin2LbYp9mB2Ycg2qnYp9ixJzsKICAgICRMYW5nLT57J092ZXJ0aW1lICh0b3RhbCknfSA9ICfZhdis2YXZiNi5INin2LbYp9mB2Ycg2qnYp9ixJzsKICAgICRMYW5nLT57J092ZXJ0aW1lICh0aGlzIG1vbnRoKSd9ID0gJ9in2LbYp9mB2Ycg2qnYp9ixINin24zZhiDZhdin2YcnOwogICAgJExhbmctPnsnUmVtYWluaW5nIG92ZXJ0aW1lIGxlYXZlJ30gPSAn2KfYttin2YHZhyDaqdin2LHbjCDYqNin2YLbjNmF2KfZhtiv2Ycg2YXYrNin2LInOwogICAgJExhbmctPnsnVmFjYXRpb24nfSA9ICfZhdix2K7YtduMJzsKICAgICRMYW5nLT57J1ZhY2F0aW9uIChEYXlzKSd9ID0gJ9mF2LHYrti124wgKdix2YjYstmH2KcoJzsKICAgICRMYW5nLT57J1ZhY2F0aW9uIHRha2VuICh0aGlzIG1vbnRoKSd9ID0gJ9mF2LHYrti124zigIzZh9in24wg2q/YsdmB2KrZhyDYtNiv2Ycg2KfbjNmGINmF2KfZhyc7CiAgICAkTGFuZy0+eydWYWNhdGlvbiB0YWtlbiAodG90YWwpJ30gPSAn2qnZhCDZhdix2K7YtduM4oCM2YfYp9uMINqv2LHZgdiq2Ycg2LTYr9mHJzsKICAgICRMYW5nLT57J1JlbWFpbmluZyB2YWNhdGlvbid9ID0gJ9mF2LHYrti124wg2KjYp9mC24zZhdin2YbYr9mHJzsKICAgICRMYW5nLT57J1NpY2sgbGVhdmUgdGFrZW4gKHRoaXMgbW9udGgpJ30gPSAn2KfYs9iq2LnZhNin2KzbjCDar9ix2YHYqtmHINi02K/ZhyDYp9uM2YYg2YXYp9mHJzsKICAgICRMYW5nLT57J1NpY2sgbGVhdmUgdGFrZW4gKHRvdGFsKSd9ID0gJ9qp2YQg2KfYs9iq2LnZhNin2KzbjCDar9ix2YHYqtmHINi02K/Zhyc7CiAgICAkTGFuZy0+eydUaW1lQWNjb3VudGluZyd9ID0gJ9it2LPYp9io2K/Yp9ix24wg2LLZhdin2YYnOwogICAgJExhbmctPnsnVGltZSBhY2NvdW50aW5nLid9ID0gJ9it2LPYp9io2K/Yp9ix24wg2LLZhdin2YYnOwogICAgJExhbmctPnsnVGltZSByZXBvcnRpbmcgbW9udGhseSBvdmVydmlldyd9ID0gJ9qv2LLYp9ix2LQg2qnZhNuMINmF2KfZh9uM2KfZhtmHINiy2YXYp9mGICc7CiAgICAkTGFuZy0+eydFZGl0IHRpbWUgcmVjb3JkJ30gPSAn2YjbjNix2KfbjNi0INiz2KfYqNmC2Ycg2LLZhdin2YYnOwogICAgJExhbmctPnsnRWRpdCB0aW1lIGFjY291bnRpbmcgc2V0dGluZ3MnfSA9ICfZiNuM2LHYp9uM2LQg2KrZhti424zZhdin2Kog2K3Ys9in2KjYr9in2LHbjCDYstmF2KfZhic7CiAgICAkTGFuZy0+eydVc2VyIHJlcG9ydHMnfSA9ICfar9iy2KfYsdi02KfYqiDaqdin2LHYqNix24wnOwogICAgJExhbmctPnsnVXNlclwncyBwcm9qZWN0IG92ZXJ2aWV3J30gPSAn2YbZhdin24wg2qnZhNuMINm+2LHZiNqY2Ycg2qnYp9ix2KjYsSc7CiAgICAkTGFuZy0+eydQcm9qZWN0IHJlcG9ydCd9ID0gJ9qv2LLYp9ix2LQg2b7YsdmI2pjZhyc7CiAgICAkTGFuZy0+eydQcm9qZWN0IHJlcG9ydHMnfSA9ICfar9iy2KfYsdi02KfYqiDZvtix2YjamNmHJzsKICAgICRMYW5nLT57J1RpbWUgcmVwb3J0aW5nJ30gPSAn2q/Ystin2LHYtNqv24zYsduMINiy2YXYp9mGJzsKICAgICRMYW5nLT57J0xlYXZlRGF5IFJlbWFpbmluZyd9ID0gJ9io2KfZgtuM2YXYp9mG2K/ZhyDYqtix2qkg2qnYp9ixJzsKICAgICRMYW5nLT57J01vbnRobHkgdG90YWwnfSA9ICfaqdmEINmF2KfZh9uM2KfZhtmHJzsKICAgICRMYW5nLT57J1ZpZXcgdGltZSByZWNvcmQnfSA9ICfZhtmF2KfbjNi0INiz2KfYqNmC2Ycg2LLZhdin2YYnOwogICAgJExhbmctPnsnVmlldyBvZid9ID0gJ9mG2YXYp9uMINqp2YTbjCDYp9iyJzsKICAgICRMYW5nLT57J01vbnRobHknfSA9ICfZhdin2YfbjNin2YbZhyc7CiAgICAkTGFuZy0+eydIb3Vycyd9ID0gJ9iz2KfYudin2KonOwogICAgJExhbmctPnsnRGF0ZSBuYXZpZ2F0aW9uJ30gPSAn2LHYp9mH2KjYsduMINiq2KfYsduM2K4nOwogICAgJExhbmctPnsnTW9udGggbmF2aWdhdGlvbid9ID0gJ9ix2KfZh9io2LHbjCDZhdin2YcnOwogICAgJExhbmctPnsnRGF5cyB3aXRob3V0IGVudHJpZXMnfSA9ICfYsdmI2LLZh9in24wg2KvYqNiqINmG2LTYr9mHJzsKICAgICRMYW5nLT57J1Byb2plY3QnfSA9ICfZvtix2YjamNmHJzsKICAgICRMYW5nLT57J1Byb2plY3RzJ30gPSAn2b7YsdmI2pjZh+KAjNmH2KcnOwogICAgJExhbmctPnsnR3JhbmQgdG90YWwnfSA9ICfYqti52K/Yp9ivJzsKICAgICRMYW5nLT57J0xpZmV0aW1lJ30gPSAn2KrYudiv2KfYryc7CiAgICAkTGFuZy0+eydMaWZldGltZSB0b3RhbCd9ID0gJ9iq2LnYr9in2K8nOwogICAgJExhbmctPnsnUmVwb3J0aW5nJ30gPSAn2q/Ystin2LHYtNqv24zYsduMJzsKICAgICRMYW5nLT57J1Rhc2sgc2V0dGluZ3MnfSA9ICfYqtmG2LjbjNmF2KfYqiDZiNi42KfbjNmBJzsKICAgICRMYW5nLT57J1VzZXIgc2V0dGluZ3MnfSA9ICfYqtmG2LjbjNmF2KfYqiDaqdin2LHYqNix24wnOwogICAgJExhbmctPnsnU2hvdyBPdmVydGltZSd9ID0gJ9mG2YXYp9uM2LQg2KfYttin2YHZhyDaqdin2LHbjCc7CiAgICAkTGFuZy0+eydBbGxvdyBwcm9qZWN0IGNyZWF0aW9uJ30gPSAn2KfYrNin2LLZhyDYs9in2K7YqiDZvtix2YjamNmHJzsKICAgICRMYW5nLT57J0FkZCB0aW1lIHBlcmlvZCd9ID0gJ9in2YHYstmI2K/ZhiDYr9mI2LHZhyDYstmF2KfZhtuMJzsKICAgICRMYW5nLT57J1JlbWFyayd9ID0gJ9iq2LDaqdixJzsKICAgICRMYW5nLT57J1N0YXJ0J30gPSAn2KLYutin2LInOwogICAgJExhbmctPnsnRW5kJ30gPSAn2b7Yp9uM2KfZhic7CiAgICAkTGFuZy0+eydQZXJpb2QgYmVnaW4nfSA9ICfYoti62KfYsiDYr9mI2LHZhyc7CiAgICAkTGFuZy0+eydQZXJpb2QgZW5kJ30gPSAn2b7Yp9uM2KfZhiDYr9mI2LHZhyc7CiAgICAkTGFuZy0+eydQZXJpb2QnfSA9ICfYr9mI2LHZhyc7CiAgICAkTGFuZy0+eydEYXlzIG9mIHZhY2F0aW9uJ30gPSAn2LHZiNiy2YfYp9uMINmF2LHYrti124wnOwogICAgJExhbmctPnsnT24gdmFjYXRpb24nfSA9ICfYr9ixINmF2LHYrti124wnOwogICAgJExhbmctPnsnU2ljayBkYXknfSA9ICfYqNuM2YXYp9ix24wnOwogICAgJExhbmctPnsnU2ljayBsZWF2ZSAoRGF5cyknfSA9ICfYsdmI2LLZh9in24wg2KfYs9iq2LnZhNin2KzbjCc7CiAgICAkTGFuZy0+eydTaWNrIGxlYXZlJ30gPSAn2KfYs9iq2LnZhNin2KzbjCc7CiAgICAkTGFuZy0+eydPbiBzaWNrIGxlYXZlJ30gPSAn2K/YsSDYp9iz2KrYudmE2KfYrNuMJzsKICAgICRMYW5nLT57J1Rhc2snfSA9ICfZiNi424zZgdmHJzsKICAgICRMYW5nLT57J0F1dGhvcml6ZWQgb3ZlcnRpbWUnfSA9ICfYp9i22KfZgdmHINqp2KfYsSDZhdis2KfYsic7CiAgICAkTGFuZy0+eydPbiBvdmVydGltZSBsZWF2ZSd9ID0gJ9iv2LEg2YXYp9iy2KfYryDYp9i22KfZgdmHINqp2KfYsduMJzsKICAgICRMYW5nLT57J092ZXJ0aW1lIGxlYXZlJ30gPSAn2YXYp9iy2KfYryDYp9i22KfZgdmHINqp2KfYsduMJzsKICAgICRMYW5nLT57J1RvdGFsJ30gPSAn2KzZhdi5INqp2YQnOwogICAgJExhbmctPnsnT3ZlcnZpZXcgb2YgJ30gPSAn2YbZhdin24wg2qnZhNuMINin2LInOwogICAgJExhbmctPnsnVGltZUFjY291bnRpbmcgb2YnfSA9ICfYrdiz2KfYqNiv2KfYsduMINiy2YXYp9mGINmF2LHYqNmI2Lcg2KjZhyc7CiAgICAkTGFuZy0+eydTdWNjZXNzZnVsIGluc2VydCEnfSA9ICfYqNinINmF2YjZgdmC24zYqiDYq9io2Kog2LTYryc7CiAgICAkTGFuZy0+eydNb3JlIGlucHV0IGZpZWxkcyd9ID0gJ9mB24zZhNiv2YfYp9uMINmI2LHZiNiv24wg2KjbjNi02KrYsSc7CiAgICAkTGFuZy0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0J30gPSAn2KLbjNinINmI2KfZgti52Kcg2YXYp9uM2YQg2KjZhyDYrdiw2YEg2KfbjNmGINmF2YjYsdivINmH2LPYqtuM2K/Ynyc7CiAgICAkTGFuZy0+eydDYW5cJ3QgaW5zZXJ0IFdvcmtpbmcgVW5pdHMhJ30gPSAn2LnYr9mFINiq2YjYp9mG2KfbjNuMINiv2LEg2KvYqNiqINmI2KfYrdiv2YfYp9uMINqp2KfYsduMJzsKICAgICRMYW5nLT57J0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgdGFzayEnfSA9ICfYqNmHINiv2YTbjNmEINmB2LHYp9mF2YjYtNuMINmI2LjbjNmB2YfYjCDYqtmG2LjbjNmF2KfYqiDYsNiu24zYsdmHINmG2YXbjOKAjNi02YjYryEnOwogICAgJExhbmctPnsnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2Ugb2YgbWlzc2luZyBwcm9qZWN0ISd9ID0gJ9io2Ycg2K/ZhNuM2YQg2YHYsdin2YXZiNi024wg2b7YsdmI2pjZh9iMINiq2YbYuNuM2YXYp9iqINiw2K7bjNix2Ycg2YbZhduM4oCM2LTZiNivISc7CiAgICAkTGFuZy0+eydDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSB0aGUgUGVyaW9kIGlzIGJpZ2dlciB0aGFuIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIFN0YXJ0dGltZSBhbmQgRW5kdGltZSEnfQogICAgICAgID0gJ9mG2YXbjOKAjNiq2YjYp9mGINiq2YbYuNuM2YXYp9iqINix2Kcg2LDYrtuM2LHZhyDaqdix2K8g2LLbjNix2Kcg2K/ZiNix2Ycg2LLZhdin2YbbjCDYp9iyINmF2YLYr9in2LEg2YjYsdmI2K/bjCDYqNuM2YYg2LPYp9i52Kog2KLYutin2LIg2Ygg2b7Yp9uM2KfZhiDYqNiy2LHar9iq2LEg2KfYs9iqISc7CiAgICAkTGFuZy0+eydDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBTdGFydHRpbWUgaXMgb2xkZXIgdGhhbiBFbmR0aW1lISd9CiAgICAgICAgPSAgJ9mG2YXbjOKAjNiq2YjYp9mGINiq2YbYuNuM2YXYp9iqINix2Kcg2LDYrtuM2LHZhyDaqdix2K8g2LLbjNix2Kcg2LLZhdin2YYg2LTYsdmI2Lkg2KjYudivINin2LIg2LLZhdin2YYg2b7Yp9uM2KfZhiDYp9iz2KohJzsKICAgICRMYW5nLT57J0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgcGVyaW9kISd9ID0gJ9mG2YXbjOKAjNiq2YjYp9mGINiq2YbYuNuM2YXYp9iqINix2Kcg2LDYrtuM2LHZhyDaqdix2K8g2LLbjNix2Kcg2K/ZiNix2Ycg2LLZhdin2YbbjCDZgdix2KfZhdmI2LQg2LTYr9mHINin2LPYqiEnOwogICAgJExhbmctPnsnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgUGVyaW9kIGlzIG5vdCBnaXZlbiEnfSA9ICfZhtmF24zigIzYqtmI2KfZhiDYqtmG2LjbjNmF2KfYqiDYsdinINiw2K7bjNix2Ycg2qnYsdivINiy24zYsdinINiv2YjYsdmHINiy2YXYp9mG24wg2K/Yp9iv2Ycg2YbYtNiv2Ycg2KfYs9iqISc7CiAgICAkTGFuZy0+eydBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiBzaWNrIGxlYXZlPyd9ID0gJ9ii24zYpyDYp9i32YXbjNmG2KfZhiDYr9in2LHbjNivINiv2LEg2LLZhdin2YbbjCDaqdmHINiv2LEg2LLZhdin2YYg2KfYs9iq2LnZhNin2KzbjCDYqNmI2K/bjNiv2Iwg2qnYp9ixINqp2LHYr9mH4oCM2KfbjNiv2J8nOwogICAgJExhbmctPnsnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IHdlcmUgb24gdmFjYXRpb24/J30gPSAn2KLbjNinINin2LfZhduM2YbYp9mGINiv2KfYsduM2K8g2K/YsSDYstmF2KfZhtuMINqp2Ycg2K/YsSDZhdix2K7YtduMINio2YjYr9uM2K/YjCDaqdin2LEg2qnYsdiv2YfigIzYp9uM2K/Ynyc7CiAgICAkTGFuZy0+eydBcmUgeW91IHN1cmUsIHRoYXQgeW91IHdvcmtlZCB3aGlsZSB5b3Ugd2VyZSBvbiBvdmVydGltZSBsZWF2ZT8nfSA9ICfYotuM2Kcg2KfYt9mF24zZhtin2YYg2K/Yp9ix24zYryDYr9ixINiy2YXYp9mG24wg2qnZhyDYr9ixINmF2KfYstin2K8g2KfYttin2YHZhyDaqdin2LHbjCDYqNmI2K/bjNiv2Iwg2qnYp9ixINqp2LHYr9mH4oCM2KfbjNiv2J8nOwogICAgJExhbmctPnsnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgYSBkYXkgaGFzIG9ubHkgMjQgaG91cnMhJ30gPSAn2YfYsSDYsdmI2LIg2YHZgti3INuy27Qg2LPYp9i52Kog2K/Yp9ix2K8hJzsKICAgICRMYW5nLT57J0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnfSA9ICfZiNin2K3Yr9mH2KfbjCDaqdin2LHbjCDZgtin2KjZhCDYrtiw2YEg2YbbjNiz2KohJzsKICAgICRMYW5nLT57J1BsZWFzZSBpbnNlcnQgeW91ciB3b3JraW5nIGhvdXJzISd9ID0gJ9mE2LfZgdinINiz2KfYudin2Kog2qnYp9ix24wg2K7ZiNivINix2Kcg2YjYp9ix2K8g2YbZhdin24zbjNivISc7CiAgICAkTGFuZy0+eydZb3UgaGF2ZSB0byBpbnNlcnQgYSBzdGFydCBhbmQgYW4gZW5kIHRpbWUgb3IgYSBwZXJpb2QnfSA9ICfYtNmF2Kcg2KjYp9uM2K8g24zYpyDbjNqpINiv2YjYsdmHINiy2YXYp9mG24wg2Ygg24zYpyDYstmF2KfZhiDYoti62KfYsiDZiCDZvtin24zYp9mGINmI2KfYsdivINmG2YXYp9uM24zYryEnOwogICAgJExhbmctPnsnWW91IGNhbiBvbmx5IHNlbGVjdCBvbmUgY2hlY2tib3ggZWxlbWVudCEnfSA9ICfYtNmF2Kcg2YHZgti3INmF24zigIzYqtmI2KfZhtuM2K8g24zaqSDar9iy24zZhtmHINix2Kcg2KfZhtiq2K7Yp9ioINmG2YXYp9uM24zYryEnOwogICAgJExhbmctPnsnRWRpdCB0aW1lIGFjY291bnRpbmcgcHJvamVjdCBzZXR0aW5ncyd9ID0gJ9mI24zYsdin24zYtCDYqtmG2LjbjNmF2KfYqiDYrdiz2KfYqNiv2KfYsduMINiy2YXYp9mGINm+2LHZiNqY2YcnOwogICAgJExhbmctPnsnUHJvamVjdCBzZXR0aW5ncyd9ID0gJ9iq2YbYuNuM2YXYp9iqINm+2LHZiNqY2YcnOwogICAgJExhbmctPnsnSWYgeW91IHNlbGVjdCAiTWlzY2VsbGFuZW91cyAobWlzYykiIHRoZSB0YXNrLCBwbGVhc2UgZXhwbGFpbiB0aGlzIGluIHRoZSByZW1hcmtzIGZpZWxkJ30gPQogICAgICAgICfYp9qv2LEg2YjYuNin24zZgSDZh9mF2LLZhdin2YYg2LHYpyDYp9mG2KrYrtin2Kgg2qnYsdiv24zYr9iMINmE2LfZgdinINiv2LEg2YHbjNmE2K/Zh9in24wg2KrYsNqp2LEg2KrZiNi224zYrSDYr9mH24zYryc7CiAgICAkTGFuZy0+eydQbGVhc2UgYWRkIGEgcmVtYXJrIHdpdGggbW9yZSB0aGFuIDggY2hhcmFjdGVycyEnfSA9ICfZhNi32YHYpyDYqtiw2qnYsduMINio2Kcg2KjbjNi0INin2LIg27gg2qnYp9ix2Kfaqdiq2LEg2KjbjNmB2LLYp9uM24zYryEnOwogICAgJExhbmctPnsnTW9uJ30gPSAn2K/ZiNi02YbYqNmHJzsKICAgICRMYW5nLT57J1R1ZSd9ID0gJ9iz2YfigIzYtNmG2KjZhyc7CiAgICAkTGFuZy0+eydXZWQnfSA9ICfahtmH2KfYsdi02YbYqNmHJzsKICAgICRMYW5nLT57J1RodSd9ID0gJ9m+2YbYrNi02YbYqNmHJzsKICAgICRMYW5nLT57J0ZyaSd9ID0gJ9is2YXYudmHJzsKICAgICRMYW5nLT57J1NhdCd9ID0gJ9i02YbYqNmHJzsKICAgICRMYW5nLT57J1N1bid9ID0gJ9uM2qnYtNmG2KjZhyc7CiAgICAkTGFuZy0+eydKYW51YXJ5J30gPSAn2pjYp9mG2YjbjNmHJzsKICAgICRMYW5nLT57J0ZlYnJ1YXJ5J30gPSAn2YHZiNix24zZhyc7CiAgICAkTGFuZy0+eydNYXJjaCd9ID0gJ9mF2KfYsdizJzsKICAgICRMYW5nLT57J0FwcmlsJ30gPSAnJzsKICAgICRMYW5nLT57J01heSd9ID0gJ9mF24wnOwogICAgJExhbmctPnsnSnVuZSd9ID0gJ9qY2YjYptmGJzsKICAgICRMYW5nLT57J0p1bHknfSA9ICfYrNmI2YTYp9uMJzsKICAgICRMYW5nLT57J0F1Z3VzdCd9ID0gJyc7CiAgICAkTGFuZy0+eydTZXB0ZW1iZXInfSA9ICcnOwogICAgJExhbmctPnsnT2N0b2Jlcid9ID0gJ9in2qnYqtio2LEnOwogICAgJExhbmctPnsnTm92ZW1iZXInfSA9ICcnOwogICAgJExhbmctPnsnRGVjZW1iZXInfSA9ICfYr9iz2KfZhdio2LEnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnT3ZlcnZpZXcnfSA9ICcnOwogICAgJExhbmctPnsnUHJvamVjdCB0aW1lIHJlcG9ydGluZyd9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZhdWx0IG5hbWUgZm9yIG5ldyBwcm9qZWN0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmYXVsdCBzdGF0dXMgZm9yIG5ldyBwcm9qZWN0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmYXVsdCBuYW1lIGZvciBuZXcgYWN0aW9ucy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmYXVsdCBzdGF0dXMgZm9yIG5ldyBhY3Rpb25zLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBzdGFuZGFyZCB3ZWVrbHkgaG91cnMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmF1bHQgc2V0dGluZyBmb3IgbGVhdmUgZGF5cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmYXVsdCBzZXR0aW5nIGZvciBvdmVydGltZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmYXVsdCBzZXR0aW5nIGZvciBkYXRlIHN0YXJ0Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZhdWx0IHNldHRpbmcgZm9yIGRhdGUgZW5kLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZhdWx0IHN0YXR1cyBmb3IgbmV3IHVzZXJzLid9ID0gJyc7CiAgICAkTGFuZy0+eydNYXhpbXVtIG51bWJlciBvZiB3b3JraW5nIGRheXMgYWZ0ZXIgd2hpY2ggdGhlIHdvcmtpbmcgdW5pdHMgaGF2ZSB0byBiZSBpbnNlcnRlZC4nfSA9ICcnOwogICAgJExhbmctPnsnTWF4aW11bSBudW1iZXIgb2Ygd29ya2luZyBkYXlzIHdpdGhvdXRoIHdvcmtpbmcgdW5pdHMgZW50cnkgYWZ0ZXIgd2hpY2ggYSB3YXJuaW5nIHdpbGwgYmUgc2hvd24uJ30gPSAnJzsKICAgICRMYW5nLT57J1RoaXMgbm90aWZpY2F0aW9uIG1vZHVsZSBnaXZlcyBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGluY29tcGxldGUgd29ya2luZyBkYXlzLid9ID0gJyc7CiAgICAkTGFuZy0+eydGb3IgaG93IG1hbnkgZGF5cyBhZ28geW91IGNhbiBpbnNlcnQgd29ya2luZyB1bml0cy4nfSA9ICcnOwogICAgJExhbmctPnsnVG8gdXNlIGlmIHNvbWUgYWN0aW9ucyByZWR1Y2VkIHRoZSB3b3JraW5nIGhvdXJzIChmb3IgZXhhbXBsZSwgaWYgb25seSBoYWxmIG9mIHRoZSB0cmF2ZWxpbmcgdGltZSBpcyBwYWlkIEtleSA9Jmd0OyB0cmF2ZWxpbmc7IENvbnRlbnQgPSZndDsgNTApLid9CiAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyBpZiB3b3JraW5nIGhvdXJzIGNhbiBiZSBpbnNlcnRlZCB3aXRob3V0IHN0YXJ0IGFuZCBlbmQgdGltZXMuJ30gPSAnJzsKICAgICRMYW5nLT57J1RoaXMgbW9kdWxlIGZvcmNlcyBpbnNlcnRzIGluIFRpbWVBY2NvdW50aW5nLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBwcm9qZWN0cyBmb3Igd2hpY2ggYSByZW1hcmsgaXMgcmVxdWlyZWQuIElmIHRoZSBSZWdFeHAgbWF0Y2hlcyBvbiB0aGUgcHJvamVjdCwgeW91IGhhdmUgdG8gaW5zZXJ0IGEgcmVtYXJrIHRvby4gVGhlIFJlZ0V4cCB1c2UgdGhlIHNteCBwYXJhbWV0ZXIuJ30KICAgICAgICA9ICcnOwogICAgJExhbmctPnsnUmVndWxhciBleHByZXNzaW9ucyBmb3IgY29uc3RyYWluaW5nIHByb2plY3QgbGlzdCBhY2NvcmRpbmcgdG8gdXNlciBncm91cHMuIEtleSBjb250YWlucyByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHByb2plY3QocyksIGNvbnRlbnQgY29udGFpbnMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZ3JvdXBzLid9CiAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J1JlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGNvbnN0cmFpbmluZyBhY3Rpb24gbGlzdCBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgcHJvamVjdC4gS2V5IGNvbnRhaW5zIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgcHJvamVjdChzKSwgY29udGVudCBjb250YWlucyByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBhY3Rpb24ocykuJ30KICAgICAgICA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGltZUFjY291bnRpbmcucG0gLSB0aW1lIGFjY291bnRpbmcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTEgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nLnBtLHYgMS40MS4yLjEgMjAxMS0wNS0xMCAxODo0MjoyNSBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwp1c2UgRGF0ZTo6UGNhbGMgcXcoVG9kYXkgRGF5c19pbl9Nb250aCBEYXlfb2ZfV2VlayBBZGRfRGVsdGFfWU1EKTsKdXNlIFRpbWU6OkxvY2FsOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40MS4yLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IE1vZHVsZVJlZyBMb2dPYmplY3QgVXNlck9iamVjdAogICAgICAgIENvbmZpZ09iamVjdCBUaWNrZXRPYmplY3QgVGltZU9iamVjdCBHcm91cE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApIGlmICEkU2VsZi0+eyRffTsKICAgIH0KCiAgICAjIGNyZWF0ZSByZXF1aXJlZCBvYmplY3RzLi4uCiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgIHJldHVybiAxIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkgKTsKCiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkVXNlcnsgJFNlbGYtPntVc2VySUR9IH07CgogICAgbXkgJUluY29tcGxldGVXb3JraW5nRGF5cyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKCk7CgogICAgIyByZWRpcmVjdCBpZiBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBvdXQgb2YgcmFuZ2UKICAgIGlmICgKICAgICAgICAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0VuZm9yY2VJbnNlcnR9CiAgICAgICAgJiYgJFNlbGYtPntBY3Rpb259IG5lICdBZ2VudFRpbWVBY2NvdW50aW5nJwogICAgICAgICYmICRTZWxmLT57QWN0aW9ufSBuZSAnQWdlbnRDYWxlbmRhclNtYWxsJwogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gJ0FjdGlvbj1BZ2VudFRpbWVBY2NvdW50aW5nJlN1YmFjdGlvbj1FZGl0JwogICAgICAgICk7CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATW9udGhBcnJheSA9ICgKICAgICAgICAnJywgICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgICAgICdBcHJpbCcsICAgJ01heScsCiAgICAgICAgJ0p1bmUnLCAnSnVseScsICAgICdBdWd1c3QnLCAgICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsCiAgICAgICAgJ0RlY2VtYmVyJywKICAgICk7CiAgICBteSBAV2Vla2RheUFycmF5ID0gKCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnLCAnU3VuJywgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgdGhlIHRpbWUgYWNjb3VudGluZyBlbGVtZW50cyBvZiBvbmUgZGF5CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZWxldGUnICkgKSB7CiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIChxdyhTdGF0dXMgWWVhciBNb250aCBEYXkpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIERhdGUKICAgICAgICBpZiAoICEkUGFyYW17WWVhcn0gfHwgISRQYXJhbXtNb250aH0gfHwgISRQYXJhbXtEYXl9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSAkRGF5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte1llYXJ9ICk7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKICAgICAgICAgICAgJFBhcmFte0RheX0gICA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte0RheX0gKTsKICAgICAgICB9CgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ0RlbGV0ZScgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdEZWxldGUnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdCB0aGUgdGltZSBhY2NvdW50aW5nIGVsZW1lbnRzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXQnICkgewoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgICAgIG15ICVGcm9udGVuZCAgID0gKCk7CiAgICAgICAgbXkgJURhdGEgICAgICAgPSAoKTsKICAgICAgICBteSAlQWN0aW9uTGlzdCA9ICRTZWxmLT5fQWN0aW9uTGlzdCgpOwogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIGZvciAocXcoU3RhdHVzIFllYXIgTW9udGggRGF5KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9IHx8ICEkUGFyYW17RGF5fSApIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9ICRZZWFyOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gJE1vbnRoOwogICAgICAgICAgICAkUGFyYW17RGF5fSAgID0gJERheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtZZWFyfSAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtZZWFyfSApOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgICAgICRQYXJhbXtEYXl9ICAgPSBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtEYXl9ICk7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICAjIGZvciBpbml0aWFsIHVzZWluZywgdGhlIGZpcnN0IGFnZW50IHdpdGggcnctcmlnaHQgd2lsbCBiZSByZWRpcmVjdGVkCiAgICAgICAgIyB0byAnU2V0dGluZycuIFRoZW4gaGUgY2FuIGRvIHRoZSBpbml0aWFsIHNldHRpbmdzCiAgICAgICAgaWYgKCAhJFVzZXJ7ICRTZWxmLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9GaXJzdFVzZXJSZWRpcmVjdCgpOwogICAgICAgIH0KCiAgICAgICAgbXkgJUluY29tcGxldGVXb3JraW5nRGF5cyA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKCk7CiAgICAgICAgbXkgJE1heEFsbG93ZWRJbnNlcnREYXlzCiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpNYXhBbGxvd2VkSW5zZXJ0RGF5cycpIHx8ICcxMCc7CiAgICAgICAgKCAkUGFyYW17WWVhckFsbG93ZWR9LCAkUGFyYW17TW9udGhBbGxvd2VkfSwgJFBhcmFte0RheUFsbG93ZWR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkWWVhciwgJE1vbnRoLCAkRGF5LCAwLCAwLCAtJE1heEFsbG93ZWRJbnNlcnREYXlzICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICB0aW1lbG9jYWwoIDEsIDAsIDAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCApIDwgdGltZWxvY2FsKAogICAgICAgICAgICAgICAgMSwgMCwgMCwgJFBhcmFte0RheUFsbG93ZWR9LAogICAgICAgICAgICAgICAgJFBhcmFte01vbnRoQWxsb3dlZH0gLSAxLAogICAgICAgICAgICAgICAgJFBhcmFte1llYXJBbGxvd2VkfSAtIDE5MDAKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXsgJFBhcmFte1llYXJ9IH17ICRQYXJhbXtNb250aH0gfQogICAgICAgICAgICAgICAgeyAkUGFyYW17RGF5fSB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1WaWV3JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9IgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1FZGl0JlllYXI9JFBhcmFte1llYXJ9Jk1vbnRoPSRQYXJhbXtNb250aH0mRGF5PSRQYXJhbXtEYXl9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICAoICRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIC0xICk7CiAgICAgICAgKCAkUGFyYW17WWVhck5leHR9LCAkUGFyYW17TW9udGhOZXh0fSwgJFBhcmFte0RheU5leHR9ICkKICAgICAgICAgICAgPSBBZGRfRGVsdGFfWU1EKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9LCAwLCAwLCAxICk7CgogICAgICAgIG15ICRSZWR1Y2VUaW1lUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpSZWR1Y2VUaW1lJyk7CgogICAgICAgICMgRWRpdCBXb3JraW5nIFVuaXRzCiAgICAgICAgaWYgKCAkUGFyYW17U3RhdHVzfSApIHsKCiAgICAgICAgICAgIElEOgogICAgICAgICAgICBmb3IgbXkgJElEICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoUHJvamVjdElEIEFjdGlvbklEIFJlbWFyayBTdGFydFRpbWUgRW5kVGltZSBQZXJpb2QpKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkSUQgLiAnXScgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkUGFyYW17UHJvamVjdElEfSAmJiAhJFBhcmFte0FjdGlvbklEfTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhIHZhbGlkIHBlcmlvZAogICAgICAgICAgICAgICAgbXkgJFBlcmlvZCA9ICRQYXJhbXtQZXJpb2R9OwogICAgICAgICAgICAgICAgaWYgKCAkUGVyaW9kID1+IC9eKFxkKyksKFxkKykvICkgewogICAgICAgICAgICAgICAgICAgICRQZXJpb2QgPSAkMSAuICIuIiAuICQyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICNhbGxvdyBmb3JtYXQgaGg6bW0KICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte1BlcmlvZH0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBlcmlvZCA9ICQxICsgJDIgLyA2MDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAlV29ya2luZ1VuaXQgPSAoCiAgICAgICAgICAgICAgICAgICAgUHJvamVjdElEID0+ICRQYXJhbXtQcm9qZWN0SUR9LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbklEICA9PiAkUGFyYW17QWN0aW9uSUR9LAogICAgICAgICAgICAgICAgICAgIFJlbWFyayAgICA9PiAkUGFyYW17UmVtYXJrfSwKICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICBQZXJpb2QgICAgPT4gJFBlcmlvZCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAeyAkRGF0YXtXb3JraW5nVW5pdHN9IH0sIFwlV29ya2luZ1VuaXQ7CgogICAgICAgICAgICAgICAgI2lmICgkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gJiYgISRQYXJhbXtQZXJpb2R9KSB7CiAgICAgICAgICAgICAgICAjb3ZlcndyaXRlIFBlcmlvZCB3aGVuIFN0YXJ0IGFuZCBFbmR0aW1lIGlzIGdpdmVuLi4uCiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkUGFyYW17U3RhcnRUaW1lfSB8fCAhJFBhcmFte0VuZFRpbWV9OwoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSA9fiAvXihcZCspOihcZCspLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkMSAqIDYwICsgJDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFJlZHVjZVRpbWVSZWYtPnsgJEFjdGlvbkxpc3R7ICRQYXJhbXtBY3Rpb25JRH0gfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtpbmdVbml0e1BlcmlvZH0gPSAoICRFbmRUaW1lIC0gJFN0YXJ0VGltZSApIC8gNjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICRSZWR1Y2VUaW1lUmVmLT57ICRBY3Rpb25MaXN0eyAkUGFyYW17QWN0aW9uSUR9IH0gfSAvIDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRXb3JraW5nVW5pdHtQZXJpb2R9ID0gKCAkRW5kVGltZSAtICRTdGFydFRpbWUgKSAvIDYwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ2hlY2tib3hDaGVjayA9IDA7CiAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoTGVhdmVEYXkgU2ljayBPdmVydGltZSkpIHsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEVsZW1lbnQgKTsKICAgICAgICAgICAgICAgIGlmICgkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskRWxlbWVudH0gPSAxOwogICAgICAgICAgICAgICAgICAgICRDaGVja2JveENoZWNrKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ2hlY2tib3hDaGVjayA+IDEgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWREZXNjcmlwdGlvbn0gPSAnWW91IGNhbiBvbmx5IHNlbGVjdCBvbmUgY2hlY2tib3ggZWxlbWVudCEnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGF0YXtZZWFyfSAgPSAkUGFyYW17WWVhcn07CiAgICAgICAgICAgICREYXRhe01vbnRofSA9ICRQYXJhbXtNb250aH07CiAgICAgICAgICAgICREYXRhe0RheX0gICA9ICRQYXJhbXtEYXl9OwoKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0luc2VydCglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IFdvcmtpbmcgVW5pdHMhJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgU2hvdyBXb3JraW5nIFVuaXRzCiAgICAgICAgIyBnZXQgZXhpc3Rpbmcgd29ya2luZyB1bml0cwogICAgICAgICVEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6SW5wdXRIb3Vyc1dpdGhvdXRTdGFydEVuZFRpbWUnKSApIHsKICAgICAgICAgICAgJFBhcmFte1RleHRQb3NpdGlvbn0gID0gJ2xlZnQnOwogICAgICAgICAgICAkUGFyYW17UGVyaW9kQmxvY2t9ICAgPSAnVW5pdElucHV0UGVyaW9kJzsKICAgICAgICAgICAgJEZyb250ZW5ke0NsYXNzVGltZX0gID0gJ2Zvb3Rub3RlJzsKICAgICAgICAgICAgJEZyb250ZW5ke1BlcmlvZE5vdGV9ID0gJyonOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRm9vdE5vdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17VGV4dFBvc2l0aW9ufSAgPSAncmlnaHQnOwogICAgICAgICAgICAkUGFyYW17UGVyaW9kQmxvY2t9ICAgPSAnVW5pdFBlcmlvZFdpdGhvdXRJbnB1dCc7CiAgICAgICAgICAgICRGcm9udGVuZHtDbGFzc1RpbWV9ICA9ICdyZXF1aXJlZCc7CiAgICAgICAgICAgICRGcm9udGVuZHtQZXJpb2ROb3RlfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCB0aW1lKCkgPiB0aW1lbG9jYWwoIDEsIDAsIDAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCApICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdEJsb2NrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2ljaywgbGVhdmUgZGF5IGFuZCBvdmVydGltZQogICAgICAgICRQYXJhbXtTaWNrfSAgICAgPSAkRGF0YXtTaWNrfSAgICAgPyAnY2hlY2tlZCcgOiAnJzsKICAgICAgICAkUGFyYW17TGVhdmVEYXl9ID0gJERhdGF7TGVhdmVEYXl9ID8gJ2NoZWNrZWQnIDogJyc7CiAgICAgICAgJFBhcmFte092ZXJ0aW1lfSA9ICREYXRhe092ZXJ0aW1lfSA/ICdjaGVja2VkJyA6ICcnOwoKICAgICAgICAkUGFyYW17VG90YWx9ID0gJERhdGF7VG90YWx9OwoKICAgICAgICAjIHNldCBhY3Rpb24gbGlzdCBhbmQgcmVsYXRlZCBjb25zdHJhaW50cwogICAgICAgICMgZ2VuZXJhdGUgYSBKYXZhU2NyaXB0IEFycmF5IHdoaWNoIHdpbGwgYmUgb3V0cHV0IHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgIG15IEBBY3Rpb25JRHMgPSBzb3J0IHsgJEFjdGlvbkxpc3R7JGF9IGNtcCAkQWN0aW9uTGlzdHskYn0gfSBrZXlzICVBY3Rpb25MaXN0OwogICAgICAgIG15IEBKU0FjdGlvbnM7CiAgICAgICAgZm9yZWFjaCBteSAkQWN0aW9uSUQgKEBBY3Rpb25JRHMpIHsKICAgICAgICAgICAgcHVzaCBASlNBY3Rpb25zLCAiWyckQWN0aW9uSUQnLCAnJEFjdGlvbkxpc3R7JEFjdGlvbklEfSddIjsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0pTQWN0aW9uTGlzdH0gPSAnWycgLiAoIGpvaW4gJywgJywgQEpTQWN0aW9ucyApIC4gJ10nOwoKICAgICAgICBteSAkQWN0aW9uTGlzdENvbnN0cmFpbnRzCiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpBY3Rpb25MaXN0Q29uc3RyYWludHMnKTsKICAgICAgICBteSBASlNBY3Rpb25MaXN0Q29uc3RyYWludHM7CiAgICAgICAgZm9yIG15ICRQcm9qZWN0TmFtZVJlZ0V4cCAoIGtleXMgJXskQWN0aW9uTGlzdENvbnN0cmFpbnRzfSApIHsKICAgICAgICAgICAgbXkgJEFjdGlvbk5hbWVSZWdFeHAgPSAkQWN0aW9uTGlzdENvbnN0cmFpbnRzLT57JFByb2plY3ROYW1lUmVnRXhwfTsKICAgICAgICAgICAgc3soWyciXFxdKX17XFwkMX1zbXhnIGZvciAoICRQcm9qZWN0TmFtZVJlZ0V4cCwgJEFjdGlvbk5hbWVSZWdFeHAgKTsKICAgICAgICAgICAgcHVzaCBASlNBY3Rpb25MaXN0Q29uc3RyYWludHMsICJbJyRQcm9qZWN0TmFtZVJlZ0V4cCcsICckQWN0aW9uTmFtZVJlZ0V4cCddIjsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0pTQWN0aW9uTGlzdENvbnN0cmFpbnRzfSA9ICdbJyAuICggam9pbiAnLCAnLCBASlNBY3Rpb25MaXN0Q29uc3RyYWludHMgKSAuICddJzsKCiAgICAgICAgIyBidWlsZCBhIHdvcmtpbmcgdW5pdCBhcnJheQogICAgICAgIG15IEBVbml0cyA9ICh1bmRlZik7CiAgICAgICAgaWYgKCAkRGF0YXtXb3JraW5nVW5pdHN9ICkgewogICAgICAgICAgICBwdXNoIEBVbml0cywgQHsgJERhdGF7V29ya2luZ1VuaXRzfSB9CiAgICAgICAgfQoKICAgICAgICBteSAkU2hvd0FsbElucHV0RmllbGRzID0gc2NhbGFyIEBVbml0cyA+IDkgPyAxIDogMDsKCiAgICAgICAgIyBidWlsZCB1bml0cwogICAgICAgICRQYXJhbXsiSlNQcm9qZWN0TGlzdCJ9ID0gInZhciBKU1Byb2plY3RMaXN0ID0gbmV3IEFycmF5KCk7XG4iOwogICAgICAgIGZvciBteSAkSUQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAkUGFyYW17SUR9ID0gJElEOwogICAgICAgICAgICBteSAkVW5pdFJlZiA9ICRVbml0c1skSURdOwoKICAgICAgICAgICAgIyBnZXQgZGF0YSBvZiBwcm9qZWN0cwogICAgICAgICAgICBteSAkUHJvamVjdExpc3QgPSAkU2VsZi0+X1Byb2plY3RMaXN0KAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkVW5pdFJlZi0+e1Byb2plY3RJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17UHJvamVjdElEfSA9ICRVbml0UmVmLT57UHJvamVjdElEfSB8fCAnJzsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3ROYW1lfSA9ICcnOwoKICAgICAgICAgICAgIyBnZW5lcmF0ZSBKYXZhU2NyaXB0IGFycmF5IHdoaWNoIHdpbGwgYmUgb3V0cHV0IHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgICAgICBteSBASlNQcm9qZWN0TGlzdDsKICAgICAgICAgICAgZm9yIG15ICRQcm9qZWN0ICggQHskUHJvamVjdExpc3R9ICkgewoKICAgICAgICAgICAgICAgIG15ICRQcm9qZWN0Tm1hbWUgPSAkUHJvamVjdC0+e1ZhbHVlfTsKICAgICAgICAgICAgICAgICRQcm9qZWN0Tm1hbWUgPX4gc3tbJ119e1xcJ31neG1zOwoKICAgICAgICAgICAgICAgIHB1c2ggQEpTUHJvamVjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgJ3tpZDonIC4gKCAkUHJvamVjdC0+e0tleX0gfHwgJzAnICkgLiAnICwgbmFtZTpcJycgLiAkUHJvamVjdE5tYW1lIC4gJ1wnfSc7CiAgICAgICAgICAgICAgICBpZiAoICRQcm9qZWN0LT57S2V5fSBlcSAkUGFyYW17UHJvamVjdElEfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdE5hbWV9ID0gJFByb2plY3QtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFteyJKU1Byb2plY3RMaXN0In0KICAgICAgICAgICAgICAgIC49ICJKU1Byb2plY3RMaXN0WyRJRF0gPSBbIiAuICggam9pbiAnLCAnLCBASlNQcm9qZWN0TGlzdCApIC4gIl07XG4iOwoKICAgICAgICAgICAgIyBQcm9qZWN0T3B0aW9uIHdpbGwgbm90IGJlIHVzZWQgYW55IG1vcmUgd2hlbiBwcm9qZWN0IGF1dG9jb21wbGV0aW9uIGlzIGRvbmUKICAgICAgICAgICAgJEZyb250ZW5ke1Byb2plY3RPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRQcm9qZWN0TGlzdCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJQcm9qZWN0SURbJElEXSIsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAoKICAgICAgICAgICAgICAgICNNYXggICAgICAgID0+IDYyLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1Byb2plY3RTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgT25DaGFuZ2UgPT4gIkZpbGxBY3Rpb25MaXN0KCRJRCk7IiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWN0aW9uIGxpc3QgaW5pdGlhbGx5IG9ubHkgY29udGFpbnMgZW1wdHkgYW5kIHNlbGVjdGVkIGVsZW1lbnQgYXMgd2VsbCBhcwogICAgICAgICAgICAjIGVsZW1lbnRzIGNvbmZpZ3VyZWQgZm9yIHNlbGVjdGVkIHByb2plY3QgaWYgbm8gY29uc3RyYWludHMgYXJlIGNvbmZpZ3VyZWQsCiAgICAgICAgICAgICMgYWxsIGFjdGlvbnMgd2lsbCBiZSBkaXNwbGF5ZWQKICAgICAgICAgICAgbXkgJEFjdGlvbkRhdGEgPSAkU2VsZi0+X0FjdGlvbkxpc3RDb25zdHJhaW50cygKICAgICAgICAgICAgICAgIFByb2plY3RJRCAgICAgICAgICAgICA9PiAkVW5pdFJlZi0+e1Byb2plY3RJRH0sCiAgICAgICAgICAgICAgICBQcm9qZWN0TGlzdCAgICAgICAgICAgPT4gJFByb2plY3RMaXN0LAogICAgICAgICAgICAgICAgQWN0aW9uTGlzdCAgICAgICAgICAgID0+IFwlQWN0aW9uTGlzdCwKICAgICAgICAgICAgICAgIEFjdGlvbkxpc3RDb25zdHJhaW50cyA9PiAkQWN0aW9uTGlzdENvbnN0cmFpbnRzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkQWN0aW9uRGF0YS0+eycnfSA9ICcnOwogICAgICAgICAgICBpZiAoICRVbml0UmVmLT57QWN0aW9uSUR9ICYmICRBY3Rpb25MaXN0eyAkVW5pdFJlZi0+e0FjdGlvbklEfSB9ICkgewogICAgICAgICAgICAgICAgJEFjdGlvbkRhdGEtPnsgJFVuaXRSZWYtPntBY3Rpb25JRH0gfSA9ICRBY3Rpb25MaXN0eyAkVW5pdFJlZi0+e0FjdGlvbklEfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRnJvbnRlbmR7QWN0aW9uT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCgogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJEFjdGlvbkRhdGEsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkVW5pdFJlZi0+e0FjdGlvbklEfSB8fCAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJBY3Rpb25JRFskSURdIiwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQWN0aW9uU2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtSZW1hcmt9ID0gJFVuaXRSZWYtPntSZW1hcmt9IHx8ICcnOwogICAgICAgICAgICBpZiAoICRVbml0UmVmLT57UHJvamVjdElEfSAmJiAkVW5pdFJlZi0+e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFVuaXRSZWYtPntQZXJpb2R9ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHBlcmlvZCEnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkUGVyaW9kID0gJFVuaXRSZWYtPntQZXJpb2R9IHx8ICcnOwoKICAgICAgICAgICAgZm9yIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSAhJFVuaXRSZWYtPnskX30gfHwgJFVuaXRSZWYtPnskX30gZXEgJzAwOjAwJyA/ICcnIDogJFVuaXRSZWYtPnskX307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRGVmaW5lIGlmIHRoZSBpbnB1dCBmaWVsZHMgYXJlIHZpc2libGUgb3Igbm90CiAgICAgICAgICAgICRQYXJhbXtWaXNpYmlsaXR5fSA9ICRTaG93QWxsSW5wdXRGaWVsZHMgfHwgJElEIDwgOSA/ICd2aXNpYmxlJyA6ICdjb2xsYXBzZSc7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtQZXJpb2RCbG9ja30sCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUZXh0UG9zaXRpb24gPT4gJFBhcmFte1RleHRQb3NpdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgUGVyaW9kICAgICAgID0+ICRQZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFZhbGlkaXR5IGNoZWNrcyBzdGFydAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkVW5pdFJlZi0+e1Byb2plY3RJRH0KICAgICAgICAgICAgICAgICYmICRVbml0UmVmLT57QWN0aW9uSUR9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17U2lja30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IHdlcmUgb24gc2ljayBsZWF2ZT8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRVbml0UmVmLT57UHJvamVjdElEfQogICAgICAgICAgICAgICAgJiYgJFVuaXRSZWYtPntBY3Rpb25JRH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtMZWF2ZURheX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgd2hpbGUgeW91IHdlcmUgb24gdmFjYXRpb24/JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkVW5pdFJlZi0+e1Byb2plY3RJRH0KICAgICAgICAgICAgICAgICYmICRVbml0UmVmLT57QWN0aW9uSUR9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17T3ZlcnRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWFkT25seURlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgID0gJ0FyZSB5b3Ugc3VyZSwgdGhhdCB5b3Ugd29ya2VkIHdoaWxlIHlvdSB3ZXJlIG9uIG92ZXJ0aW1lIGxlYXZlPyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkVW5pdFJlZi0+e1Byb2plY3RJRH0gJiYgISRVbml0UmVmLT57QWN0aW9uSUR9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufQogICAgICAgICAgICAgICAgICAgID0gJ0NhblwndCBzYXZlIHNldHRpbmdzLCBiZWNhdXNlIG9mIG1pc3NpbmcgdGFzayEnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRVbml0UmVmLT57UHJvamVjdElEfSAmJiAkVW5pdFJlZi0+e0FjdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtaXNzaW5nIHByb2plY3QhJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkVW5pdFJlZi0+e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICYmICRVbml0UmVmLT57U3RhcnRUaW1lfSBuZSAnMDA6MDAnCiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e0VuZFRpbWV9CiAgICAgICAgICAgICAgICAmJiAkVW5pdFJlZi0+e0VuZFRpbWV9IG5lICcwMDowMCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkVW5pdFJlZi0+e1N0YXJ0VGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICQxICogNjAgKyAkMjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRVbml0UmVmLT57RW5kVGltZX0gPX4gL14oXGQrKTooXGQrKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJDEgKiA2MCArICQyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVW5pdFJlZi0+e1BlcmlvZH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gKCAkRW5kVGltZSAtICRTdGFydFRpbWUgKSAvIDYwICsgMC4wMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgdGhlIFBlcmlvZCBpcyBiaWdnZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnIHRoYW4gdGhlIGludGVydmFsIGJldHdlZW4gU3RhcnR0aW1lIGFuZCBFbmR0aW1lISc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA+IDYwICogMjQgfHwgJFN0YXJ0VGltZSA+IDYwICogMjQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2FuXCd0IHNhdmUgc2V0dGluZ3MsIGJlY2F1c2UgYSBkYXkgaGFzIG9ubHkgMjQgaG91cnMhJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVbml0UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBEZXNjcmlwdGlvbiA9PiAkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb259IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUkVNQVJLOiBkb24ndCBkZWxldGUgYWxsIHdvcmtpbmcgdW5pdHMKICAgICAgICAgICAgICAgICMgUkVNQVJLOiBiZXR0ZXIgd291bGQgYmUgdG8gZGVsZXRlIG9ubHkgaW5jb21wbGV0ZSB3b3JraW5nIHVuaXRzCiAgICAgICAgICAgICAgICAjaWYgKAogICAgICAgICAgICAgICAgIyAgICAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgICMgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgICMgICAgICAgIE1vbnRoID0+ICRQYXJhbXtNb250aH0sCiAgICAgICAgICAgICAgICAjICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgICMgICAgKQogICAgICAgICAgICAgICAgIyAgICApCiAgICAgICAgICAgICAgICAjewogICAgICAgICAgICAgICAgIyAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICMgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBkZWxldGUgV29ya2luZyBVbml0cyEnCiAgICAgICAgICAgICAgICAjICAgICk7CiAgICAgICAgICAgICAgICAjfQogICAgICAgICAgICAgICAgJFBhcmFte1VuaXRSZXF1aXJlZERlc2NyaXB0aW9ufSAgICAgPSAnJzsKICAgICAgICAgICAgICAgICRQYXJhbXtVbml0UmVxdWlyZWREZXNjcmlwdGlvblRydWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtVbml0UmVhZE9ubHlEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VuaXRSZWFkb25seScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IERlc2NyaXB0aW9uID0+ICRQYXJhbXtVbml0UmVhZE9ubHlEZXNjcmlwdGlvbn0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17VW5pdFJlYWRPbmx5RGVzY3JpcHRpb259ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVmFsaWRpdHkgY2hlY2tzIGVuZAoKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgID4gdGltZWxvY2FsKCAxLCAwLCAwLCAkUGFyYW17RGF5fSwgJFBhcmFte01vbnRofSAtIDEsICRQYXJhbXtZZWFyfSAtIDE5MDAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17VG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWx9ICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUb3RhbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdmFsaWRpdHkgY2hlY2tzIHN0YXJ0CiAgICAgICAgaWYgKCAkUGFyYW17VG90YWx9ICYmICRQYXJhbXtUb3RhbH0gPiAyNCApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICA9ICdDYW5cJ3Qgc2F2ZSBzZXR0aW5ncywgYmVjYXVzZSBvZiBtb3JlIHRoYW4gMjQgd29ya2luZyBob3VycyEnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtUb3RhbH0gJiYgJFBhcmFte1RvdGFsfSA+IDE2ICkgewogICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gPSAnQXJlIHlvdSBzdXJlLCB0aGF0IHlvdSB3b3JrZWQgbW9yZSB0aGFuIDE2IGhvdXJzPyc7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IERlc2NyaXB0aW9uID0+ICRQYXJhbXtSZXF1aXJlZERlc2NyaXB0aW9ufSB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17UmVhZE9ubHlEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWFkb25seScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgRGVzY3JpcHRpb24gPT4gJFBhcmFte1JlYWRPbmx5RGVzY3JpcHRpb259IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHZhbGlkaXR5IGNoZWNrcyBlbmQKCiAgICAgICAgJFBhcmFte0RhdGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICcnLAogICAgICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICB0aW1lbG9jYWwoIDEsIDAsIDAsICRQYXJhbXtEYXl9LCAkUGFyYW17TW9udGh9IC0gMSwgJFBhcmFte1llYXJ9IC0gMTkwMCApIDwgdGltZWxvY2FsKAogICAgICAgICAgICAgICAgMSwgMCwgMCwgJFBhcmFte0RheUFsbG93ZWR9LAogICAgICAgICAgICAgICAgJFBhcmFte01vbnRoQWxsb3dlZH0gLSAxLAogICAgICAgICAgICAgICAgJFBhcmFte1llYXJBbGxvd2VkfSAtIDE5MDAKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyAkUGFyYW17WWVhcn0gfXsgJFBhcmFte01vbnRofSB9eyAkUGFyYW17RGF5fSB9CiAgICAgICAgICAgICAgICAmJiAhJFBhcmFte1N1Y2Nlc3NmdWxJbnNlcnR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgRGF0ZSBpcyBvdXQgb2YgbGltaXQsIGJ1dCB5b3UgaGF2ZW5cJ3QgaW5zZXJ0IHRoaXMgZGF5IHlldCwgc28geW91IGdldCBvbmUoISkgY2hhbmNlIHRvIGluc2VydCcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFllYXJJRCAoIHNvcnQga2V5cyAleyAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9IH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkTW9udGhJRCAoIHNvcnQga2V5cyAleyAkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0luY29tcGxldGV9eyRZZWFySUR9IH0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJERheUlEICgKICAgICAgICAgICAgICAgICAgICBzb3J0IGtleXMgJXsgJEluY29tcGxldGVXb3JraW5nRGF5c3tJbmNvbXBsZXRlfXskWWVhcklEfXskTW9udGhJRH0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17SW5jb21wbGV0ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0luY29tcGxldGVUZXh0JywgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJEJvbGRTdGFydCA9ICcnOwogICAgICAgICAgICAgICAgICAgIG15ICRCb2xkRW5kICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRZZWFySUQgICAgIGVxICRQYXJhbXtZZWFyfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkTW9udGhJRCBlcSAkUGFyYW17TW9udGh9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICREYXlJRCAgIGVxICRQYXJhbXtEYXl9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb2xkU3RhcnQgPSAnPGI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgJEJvbGRFbmQgICA9ICc8L2I+JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luY29tcGxldGVXb3JraW5nRGF5cycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgICAgID0+ICRZZWFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb250aCAgICAgPT4gJE1vbnRoSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgICAgPT4gJERheUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9sZFN0YXJ0ID0+ICRCb2xkU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2xkRW5kICAgPT4gJEJvbGRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17SW5jb21wbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgIFllYXIgICAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggICAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgICAgPT4gJFBhcmFte0RheX0sCiAgICAgICAgICAgIENhbGVuZGFyID0+ICRVc2VyRGF0YXtDYWxlbmRhcn0sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte1dlZWtkYXl9ID0gRGF5X29mX1dlZWsoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKICAgICAgICBpZiAoICRQYXJhbXtXZWVrZGF5fSAhPSA2ICYmICRQYXJhbXtXZWVrZGF5fSAhPSA3ICYmICEkVmFjYXRpb25DaGVjayApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ090aGVyVGltZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbICRQYXJhbXtXZWVrZGF5fSAtIDEgXTsKCiAgICAgICAgIyBpbnRlZ3JhdGUgdGhlIGhhbmRsaW5nIGZvciByZXF1aXJlZCByZW1hcmtzIGluIHJlbGF0aW9uIHRvCiAgICAgICAgIyBwcm9qZWN0cwogICAgICAgICRQYXJhbXtSZW1hcmtSZWdFeHB9ID0gJFNlbGYtPl9Qcm9qZWN0MlJlbWFya1JlZ0V4cCgpOwoKICAgICAgICAkUGFyYW17TGlua1Zpc2liaWxpdHl9ID0gJFNob3dBbGxJbnB1dEZpZWxkcyA/ICdjb2xsYXBzZScgOiAndmlzaWJsZSc7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUaXRsZSA9PiAnRWRpdCcgKTsKICAgICAgICBpZiAoICEkSW5jb21wbGV0ZVdvcmtpbmdEYXlze0VuZm9yY2VJbnNlcnR9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgY3JlYXRlIHByb2plY3QgbGluaywgaWYgYWxsb3dlZAogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFVzZXJEYXRhe0NyZWF0ZVByb2plY3R9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnQ3JlYXRlUHJvamVjdCcsICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlcXVpcmVkRGVzY3JpcHRpb259CiAgICAgICAgICAgICYmICEkUGFyYW17VW5pdFJlcXVpcmVkRGVzY3JpcHRpb25UcnVlfQogICAgICAgICAgICAmJiAkUGFyYW17U3VjY2Vzc2Z1bEluc2VydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAnU3VjY2Vzc2Z1bCBpbnNlcnQhJywgKTsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaW1lQWNjb3VudGluZ0VkaXQnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdmlldyBvbGRlciBkYXkgaW5zdGVydHMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmlldycgKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApIGlmICEkU2VsZi0+e0FjY2Vzc1JvfTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIChxdyhEYXkgTW9udGggWWVhciBVc2VySUQpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgICAgICBmb3IgKHF3KERheSBNb250aCBZZWFyKSkgewogICAgICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gIlZpZXc6IE5lZWQgJF8iICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgbm8gVXNlcklEIHBvc3RlZCB1c2UgdGhlIGN1cnJlbnQgdXNlcgogICAgICAgICRQYXJhbXtVc2VySUR9IHx8PSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICMgc2hvdyB0aGUgbmFtaW5nIG9mIHRoZSBhZ2VudCB3aGljaCB0aW1lIGFjY291bnRpbmcgaXMgdmlzaXRlZAogICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMSApOwogICAgICAgICAgICAkUGFyYW17VXNlcn0gPSAkU2hvd25Vc2Vyc3sgJFBhcmFte1VzZXJJRH0gfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtXZWVrZGF5fSAgICAgICAgID0gRGF5X29mX1dlZWsoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKICAgICAgICAkUGFyYW17V2Vla2RheV90b19UZXh0fSA9ICRXZWVrZGF5QXJyYXlbICRQYXJhbXtXZWVrZGF5fSAtIDEgXTsKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gICA9ICRNb250aEFycmF5WyAkUGFyYW17TW9udGh9IF07CgogICAgICAgICMgVmFsdWVzIGZvciB0aGUgbGluayBpY29ucyA8PgogICAgICAgICggJFBhcmFte1llYXJCYWNrfSwgJFBhcmFte01vbnRoQmFja30sICRQYXJhbXtEYXlCYWNrfSApCiAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSwgMCwgMCwgLTEgKTsKICAgICAgICAoICRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0sIDAsIDAsIDEgKTsKCiAgICAgICAgJFBhcmFte0RhdGVTZWxlY3Rpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICcnLAogICAgICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBTaG93IFdvcmtpbmcgVW5pdHMKICAgICAgICAjIGdldCBleGlzdGluZyB3b3JraW5nIHVuaXRzCiAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgRGF5ICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0RhdGV9ID0gJERhdGF7RGF0ZX07CgogICAgICAgICMgZ2V0IHByb2plY3QgYW5kIGFjdGlvbiBzZXR0aW5ncwogICAgICAgIG15ICVQcm9qZWN0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CgogICAgICAgICMgZ2V0IHNpY2ssIGxlYXZlIGRheSBhbmQgb3ZlcnRpbWUKICAgICAgICAkUGFyYW17U2lja30gICAgID0gJERhdGF7U2lja30gICAgID8gJ2NoZWNrZWQnIDogJyc7CiAgICAgICAgJFBhcmFte0xlYXZlRGF5fSA9ICREYXRhe0xlYXZlRGF5fSA/ICdjaGVja2VkJyA6ICcnOwogICAgICAgICRQYXJhbXtPdmVydGltZX0gPSAkRGF0YXtPdmVydGltZX0gPyAnY2hlY2tlZCcgOiAnJzsKCiAgICAgICAgIyBvbmx5IHNob3cgdGhlIHVuaXQgYmxvY2sgaWYgdGhlcmUgaXMgc29tZSBkYXRhCiAgICAgICAgbXkgJFVuaXRzUmVmID0gJERhdGF7V29ya2luZ1VuaXRzfTsKICAgICAgICBpZiAoICRVbml0c1JlZi0+WzBdICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdVbml0QmxvY2snLCApOwoKICAgICAgICAgICAgZm9yIG15ICRVbml0UmVmICggQHskVW5pdHNSZWZ9ICkgewoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVW5pdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgICA9PiAkUHJvamVjdHtQcm9qZWN0fXsgJFVuaXRSZWYtPntQcm9qZWN0SUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICA9PiAkQWN0aW9ueyAkVW5pdFJlZi0+e0FjdGlvbklEfSB9e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFyayAgICA9PiAkVW5pdFJlZi0+e1JlbWFya30sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkVW5pdFJlZi0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkVW5pdFJlZi0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2QgICAgPT4gJFVuaXRSZWYtPntQZXJpb2R9LAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFRvdGFsID0+IHNwcmludGYoICIlLjJmIiwgJERhdGF7VG90YWx9ICkgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17U2lja30gfHwgJFBhcmFte0xlYXZlRGF5fSB8fCAkUGFyYW17T3ZlcnRpbWV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3RoZXJUaW1lcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTaWNrICAgICA9PiAkUGFyYW17U2lja30sCiAgICAgICAgICAgICAgICAgICAgTGVhdmVEYXkgPT4gJFBhcmFte0xlYXZlRGF5fSwKICAgICAgICAgICAgICAgICAgICBPdmVydGltZSA9PiAkUGFyYW17T3ZlcnRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFZhY2F0aW9uID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgWWVhciAgICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBEYXkgICAgICA9PiAkUGFyYW17RGF5fSwKICAgICAgICAgICAgQ2FsZW5kYXIgPT4gJFVzZXJEYXRhe0NhbGVuZGFyfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFZhY2F0aW9uKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWYWNhdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVmFjYXRpb24gPT4gJFZhY2F0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByZXNlbnRhdGlvbgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1ZpZXcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nVmlldycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgb2JqZWN0IGZyb20gZGF0YWJhc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJyApIHsKICAgICAgICBmb3IgKHF3KERheSBNb250aCBZZWFyKSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUGFyYW17WWVhcn0mTW9udGg9JFBhcmFte01vbnRofSZEYXk9JFBhcmFte0RheX0iCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldyBhYm91dCB0aGUgdXNlcnMgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ092ZXJ2aWV3JyApIHsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICBmb3IgKHF3KFN0YXR1cyBEYXkgTW9udGggWWVhciBVc2VySUQgUHJvamVjdFN0YXR1c1Nob3cpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTdWJhY3Rpb259ID0gJ0VkaXQnOwoKICAgICAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICE9ICRTZWxmLT57VXNlcklEfSAmJiAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17U3ViYWN0aW9ufSA9ICdWaWV3JzsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMSApOwogICAgICAgICAgICAkUGFyYW17VXNlcn0gPSAkU2hvd25Vc2Vyc3sgJFBhcmFte1VzZXJJRH0gfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgRGF0ZQogICAgICAgIGlmICggISRQYXJhbXtZZWFyfSB8fCAhJFBhcmFte01vbnRofSApIHsKICAgICAgICAgICAgJFBhcmFte1llYXJ9ICA9ICRZZWFyOwogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gJE1vbnRoOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01vbnRofSA9IHNwcmludGYoICIlMDJkIiwgJFBhcmFte01vbnRofSApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuJywKICAgICAgICAgICAgVmFsdWUgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICAoICRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgLTEsIDAgKTsKICAgICAgICAoICRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgMSwgMCApOwoKICAgICAgICAjIE92ZXJ2aWV3IHBlciBkYXkKICAgICAgICBteSAkRGF5c09mTW9udGggPSBEYXlzX2luX01vbnRoKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0gKTsKCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJERheSAoIDEgLi4gJERheXNPZk1vbnRoICkgewogICAgICAgICAgICAkUGFyYW17RGF5fSA9IHNwcmludGYoICIlMDJkIiwgJERheSApOwogICAgICAgICAgICAkUGFyYW17V2Vla2RheX0gPSBEYXlfb2ZfV2VlayggJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkRGF5ICkgLSAxOwogICAgICAgICAgICBteSAkVmFjYXRpb25DaGVjayA9ICRTZWxmLT57VGltZU9iamVjdH0tPlZhY2F0aW9uQ2hlY2soCiAgICAgICAgICAgICAgICBZZWFyICAgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgICAgICBNb250aCAgICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJERheSwKICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRVc2VyRGF0YXtDYWxlbmRhcn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtZZWFyfSBlcSAkWWVhciAmJiAkUGFyYW17TW9udGh9IGVxICRNb250aCAmJiAkQ3VycmVudERheSBlcSAkRGF5ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSJvcmFuZ2UiJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFZhY2F0aW9uQ2hlY2spIHsKICAgICAgICAgICAgICAgICRQYXJhbXtTdHlsZX0gICA9ICdiZ2NvbG9yPSIjRUJDQ0NDIic7CiAgICAgICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAkVmFjYXRpb25DaGVjazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtXZWVrZGF5fSA9PSA2IHx8ICRQYXJhbXtXZWVrZGF5fSA9PSA1ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1N0eWxlfSA9ICdiZ2NvbG9yPSIjRkZFMEUwIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17U3R5bGV9ID0gJ2JnY29sb3I9IiNFNUYwRkYiJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgICAgICAgICAgWWVhciAgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICAgICAgRGF5ICAgID0+ICRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte0NvbW1lbnR9ID0gJERhdGF7U2lja30KICAgICAgICAgICAgICAgID8gJ1NpY2sgbGVhdmUnCiAgICAgICAgICAgICAgICA6ICREYXRhe0xlYXZlRGF5fSA/ICdPbiB2YWNhdGlvbicKICAgICAgICAgICAgICAgIDogJERhdGF7T3ZlcnRpbWV9ID8gJ09uIG92ZXJ0aW1lIGxlYXZlJwogICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAnJzsKCiAgICAgICAgICAgICRQYXJhbXtXb3JraW5nSG91cnN9ID0gJERhdGF7VG90YWx9ID8gc3ByaW50ZiggIiUuMmYiLCAkRGF0YXtUb3RhbH0gKSA6ICcnOwoKICAgICAgICAgICAgJFBhcmFte1dlZWtkYXlfdG9fVGV4dH0gPSAkV2Vla2RheUFycmF5WyAkUGFyYW17V2Vla2RheX0gXTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17Q29tbWVudH0gPSAnJzsKICAgICAgICB9CgogICAgICAgIG15ICVVc2VyUmVwb3J0ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICApOwogICAgICAgIGZvciAoCiAgICAgICAgICAgIHF3KFRhcmdldFN0YXRlIFRhcmdldFN0YXRlVG90YWwgV29ya2luZ0hvdXJzVG90YWwgV29ya2luZ0hvdXJzCiAgICAgICAgICAgIE92ZXJ0aW1lIE92ZXJ0aW1lVG90YWwgT3ZlcnRpbWVVbnRpbCBMZWF2ZURheSBMZWF2ZURheVRvdGFsCiAgICAgICAgICAgIExlYXZlRGF5UmVtYWluaW5nIFNpY2sgU2lja1RvdGFsIFNpY2tSZW1haW5pbmcpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRVc2VyUmVwb3J0eyAkUGFyYW17VXNlcklEfSB9eyRffSB8fD0gMDsKICAgICAgICAgICAgJFBhcmFteyRffSA9IHNwcmludGYoICIlLjJmIiwgJFVzZXJSZXBvcnR7ICRQYXJhbXtVc2VySUR9IH17JF99ICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRVc2VyRGF0YXtTaG93T3ZlcnRpbWV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBPdmVydmlldyBwZXIgcHJvamVjdCBhbmQgYWN0aW9uCiAgICAgICAgbXkgJVByb2plY3REYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgICA9PiAkUGFyYW17WWVhcn0sCiAgICAgICAgICAgIE1vbnRoICA9PiAkUGFyYW17TW9udGh9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRoZSByZXBvcnQgc29ydCBieSBwcm9qZWN0cwogICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gfHwgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAndmFsaWQnICkgewogICAgICAgICAgICAkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9ID0gJ2FsbCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICd2YWxpZCc7CiAgICAgICAgfQoKICAgICAgICBQUk9KRUNUSUQ6CiAgICAgICAgZm9yIG15ICRQcm9qZWN0SUQgKAogICAgICAgICAgICBzb3J0IHsgJFByb2plY3REYXRheyRhfXtOYW1lfSBjbXAgJFByb2plY3REYXRheyRifXtOYW1lfSB9CiAgICAgICAgICAgIGtleXMgJVByb2plY3REYXRhCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRQcm9qZWN0UmVmID0gJFByb2plY3REYXRheyRQcm9qZWN0SUR9OwogICAgICAgICAgICBteSAkQWN0aW9uc1JlZiA9ICRQcm9qZWN0UmVmLT57QWN0aW9uc307CgogICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAnJzsKICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgID0gJ2NvbnRlbnR2YWx1ZSc7CiAgICAgICAgICAgICRQYXJhbXtTdGF0dXN9ICA9ICRQcm9qZWN0UmVmLT57U3RhdHVzfSA/ICcnIDogJ3Bhc3Npdic7CgogICAgICAgICAgICBteSAkVG90YWwgICAgICA9IDA7CiAgICAgICAgICAgIG15ICRUb3RhbFRvdGFsID0gMDsKCiAgICAgICAgICAgIG5leHQgUFJPSkVDVElEIGlmICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgJiYgJFBhcmFte1N0YXR1c307CgogICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgKICAgICAgICAgICAgICAgIHNvcnQgeyAkQWN0aW9uc1JlZi0+eyRhfXtOYW1lfSBjbXAgJEFjdGlvbnNSZWYtPnskYn17TmFtZX0gfQogICAgICAgICAgICAgICAga2V5cyAleyRBY3Rpb25zUmVmfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkQWN0aW9uUmVmID0gJEFjdGlvbnNSZWYtPnskQWN0aW9uSUR9OwoKICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICRBY3Rpb25SZWYtPntOYW1lfTsKICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJEFjdGlvblJlZi0+e1Blck1vbnRofSB8fCAwICk7CiAgICAgICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRBY3Rpb25SZWYtPntUb3RhbH0gfHwgMCApOwogICAgICAgICAgICAgICAgJFRvdGFsICAgICAgKz0gJFBhcmFte0hvdXJzfTsKICAgICAgICAgICAgICAgICRUb3RhbFRvdGFsICs9ICRQYXJhbXtIb3Vyc1RvdGFsfTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAkUHJvamVjdFJlZi0+e05hbWV9OwogICAgICAgICAgICAgICAgICAgIG15ICRQcm9qZWN0RGVzY3JpcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRQcm9qZWN0UmVmLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dTcGFuICAgICAgICAgICAgPT4gKCAxICsgc2NhbGFyIGtleXMgJXskQWN0aW9uc1JlZn0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgICAgICAgICAgICA9PiAkUGFyYW17U3RhdHVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3REZXNjcmlwdGlvbiA9PiAkUHJvamVjdERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJEYXRhe0NyZWF0ZVByb2plY3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBwZXJzb25zIGhvdyBhcmUgYWxsb3dlZCB0byBzZWUgdGhlIGNyZWF0ZSBvYmplY3QgbGluayBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBhbGxvd2VkIHRvIHNlZSB0aGUgcHJvamVjdCByZXBvcnRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2plY3RMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgICA9PiAkUHJvamVjdFJlZi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3RJRCA9PiAkUHJvamVjdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0Tm9MaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBQcm9qZWN0ID0+ICRQcm9qZWN0UmVmLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0NsYXNzfSAgICAgID0gJ2NvbnRlbnRrZXknOwogICAgICAgICAgICAkUGFyYW17QWN0aW9ufSAgICAgPSAnVG90YWwnOwogICAgICAgICAgICAkUGFyYW17SG91cnN9ICAgICAgPSBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbCApOwogICAgICAgICAgICAkUGFyYW17SG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbFRvdGFsICk7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSAgICAgICs9ICRUb3RhbDsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gKz0gJFRvdGFsVG90YWw7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte0NsYXNzfSA9ICcnOwogICAgICAgIH0KICAgICAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtUb3RhbEhvdXJzfSApICkgewogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzfSApOwogICAgICAgIH0KICAgICAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICdPdmVydmlldycgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdPdmVydmlldycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXR0aW5ncyBmb3IgaGFuZGxpbmcgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmcnICkgewogICAgICAgIG15ICVEYXRhID0gKCk7CgogICAgICAgIGZvciAocXcoQWN0aW9uQWN0aW9uIEFjdGlvblVzZXIgTmV3QWN0aW9uIE5ld1VzZXIpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSd307CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1NldHRpbmcnLCApOwoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVNldHRpbmciLAogICAgICAgICk7CgogICAgICAgIGlmICggJFBhcmFte0FjdGlvbkFjdGlvbn0gfHwgJFBhcmFte05ld0FjdGlvbn0gKSB7CiAgICAgICAgICAgIG15ICVBY3Rpb24gICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgICAgICBteSAkQWN0aW9uRW1wdHkgPSAwOwogICAgICAgICAgICBteSAlQWN0aW9uQ2hlY2sgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgICAgIGZvciAocXcoQWN0aW9uIEFjdGlvblN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXskQWN0aW9uSUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkQWN0aW9uSUQgLiAnXScgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggISREYXRheyRBY3Rpb25JRH17QWN0aW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAkQWN0aW9uRW1wdHkgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0KICAgICAgICAgICAgICAgICAgICAmJiAkQWN0aW9uQ2hlY2t7ICREYXRheyRBY3Rpb25JRH17QWN0aW9ufSB9CiAgICAgICAgICAgICAgICAgICAgJiYgJEFjdGlvbkNoZWNreyAkRGF0YXskQWN0aW9uSUR9e0FjdGlvbn0gfSA9PSAxCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdUaGUgYWN0aW9ubmFtaW5nIG11c3QgYmUgdW5pcXVlIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRBY3Rpb25DaGVja3sgJERhdGF7JEFjdGlvbklEfXtBY3Rpb259IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc1VwZGF0ZSglRGF0YSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgdXBkYXRlIGFjdGlvbiBkYXRhIScKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3QWN0aW9ufSAmJiAhJEFjdGlvbkVtcHR5ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzSW5zZXJ0KCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCBpbnNlcnQgYWN0aW9uIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0dldCgpOwoKICAgICAgICAgICAgbXkgJUxhc3RQZXJpb2QgPSAoKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVVc2VyICkgewogICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAwOwogICAgICAgICAgICAgICAgZm9yIG15ICRQZXJpb2QgKCBrZXlzICV7ICRVc2VyeyRVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTGFzdFBlcmlvZHskVXNlcklEfSA8ICRQZXJpb2QgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXN0UGVyaW9keyRVc2VySUR9ID0gJFBlcmlvZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIk5ld1VzZXJTZXR0aW5nWyR7VXNlcklEfV0iICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUluc2VydERhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAkSW5zZXJ0RGF0YXtQZXJpb2R9ID0gJExhc3RQZXJpb2R7JFVzZXJJRH0gKyAxOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY3Rpb25Vc2VyfSAgPSAndHJ1ZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0luc2VydCglSW5zZXJ0RGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCB1c2VyIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17QWN0aW9uVXNlcn0gfHwgJFBhcmFte05ld1VzZXJ9ICkgewoKICAgICAgICAgICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJMaXN0KCk7CgogICAgICAgICAgICAgICAgVVNFUklEOgogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVVc2VyICkgewoKICAgICAgICAgICAgICAgICAgICBmb3IgKHF3KCBTaG93T3ZlcnRpbWUgQ3JlYXRlUHJvamVjdCBDYWxlbmRhciApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfIC4gJ1snIC4gJFVzZXJJRCAuICddJyApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJEJyZWFrID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckJhc2ljc3skVXNlcklEfXtEZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzY3JpcHRpb25bJyAuICRVc2VySUQgLiAnXScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQnJlYWsgPSAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJERlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiRGVzY3JpcHRpb25bJHtVc2VySUR9XSIgKTsKCiAgICAgICAgICAgICAgICAgICAgJERhdGF7JFVzZXJJRH17RGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFVzZXJCYXNpY3N7JFVzZXJJRH17RGVzY3JpcHRpb259IC4gJEJyZWFrIC4gJERlc2NyaXB0aW9uOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXtVc2VySUR9ID0gJFVzZXJJRDsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQZXJpb2QgKCBrZXlzICV7ICRVc2VyeyRVc2VySUR9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmb2xsb3dpbmcgaXMgYmVjYXVzZSBvZiBkZWFjdGl2YXRlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdEYXRlU3RhcnRbJyAuICRVc2VySUQgLiAnXVsnIC4gJFBlcmlvZCAuICddJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JFVzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChxdyhXZWVrbHlIb3VycyBMZWF2ZURheXMgVXNlclN0YXR1cyBEYXRlU3RhcnQgRGF0ZUVuZCBPdmVydGltZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyRVc2VySUR9eyRQZXJpb2R9eyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAkXyAuICdbJyAuICRVc2VySUQgLiAnXVsnIC4gJFBlcmlvZCAuICddJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskVXNlcklEfXskUGVyaW9kfXtVc2VySUR9ID0gJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgJExhc3RQZXJpb2R7JFVzZXJJRH0gPSAkUGVyaW9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzVXBkYXRlKCVEYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSB1c2VyIGRhdGEhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17TmV3VXNlcn0gJiYgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlcklEJyApICkgewoKICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe1VzZXJJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VySUQnICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7UGVyaW9kfSA9ICcxJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+VXNlclNldHRpbmdzSW5zZXJ0KCVEYXRhKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDYW5cJ3QgaW5zZXJ0IHVzZXIgZGF0YSEnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGZvciAoIGtleXMgJUdyb3VwcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR3JvdXBzeyRffSBlcSAndGltZV9hY2NvdW50aW5nJyAmJiAhJEdyb3VwRGF0YXskX30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkRGF0YXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3ICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgIG15ICVTdGF0dXNMaXN0ID0gKAogICAgICAgICAgICAxID0+ICd2YWxpZCcsCiAgICAgICAgICAgIDAgPT4gJ2ludmFsaWQnLAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBhY3Rpb24gZGF0YQogICAgICAgIG15ICVBY3Rpb24gICAgICA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwogICAgICAgIG15ICRBY3Rpb25FbXB0eSA9IDA7CgogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IHsgJEFjdGlvbnskYX17QWN0aW9ufSBjbXAgJEFjdGlvbnskYn17QWN0aW9ufSB9IGtleXMgJUFjdGlvbiApIHsKICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICA9ICRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICAgICAkUGFyYW17QWN0aW9uSUR9ID0gJEFjdGlvbklEOwoKICAgICAgICAgICAgbXkgJFN0YXR1c09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU3RhdHVzTGlzdCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJBY3Rpb25TdGF0dXNbJFBhcmFte0FjdGlvbklEfV0iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3RhdHVzT3B0aW9uID0+ICRTdGF0dXNPcHRpb24sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTaG93IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyICAgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJTZXR0aW5nc0dldCgpOwogICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJMaXN0KCk7CiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDEgKTsKCiAgICAgICAgIyBmaWxsIHVwIHRoZSBjYWxlbmRhciBsaXN0CiAgICAgICAgbXkgJENhbGVuZGFyTGlzdFJlZiA9IHsgMCA9PiAnRGVmYXVsdCcgfTsKICAgICAgICBteSAkQ2FsZW5kYXJJbmRleCA9IDE7CiAgICAgICAgd2hpbGUgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggIlRpbWVab25lOjpDYWxlbmRhciIgLiAkQ2FsZW5kYXJJbmRleCAuICJOYW1lIiApICkgewogICAgICAgICAgICAkQ2FsZW5kYXJMaXN0UmVmLT57JENhbGVuZGFySW5kZXh9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAiVGltZVpvbmU6OkNhbGVuZGFyIiAuICRDYWxlbmRhckluZGV4IC4gIk5hbWUiICk7CiAgICAgICAgICAgICRDYWxlbmRhckluZGV4Kys7CiAgICAgICAgfQoKICAgICAgICBVU0VSSUQ6CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFNob3duVXNlcnN7JGF9IGNtcCAkU2hvd25Vc2Vyc3skYn0gfSBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJ7JFVzZXJJRH07CgogICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRVc2VySUQ7CiAgICAgICAgICAgIG15ICRVc2VyUmVmICAgICAgID0gJFVzZXJ7JFVzZXJJRH07CiAgICAgICAgICAgIG15ICRVc2VyQmFzaWNzUmVmID0gJFVzZXJCYXNpY3N7JFVzZXJJRH07CgogICAgICAgICAgICBteSAkRGVzY3JpcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVXNlckJhc2ljc1JlZi0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREZXNjcmlwdGlvbiA9ICREZXNjcmlwdGlvbiA/ICREZXNjcmlwdGlvbiAuICc8YnI+JyA6ICcnOwoKICAgICAgICAgICAgbXkgJENhbGVuZGFyT3B0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDYWxlbmRhckxpc3RSZWYsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiQ2FsZW5kYXJbJFVzZXJJRF0iLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRVc2VyQmFzaWNzUmVmLT57Q2FsZW5kYXJ9IHx8IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgIFNob3dPdmVydGltZSAgID0+ICRVc2VyQmFzaWNzUmVmLT57U2hvd092ZXJ0aW1lfSA/ICdjaGVja2VkJyA6ICcnLAogICAgICAgICAgICAgICAgICAgIENyZWF0ZVByb2plY3QgID0+ICRVc2VyQmFzaWNzUmVmLT57Q3JlYXRlUHJvamVjdH0gPyAnY2hlY2tlZCcgOiAnJywKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhck9wdGlvbiA9PiAkQ2FsZW5kYXJPcHRpb24sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZGVsZXRlICRTaG93blVzZXJzeyRVc2VySUR9OwoKICAgICAgICAgICAgZm9yIG15ICRQZXJpb2QgKCBzb3J0IGtleXMgJXskVXNlclJlZn0gKSB7CgogICAgICAgICAgICAgICAgbXkgJFN0YXR1c09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVN0YXR1c0xpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkVXNlclJlZi0+eyRQZXJpb2R9e1VzZXJTdGF0dXN9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlVzZXJTdGF0dXNbJFVzZXJJRF1bJFBlcmlvZF0iLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BlcmlvZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBXZWVrbHlIb3VycyAgPT4gJFVzZXJSZWYtPnskUGVyaW9kfXtXZWVrbHlIb3Vyc30sCiAgICAgICAgICAgICAgICAgICAgICAgIExlYXZlRGF5cyAgICA9PiAkVXNlclJlZi0+eyRQZXJpb2R9e0xlYXZlRGF5c30sCiAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ0aW1lICAgICA9PiAkVXNlclJlZi0+eyRQZXJpb2R9e092ZXJ0aW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgID0+ICRVc2VyUmVmLT57JFBlcmlvZH17RGF0ZVN0YXJ0fSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZUVuZCAgICAgID0+ICRVc2VyUmVmLT57JFBlcmlvZH17RGF0ZUVuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCAgICAgICA9PiAkUGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNPcHRpb24gPT4gJFN0YXR1c09wdGlvbiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVTaG93blVzZXJzKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeycnfSA9ICcnOwogICAgICAgICAgICBteSAkTmV3VXNlck9wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAnJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05ld1VzZXJPcHRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IE5ld1VzZXJPcHRpb24gPT4gJE5ld1VzZXJPcHRpb24sIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1NldHRpbmcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZXR0aW5ncyBmb3IgaGFuZGxpbmcgdGltZSBhY2NvdW50aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Byb2plY3RTZXR0aW5nJyApIHsKICAgICAgICBteSAlUHJvamVjdCA9ICgpOwogICAgICAgIG15ICVEYXRhICAgID0gKCk7CgogICAgICAgIGZvciAocXcoQWN0aW9uUHJvamVjdCBOZXdQcm9qZWN0KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUm99OwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdQcm9qZWN0U2V0dGluZycsICk7CgogICAgICAgICMgRWRpdCBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgIGlmICggJFBhcmFte0FjdGlvblByb2plY3R9IHx8ICRQYXJhbXtOZXdQcm9qZWN0fSApIHsKICAgICAgICAgICAgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgICAgIG15ICRQcm9qZWN0RW1wdHkgPSAwOwogICAgICAgICAgICBteSAlUHJvamVjdENoZWNrID0gKCk7CiAgICAgICAgICAgIGZvciBteSAkUHJvamVjdElEICgga2V5cyAleyAkUHJvamVjdHtQcm9qZWN0fSB9ICkgewogICAgICAgICAgICAgICAgZm9yIChxdyhQcm9qZWN0IFByb2plY3RTdGF0dXMgUHJvamVjdERlc2NyaXB0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICREYXRheyRQcm9qZWN0SUR9eyRffQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gLiAnWycgLiAkUHJvamVjdElEIC4gJ10nICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkUHJvamVjdEVtcHR5ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fQogICAgICAgICAgICAgICAgICAgICYmICRQcm9qZWN0Q2hlY2t7ICREYXRheyRQcm9qZWN0SUR9e1Byb2plY3R9IH0KICAgICAgICAgICAgICAgICAgICAmJiAkUHJvamVjdENoZWNreyAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSB9ID09IDEKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ1RoZSBwcm9qZWN0bmFtaW5nIG11c3QgYmUgdW5pcXVlIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskUHJvamVjdElEfXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFByb2plY3RDaGVja3sgJERhdGF7JFByb2plY3RJRH17UHJvamVjdH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NVcGRhdGUoJURhdGEpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHVwZGF0ZSBwcm9qZWN0IGRhdGEhJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtOZXdQcm9qZWN0fSAmJiAhJFByb2plY3RFbXB0eSApIHsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NJbnNlcnQoKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IGluc2VydCBwcm9qZWN0IGRhdGEhJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgU2hvdyBUaW1lQWNjb3VudGluZyBQcmVmZXJlbmNlcwogICAgICAgIG15ICVTdGF0dXNMaXN0ID0gKAogICAgICAgICAgICAxID0+ICd2YWxpZCcsCiAgICAgICAgICAgIDAgPT4gJ2ludmFsaWQnLAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBwcm9qZWN0IGRhdGEKICAgICAgICAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgICAgICBteSAkUHJvamVjdEVtcHR5ID0gMDsKICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgICAgIHNvcnQgeyAkUHJvamVjdHtQcm9qZWN0fXskYX0gY21wICRQcm9qZWN0e1Byb2plY3R9eyRifSB9CiAgICAgICAgICAgIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgJFBhcmFte1Byb2plY3R9ICAgICAgICAgICAgPSAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfTsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0gPSAkUHJvamVjdHtQcm9qZWN0RGVzY3JpcHRpb259eyRQcm9qZWN0SUR9OwogICAgICAgICAgICAkUGFyYW17UHJvamVjdElEfSAgICAgICAgICA9ICRQcm9qZWN0SUQ7CgogICAgICAgICAgICBteSAkU3RhdHVzT3B0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTdGF0dXNMaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUHJvamVjdHtQcm9qZWN0U3RhdHVzfXskUHJvamVjdElEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gIlByb2plY3RTdGF0dXNbJFBhcmFte1Byb2plY3RJRH1dIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTdGF0dXNPcHRpb24gPT4gJFN0YXR1c09wdGlvbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1NldHRpbmcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1JlcG9ydGluZycgKSB7CiAgICAgICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICAgICAgbXkgJVNob3duVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCggVHlwZSA9PiAnTG9uZycsIFZhbGlkID0+IDAgKTsKICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkQ3VycmVudERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRTZWxmLT57QWNjZXNzUnd9OwoKICAgICAgICBmb3IgKHF3KFN0YXR1cyBNb250aCBZZWFyIFByb2plY3RTdGF0dXNTaG93KSkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBEYXRlCiAgICAgICAgaWYgKCAhJFBhcmFte1llYXJ9IHx8ICEkUGFyYW17TW9udGh9ICkgewogICAgICAgICAgICAkUGFyYW17WWVhcn0gID0gJFllYXI7CiAgICAgICAgICAgICRQYXJhbXtNb250aH0gPSAkTW9udGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9udGh9ID0gc3ByaW50ZiggIiUwMmQiLCAkUGFyYW17TW9udGh9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW4nLAogICAgICAgICAgICBWYWx1ZSA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVJlcG9ydGluZyZZZWFyPSRQYXJhbXtZZWFyfSZNb250aD0kUGFyYW17TW9udGh9IiwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17TW9udGhfdG9fVGV4dH0gPSAkTW9udGhBcnJheVsgJFBhcmFte01vbnRofSBdOwoKICAgICAgICBteSAlTW9udGggPSAoKTsKICAgICAgICBmb3IgbXkgJElEICggMSAuLiAxMiApIHsKICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17VmFsdWV9ICAgID0gJE1vbnRoQXJyYXlbJElEXTsKICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17UG9zaXRpb259ID0gJElEOwogICAgICAgICAgICBpZiAoICRQYXJhbXtNb250aH0gPT0gJElEICkgewogICAgICAgICAgICAgICAgJE1vbnRoeyBzcHJpbnRmKCAiJTAyZCIsICRJRCApIH17U2VsZWN0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEZyb250ZW5ke01vbnRoT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uRWxlbWVudCgKICAgICAgICAgICAgRGF0YSA9PiBcJU1vbnRoLAogICAgICAgICAgICBOYW1lID0+ICdNb250aCcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFllYXIgPSAoIDIwMDUgLi4gJFllYXIgKTsKCiAgICAgICAgJEZyb250ZW5ke1llYXJPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXEBZZWFyLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17WWVhcn0gfHwgJycsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdZZWFyJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwoKICAgICAgICAoICRQYXJhbXtZZWFyQmFja30sICRQYXJhbXtNb250aEJhY2t9LCAkUGFyYW17RGF5QmFja30gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgLTEsIDAgKTsKICAgICAgICAoICRQYXJhbXtZZWFyTmV4dH0sICRQYXJhbXtNb250aE5leHR9LCAkUGFyYW17RGF5TmV4dH0gKQogICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgMSwgMCwgMSwgMCApOwoKICAgICAgICBteSAlVXNlclJlcG9ydCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyUmVwb3J0aW5nKAogICAgICAgICAgICBZZWFyICAgPT4gJFBhcmFte1llYXJ9LAogICAgICAgICAgICBNb250aCAgPT4gJFBhcmFte01vbnRofSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVVc2VyQmFzaWNzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlVzZXJMaXN0KCk7CgogICAgICAgIFVTRVJJRDoKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICEkVXNlclJlcG9ydHskVXNlcklEfTsKCiAgICAgICAgICAgIGZvciAocXcoTGVhdmVEYXkgT3ZlcnRpbWUgV29ya2luZ0hvdXJzIFNpY2sgTGVhdmVEYXlSZW1haW5pbmcgT3ZlcnRpbWVUb3RhbCkpIHsKICAgICAgICAgICAgICAgICRQYXJhbXskX30gPSBzcHJpbnRmKCAiJS4yZiIsICRVc2VyUmVwb3J0eyRVc2VySUR9eyRffSApOwogICAgICAgICAgICAgICAgJFBhcmFteyAnVG90YWwnIC4gJF8gfSArPSAkUGFyYW17JF99OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNob3cgT3ZlcnRpbWUgaWYgYWxsb3dlZAogICAgICAgICAgICBpZiAoICEkVXNlckJhc2ljc3skVXNlcklEfXtTaG93T3ZlcnRpbWV9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte092ZXJ0aW1lfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17T3ZlcnRpbWVUb3RhbH0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte1VzZXJ9ICAgPSAkU2hvd25Vc2Vyc3skVXNlcklEfTsKICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciAoCiAgICAgICAgICAgIHF3KFRvdGFsTGVhdmVEYXkgVG90YWxPdmVydGltZSBUb3RhbFdvcmtpbmdIb3VycwogICAgICAgICAgICBUb3RhbFNpY2sgVG90YWxMZWF2ZURheVJlbWFpbmluZyBUb3RhbE92ZXJ0aW1lVG90YWwpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXskX30gKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aGUgcmVwb3J0IHNvcnQgYnkgcHJvamVjdHMKICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdFN0YXR1c1Nob3d9IHx8ICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ3ZhbGlkJyApIHsKICAgICAgICAgICAgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSA9ICdhbGwnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gZXEgJ2FsbCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzU2hvd30gPSAndmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgbXkgJVByb2plY3REYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgICAgIFllYXIgID0+ICRQYXJhbXtZZWFyfSwKICAgICAgICAgICAgTW9udGggPT4gJFBhcmFte01vbnRofSwKICAgICAgICApOwoKICAgICAgICAjIFJFTUFSSzptZXJnZSB0aGlzIHByb2plY3RyZXBvcnRpbmcgbGlzdCB3aXRoIHRoZSBsaXN0IGluIG92ZXJ2aWV3CgogICAgICAgIFBST0pFQ1RJRDoKICAgICAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgICAgIHNvcnQgeyAkUHJvamVjdERhdGF7JGF9e05hbWV9IGNtcCAkUHJvamVjdERhdGF7JGJ9e05hbWV9IH0KICAgICAgICAgICAga2V5cyAlUHJvamVjdERhdGEKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFByb2plY3RSZWYgPSAkUHJvamVjdERhdGF7JFByb2plY3RJRH07CiAgICAgICAgICAgIG15ICRBY3Rpb25zUmVmID0gJFByb2plY3RSZWYtPntBY3Rpb25zfTsKCiAgICAgICAgICAgICRQYXJhbXtQcm9qZWN0fSA9ICcnOwogICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgPSAnY29udGVudHZhbHVlJzsKICAgICAgICAgICAgJFBhcmFte1N0YXR1c30gID0gJFByb2plY3RSZWYtPntTdGF0dXN9ID8gJycgOiAncGFzc2l2JzsKCiAgICAgICAgICAgIG15ICRUb3RhbCAgICAgID0gMDsKICAgICAgICAgICAgbXkgJFRvdGFsVG90YWwgPSAwOwoKICAgICAgICAgICAgbmV4dCBQUk9KRUNUSUQgaWYgJFBhcmFte1Byb2plY3RTdGF0dXNTaG93fSBlcSAnYWxsJyAmJiAkUGFyYW17U3RhdHVzfTsKCiAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKAogICAgICAgICAgICAgICAgc29ydCB7ICRBY3Rpb25zUmVmLT57JGF9e05hbWV9IGNtcCAkQWN0aW9uc1JlZi0+eyRifXtOYW1lfSB9CiAgICAgICAgICAgICAgICBrZXlzICV7JEFjdGlvbnNSZWZ9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRBY3Rpb25SZWYgPSAkQWN0aW9uc1JlZi0+eyRBY3Rpb25JRH07CgogICAgICAgICAgICAgICAgJFBhcmFte0FjdGlvbn0gICAgID0gJEFjdGlvblJlZi0+e05hbWV9OwogICAgICAgICAgICAgICAgJFBhcmFte0hvdXJzfSAgICAgID0gc3ByaW50ZiggIiUuMmYiLCAkQWN0aW9uUmVmLT57UGVyTW9udGh9IHx8IDAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJEFjdGlvblJlZi0+e1RvdGFsfSB8fCAwICk7CiAgICAgICAgICAgICAgICAkVG90YWwgICAgICArPSAkUGFyYW17SG91cnN9OwogICAgICAgICAgICAgICAgJFRvdGFsVG90YWwgKz0gJFBhcmFte0hvdXJzVG90YWx9OwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtQcm9qZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvamVjdH0gPSAkUHJvamVjdFJlZi0+e05hbWV9OwogICAgICAgICAgICAgICAgICAgIG15ICRQcm9qZWN0RGVzY3JpcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRQcm9qZWN0UmVmLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiA1MCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9qZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dTcGFuICAgICAgICAgICAgPT4gKCAxICsgc2NhbGFyIGtleXMgJXskQWN0aW9uc1JlZn0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgICAgICAgICAgICA9PiAkUGFyYW17U3RhdHVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3REZXNjcmlwdGlvbiA9PiAkUHJvamVjdERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdCAgICAgICAgICAgID0+ICRQcm9qZWN0UmVmLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SUQgICAgICAgICAgPT4gJFByb2plY3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17Q2xhc3N9ICAgICAgPSAnY29udGVudGtleSc7CiAgICAgICAgICAgICRQYXJhbXtBY3Rpb259ICAgICA9ICdUb3RhbCc7CiAgICAgICAgICAgICRQYXJhbXtIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsICk7CiAgICAgICAgICAgICRQYXJhbXtIb3Vyc1RvdGFsfSA9IHNwcmludGYoICIlLjJmIiwgJFRvdGFsVG90YWwgKTsKICAgICAgICAgICAgJFBhcmFte1RvdGFsSG91cnN9ICAgICAgKz0gJFRvdGFsOwogICAgICAgICAgICAkUGFyYW17VG90YWxIb3Vyc1RvdGFsfSArPSAkVG90YWxUb3RhbDsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzfSAgICAgIHx8PSAwOwogICAgICAgICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9IHx8PSAwOwoKICAgICAgICAkUGFyYW17VG90YWxIb3Vyc30gICAgICA9IHNwcmludGYoICIlLjJmIiwgJFBhcmFte1RvdGFsSG91cnN9ICk7CiAgICAgICAgJFBhcmFte1RvdGFsSG91cnNUb3RhbH0gPSBzcHJpbnRmKCAiJS4yZiIsICRQYXJhbXtUb3RhbEhvdXJzVG90YWx9ICk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1JlcG9ydGluZycgKTsKICAgICAgICAkT3V0cHV0ICAgIC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgICAgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcnCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGltZSBhY2NvdW50aW5nIHByb2plY3QgcmVwb3J0aW5nCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Byb2plY3RSZXBvcnRpbmcnICkgewogICAgICAgIG15ICVGcm9udGVuZCA9ICgpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJFNlbGYtPntBY2Nlc3NSb307CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRQYXJhbXtQcm9qZWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJvamVjdElEJyApOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgICAgICBpZiAoICEkUGFyYW17UHJvamVjdElEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdQcm9qZWN0UmVwb3J0aW5nOiBOZWVkIFByb2plY3RJRCcKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICAgICAgbXkgJVByb2plY3QgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFNldHRpbmdzR2V0KCk7CiAgICAgICAgJFBhcmFte1Byb2plY3R9ID0gJFByb2plY3R7UHJvamVjdH17ICRQYXJhbXtQcm9qZWN0SUR9IH07CgogICAgICAgIG15ICVTaG93blVzZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoIFR5cGUgPT4gJ0xvbmcnLCBWYWxpZCA9PiAwICk7CgogICAgICAgICMgbmVjYXNzYXJ5IGJlY2F1c2UgdGhlIFByb2plY3RBY3Rpb25SZXBvcnRpbmcgaXMgbm90IHJld29ya2VkCiAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJEN1cnJlbnREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CiAgICAgICAgbXkgJVByb2plY3REYXRhID0gKCk7CiAgICAgICAgbXkgJVByb2plY3RUaW1lID0gKCk7CgogICAgICAgICMgT25seSBvbmUgZnVuY3Rpb24gc2hvdWxkIGJlIGVub3VnaAogICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlU2hvd25Vc2VycyApIHsKCiAgICAgICAgICAgICMgT3ZlcnZpZXcgcGVyIHByb2plY3QgYW5kIGFjdGlvbgogICAgICAgICAgICAjIFJFTUFSSzogVGhpcyBpcyB0aGUgd3JvbmcgZnVuY3Rpb24gdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgJVByb2plY3REYXRhID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RBY3Rpb25SZXBvcnRpbmcoCiAgICAgICAgICAgICAgICBZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFByb2plY3REYXRheyAkUGFyYW17UHJvamVjdElEfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJEFjdGlvbnNSZWYgPSAkUHJvamVjdERhdGF7ICRQYXJhbXtQcm9qZWN0SUR9IH17QWN0aW9uc307CiAgICAgICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAleyRBY3Rpb25zUmVmfSApIHsKICAgICAgICAgICAgICAgICAgICAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc30gPSAkQWN0aW9uc1JlZi0+eyRBY3Rpb25JRH17VG90YWx9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlICRTaG93blVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIGhlYWRlcmxpbmUKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkU2hvd25Vc2Vyc3skYX0gY21wICRTaG93blVzZXJzeyRifSB9IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyTmFtZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgVXNlciA9PiAkU2hvd25Vc2Vyc3skVXNlcklEfSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBiZXR0ZXIgc29sdXRpb24gZm9yIHNvcnQgYWN0aW9ucyBuZWNlc3NhcnkKICAgICAgICBteSAlTmV3QWN0aW9uID0gKCk7CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIGtleXMgJVByb2plY3RUaW1lICkgewogICAgICAgICAgICAkTmV3QWN0aW9ueyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgICAgICB9CiAgICAgICAgJUFjdGlvbiA9ICVOZXdBY3Rpb247CgogICAgICAgICMgc2hvdyB0aGUgcmVzdWx0cwogICAgICAgIG15ICVUb3RhbCA9ICgpOwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IHsgJEFjdGlvbnskYX0gY21wICRBY3Rpb257JGJ9IH0ga2V5cyAlQWN0aW9uICkgewogICAgICAgICAgICBteSAkVG90YWxIb3VycyA9IDA7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IEFjdGlvbiA9PiAkQWN0aW9ueyRBY3Rpb25JRH0sIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgICAgICRUb3RhbEhvdXJzICs9ICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfSB8fCAwOwogICAgICAgICAgICAgICAgJFRvdGFseyRVc2VySUR9ICs9ICRQcm9qZWN0VGltZXskQWN0aW9uSUR9eyRVc2VySUR9e0hvdXJzfSB8fCAwOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSG91cnMgPT4gc3ByaW50ZiggIiUuMmYiLCAkUHJvamVjdFRpbWV7JEFjdGlvbklEfXskVXNlcklEfXtIb3Vyc30gfHwgMCApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFRvdGFsCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBIb3VycyA9PiBzcHJpbnRmKCAiJS4yZiIsICRUb3RhbEhvdXJzICksIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtUb3RhbEFsbH0gPSAwOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRTaG93blVzZXJzeyRhfSBjbXAgJFNob3duVXNlcnN7JGJ9IH0ga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgJFBhcmFte1RvdGFsQWxsfSArPSAkVG90YWx7JFVzZXJJRH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VyVG90YWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFRvdGFsID0+IHNwcmludGYoICIlLjJmIiwgJFRvdGFseyRVc2VySUR9ICksIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17VG90YWxBbGx9ID0gc3ByaW50ZiggIiUuMmYiLCAkUGFyYW17VG90YWxBbGx9ICk7CgogICAgICAgIG15IEBQcm9qZWN0SGlzdG9yeUFycmF5ID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RIaXN0b3J5KAogICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFBhcmFte1Byb2plY3RJRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFJvdyAoQFByb2plY3RIaXN0b3J5QXJyYXkpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBVc2VyICAgPT4gJFJvdy0+e1VzZXJ9LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkUm93LT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBSZW1hcmsgPT4gJFJvdy0+e1JlbWFya30gfHwgJy0tJywKICAgICAgICAgICAgICAgICAgICBQZXJpb2QgPT4gJFJvdy0+e1BlcmlvZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0ZSAgID0+ICRSb3ctPntEYXRlfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGhlIHRvdGFsIHN1bSBvZiBob3VycyBhdCB0aGUgZW5kIG9mIHRoZSBoaXN0b3J5IGxpc3QKICAgICAgICAjIEkgYWxzbyBjYW4gdXNlICRQYXJhbXtUb3RhbEFsbH0KICAgICAgICBteSAkUHJvamVjdFRvdGFsSG91cnMgPSAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fS0+UHJvamVjdFRvdGFsSG91cnMoCiAgICAgICAgICAgIFByb2plY3RJRCA9PiAkUGFyYW17UHJvamVjdElEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIaXN0b3J5VG90YWwnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhpc3RvcnlUb3RhbCA9PiAkUHJvamVjdFRvdGFsSG91cnMgfHwgMCwKICAgICAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVGl0bGUgPT4gJ1Byb2plY3RSZXBvcnRpbmcnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpbWVBY2NvdW50aW5nUHJvamVjdFJlcG9ydGluZycKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzaG93IGVycm9yIHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdJbnZhbGlkIFN1YmFjdGlvbiBwcm9jZXNzIScgKTsKfQoKc3ViIF9GaXJzdFVzZXJSZWRpcmVjdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZm9yIGluaXRpYWwgdXNlaW5nLCB0aGUgZmlyc3QgYWdlbnQgd2l0aCBydy1yaWdodCB3aWxsIGJlIHJlZGlyZWN0ZWQKICAgICMgdG8gJ1NldHRpbmcnLiBUaGVuIGhlIGNhbiBkbyB0aGUgaW5pdGlhbCBzZXR0aW5ncwoKICAgIG15ICVHcm91cExpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICk7CiAgICBmb3IgKCBrZXlzICVHcm91cExpc3QgKSB7CiAgICAgICAgaWYgKCAkR3JvdXBMaXN0eyRffSBlcSAndGltZV9hY2NvdW50aW5nJyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGltZUFjY291bnRpbmcmIiAuICJTdWJhY3Rpb249U2V0dGluZyIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICJObyBVc2VyUGVyaW9kIGF2YWlsYWJsZSwgcGxlYXNlIGNvbnRhY3QgdGhlIHRpbWUgYWNjb3VudGluZyBhZG1pbiB0byBpbnNlcnQgeW91ciBVc2VyUGVyaW9kISIKICAgICk7Cn0KCnN1YiBfQWN0aW9uTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVBY3Rpb25MaXN0OwogICAgbXkgJUFjdGlvbiA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKICAgICMgZ2V0IGFjdGlvbiBzZXR0aW5ncwogICAgQUNUSU9OSUQ6CiAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAlQWN0aW9uICkgewogICAgICAgIG5leHQgQUNUSU9OSUQgaWYgISRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb25TdGF0dXN9OwogICAgICAgIG5leHQgQUNUSU9OSUQgaWYgISRBY3Rpb257JEFjdGlvbklEfXtBY3Rpb259OwogICAgICAgICRBY3Rpb25MaXN0eyRBY3Rpb25JRH0gPSAkQWN0aW9ueyRBY3Rpb25JRH17QWN0aW9ufTsKICAgIH0KICAgICRBY3Rpb25MaXN0eycnfSA9ICcnOwoKICAgIHJldHVybiAlQWN0aW9uTGlzdDsKfQoKc3ViIF9BY3Rpb25MaXN0Q29uc3RyYWludHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTGlzdDsKICAgIGlmICggJFBhcmFte1Byb2plY3RJRH0gJiYga2V5cyAleyAkUGFyYW17QWN0aW9uTGlzdENvbnN0cmFpbnRzfSB9ICkgewoKICAgICAgICBteSAkUHJvamVjdE5hbWU7CgogICAgICAgIFBST0pFQ1Q6CiAgICAgICAgZm9yIG15ICRQcm9qZWN0ICggQHsgJFBhcmFte1Byb2plY3RMaXN0fSB9ICkgewogICAgICAgICAgICBpZiAoICRQcm9qZWN0LT57S2V5fSBlcSAkUGFyYW17UHJvamVjdElEfSApIHsKICAgICAgICAgICAgICAgICRQcm9qZWN0TmFtZSA9ICRQcm9qZWN0LT57VmFsdWV9OwogICAgICAgICAgICAgICAgbGFzdCBQUk9KRUNUOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIGRlZmluZWQoJFByb2plY3ROYW1lKSApIHsKCiAgICAgICAgICAgICMgbG9vcCBvdmVyIGFjdGlvbnMgdG8gZmluZCBtYXRjaGVzIGZvciBjb25maWd1cmVkIHByb2plY3QKICAgICAgICAgICAgIyBhbmQgYWN0aW9uIHJlZ2V4cCBwYWlycwogICAgICAgICAgICBmb3IgbXkgJEFjdGlvbklEICgga2V5cyAleyAkUGFyYW17QWN0aW9uTGlzdH0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkQWN0aW9uTmFtZSA9ICRQYXJhbXtBY3Rpb25MaXN0fS0+eyRBY3Rpb25JRH07CgogICAgICAgICAgICAgICAgUkVHRVhQOgogICAgICAgICAgICAgICAgZm9yIG15ICRQcm9qZWN0TmFtZVJlZ0V4cCAoIGtleXMgJXsgJFBhcmFte0FjdGlvbkxpc3RDb25zdHJhaW50c30gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWN0aW9uTmFtZVJlZ0V4cCA9ICRQYXJhbXtBY3Rpb25MaXN0Q29uc3RyYWludHN9LT57JFByb2plY3ROYW1lUmVnRXhwfTsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRQcm9qZWN0TmFtZSAgID1+IG17JFByb2plY3ROYW1lUmVnRXhwfXNteAogICAgICAgICAgICAgICAgICAgICAgICAmJiAkQWN0aW9uTmFtZSA9fiBteyRBY3Rpb25OYW1lUmVnRXhwfXNteAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkTGlzdHskQWN0aW9uSUR9ID0gJEFjdGlvbk5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUkVHRVhQOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFsbCBhdmFpbGFibGUgYWN0aW9ucyB3aWxsIGJlIGFkZGVkIGlmIG5vIGFjdGlvbiB3YXMgYWRkZWQgYWJvdmUgKHBvc3NpYmxlIG1pc2NvbmZpZ3VyYXRpb24pCiAgICBpZiAoICFrZXlzICVMaXN0ICkgewogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICV7ICRQYXJhbXtBY3Rpb25MaXN0fSB9ICkgewogICAgICAgICAgICBteSAkQWN0aW9uTmFtZSA9ICRQYXJhbXtBY3Rpb25MaXN0fS0+eyRBY3Rpb25JRH07CiAgICAgICAgICAgICRMaXN0eyRBY3Rpb25JRH0gPSAkQWN0aW9uTmFtZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlTGlzdDsKfQoKc3ViIF9Qcm9qZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYXQgZmlyc3QgYSBlbXB0eSBsaW5lCiAgICBteSBATGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICcnLAogICAgICAgICAgICBWYWx1ZSA9PiAnJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBwcm9qZWN0IHNldHRpbmdzCiAgICBteSAlUHJvamVjdCA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Qcm9qZWN0U2V0dGluZ3NHZXQoCiAgICAgICAgU3RhdHVzID0+ICd2YWxpZCcsCiAgICApOwoKICAgIGlmICggISRTZWxmLT57TGFzdFByb2plY3RzUmVmfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIGxhc3QgcHJvamVjdHMKICAgICAgICBteSBATGFzdFByb2plY3RzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPkxhc3RQcm9qZWN0c09mVXNlcigpOwoKICAgICAgICAjIGFkZCB0aGUgZmF2b3JpdHMKICAgICAgICAleyAkU2VsZi0+e0xhc3RQcm9qZWN0c1JlZn0gfSA9IG1hcCB7ICRfID0+IDEgfSBATGFzdFByb2plY3RzOwogICAgfQoKICAgIFBST0pFQ1RJRDoKICAgIGZvciBteSAkUHJvamVjdElEICgKICAgICAgICBzb3J0IHsgJFByb2plY3R7UHJvamVjdH17JGF9IGNtcCAkUHJvamVjdHtQcm9qZWN0fXskYn0gfQogICAgICAgIGtleXMgJXsgJFByb2plY3R7UHJvamVjdH0gfQogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IFBST0pFQ1RJRCBpZiAhJFNlbGYtPntMYXN0UHJvamVjdHNSZWZ9LT57JFByb2plY3RJRH07CiAgICAgICAgbXkgJUhhc2ggPSAoCiAgICAgICAgICAgIEtleSAgID0+ICRQcm9qZWN0SUQsCiAgICAgICAgICAgIFZhbHVlID0+ICRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9LAogICAgICAgICk7CiAgICAgICAgcHVzaCBATGlzdCwgXCVIYXNoOwoKICAgICAgICAjIGF0IHRoZSBtb21lbnQgaXQgaXMgbm90IHBvc3NpbGJlIG1hcmsgdGhlIHNlbGVjdGVkIHByb2plY3QKICAgICAgICAjIGluIHRoZSBmYXZvcml0IGxpc3QgKEkgdGhpbmsgYSBidWcgaW4gQnVpbGQgc2VsZWN0aW9uPyEpCiAgICB9CgogICAgIyBhZGQgdGhlIHNlcGVyYXRvcgogICAgcHVzaCBATGlzdCwgewogICAgICAgIEtleSAgICAgID0+ICcwJywKICAgICAgICBWYWx1ZSAgICA9PiAnLS0tLS0tLS0tLS0tLS0tLS0tLS0nLAogICAgICAgIERpc2FibGVkID0+IDEsCiAgICB9OwoKICAgICMgYWRkIGFsbCBhbGxvd2VkIHByb2plY3RzIHRvIHRoZSBsaXN0CiAgICBQUk9KRUNUSUQ6CiAgICBmb3IgbXkgJFByb2plY3RJRCAoCiAgICAgICAgc29ydCB7ICRQcm9qZWN0e1Byb2plY3R9eyRhfSBjbXAgJFByb2plY3R7UHJvamVjdH17JGJ9IH0KICAgICAgICBrZXlzICV7ICRQcm9qZWN0e1Byb2plY3R9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBQUk9KRUNUSUQgaWYgISRQcm9qZWN0e1Byb2plY3R9eyRQcm9qZWN0SUR9OwogICAgICAgIG15ICVIYXNoID0gKAogICAgICAgICAgICBLZXkgICA9PiAkUHJvamVjdElELAogICAgICAgICAgICBWYWx1ZSA9PiAkUHJvamVjdHtQcm9qZWN0fXskUHJvamVjdElEfSwKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte1NlbGVjdGVkSUR9ICYmICRQYXJhbXtTZWxlY3RlZElEfSBlcSAkUHJvamVjdElEICkgewogICAgICAgICAgICAkSGFzaHtTZWxlY3RlZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBATGlzdCwgXCVIYXNoOwogICAgfQoKICAgIEBMaXN0ID0gJFNlbGYtPl9Qcm9qZWN0TGlzdENvbnN0cmFpbnRzKAogICAgICAgIExpc3QgPT4gXEBMaXN0LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NlbGVjdGVkSUR9IHx8ICcnLAogICAgKTsKCiAgICByZXR1cm4gXEBMaXN0Owp9CgpzdWIgX1Byb2plY3RMaXN0Q29uc3RyYWludHMKewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATGlzdDsKICAgIG15ICRQcm9qZWN0Q291bnQgPSAwOwogICAgbXkgJFByb2plY3RMaXN0Q29uc3RyYWludHMKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6UHJvamVjdExpc3RDb25zdHJhaW50cycpOwoKICAgIGlmICgga2V5cyAleyRQcm9qZWN0TGlzdENvbnN0cmFpbnRzfSApIHsKCiAgICAgICAgIyBnZXQgZ3JvdXBzIG9mIGN1cnJlbnQgdXNlcgogICAgICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwogICAgICAgICVHcm91cHMgPSBtYXAgeyAkR3JvdXBzeyRffSA9PiAxIH0ga2V5cyAlR3JvdXBzOwoKICAgICAgICAjIGdldCBwcm9qZWN0IGxpc3QgY29uc3RyYWludHMKICAgICAgICBteSAlUHJvamVjdFJlZ2V4OwogICAgICAgIGZvciBteSAkUHJvamVjdFJlZ2V4ICgga2V5cyAleyRQcm9qZWN0TGlzdENvbnN0cmFpbnRzfSApIHsKICAgICAgICAgICAgZm9yIG15ICRQcm9qZWN0R3JvdXAgKCBzcGxpdCAvLFxzKi8sICRQcm9qZWN0TGlzdENvbnN0cmFpbnRzLT57JFByb2plY3RSZWdleH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRHcm91cHN7JFByb2plY3RHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFByb2plY3RSZWdleHskUHJvamVjdFJlZ2V4fSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgQFByb2plY3RSZWdleCA9IGtleXMgJVByb2plY3RSZWdleDsKCiAgICAgICAgIyByZWR1Y2UgcHJvamVjdCBsaXN0IGFjY29yZGluZyB0byBjb25maWd1cmF0aW9uCiAgICAgICAgaWYgKCByZWYoICRQYXJhbXtMaXN0fSApICYmIEBQcm9qZWN0UmVnZXggKSB7CgogICAgICAgICAgICBteSAkRWxlbWVudENvdW50ID0gMDsKCiAgICAgICAgICAgIGZvciBteSAkUHJvamVjdCAoIEB7ICRQYXJhbXtMaXN0fSB9ICkgewogICAgICAgICAgICAgICAgbXkgJFByb2plY3ROYW1lID0gJFByb2plY3QtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgIyBlbXB0eSBmaXJzdCBlbGVtZW50LCBsYXN0IHByb2plY3RzIHNlcGFyYXRvciBhbmQgY3VycmVudGx5IHNlbGVjdGVkIHByb2plY3QKICAgICAgICAgICAgICAgIGlmICggISRFbGVtZW50Q291bnQgfHwgISRQcm9qZWN0LT57S2V5fSB8fCAkUHJvamVjdC0+e0tleX0gZXEgJFBhcmFte1NlbGVjdGVkSUR9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQExpc3QsICRQcm9qZWN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgUFJPSkVDVFJFR0VYUDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFByb2plY3RSZWdleCAoQFByb2plY3RSZWdleCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRQcm9qZWN0TmFtZSA9fiBteyRQcm9qZWN0UmVnZXh9c214ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATGlzdCwgJFByb2plY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUHJvamVjdENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFBST0pFQ1RSRUdFWFA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRWxlbWVudENvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojIGdldCBmdWxsIHByb2plY3QgbGlzdCBpZiBjb25zdHJhaW50cyByZXN1bHRlZCBpbiBlbXB0eSBwcm9qZWN0IGxpc3Qgb3IgaWYgY29uc3RyYWludHMgYXJlbid0IGNvbmZpZ3VyZWQgKHBvc3NpYmxlIG1pc2NvbmZpZ3VyYXRpb24pCiAgICBpZiAoICEkUHJvamVjdENvdW50ICkgewogICAgICAgIEBMaXN0ID0gQHsgJFBhcmFte0xpc3R9IH07CiAgICB9CgogICAgcmV0dXJuIEBMaXN0Owp9CgojIGludGVncmF0ZSB0aGUgaGFuZGxpbmcgZm9yIHJlcXVpcmVkIHJlbWFya3MgaW4gcmVsYXRpb24gdG8gcHJvamVjdHMKCnN1YiBfUHJvamVjdDJSZW1hcmtSZWdFeHAgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSBAUHJvamVjdHMyUmVtYXJrID0gKCk7CiAgICBteSAlUHJvamVjdERhdGEgICAgID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPlByb2plY3RTZXR0aW5nc0dldCgKICAgICAgICBTdGF0dXMgPT4gJ3ZhbGlkJywKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OlByb2plY3QyUmVtYXJrUmVnRXhwJyk7CgogICAgbXkgJFByb2plY3QyUmVtYXJrUmVnRXhwID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpQcm9qZWN0MlJlbWFya1JlZ0V4cCcpOwoKICAgIGZvciBteSAkUHJvamVjdElEICgga2V5cyAleyAkUHJvamVjdERhdGF7UHJvamVjdH0gfSApIHsKICAgICAgICBpZiAoICRQcm9qZWN0RGF0YXtQcm9qZWN0fXskUHJvamVjdElEfSA9fiBteyRQcm9qZWN0MlJlbWFya1JlZ0V4cH1zbXggKSB7CiAgICAgICAgICAgIHB1c2ggQFByb2plY3RzMlJlbWFyaywgJFByb2plY3RJRDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGpvaW4gJ3wnLCBAUHJvamVjdHMyUmVtYXJrOwp9CjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9Ob3RpZmljYXRpb25UaW1lQWNjb3VudGluZy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTm90aWZpY2F0aW9uVGltZUFjY291bnRpbmcucG0sdiAxLjYgMjAwOS0wNC0wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Tm90aWZpY2F0aW9uVGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntUaW1lT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RpbWVBY2NvdW50aW5nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksICk7CiAgICBteSAlVXNlciA9ICRTZWxmLT57VGltZUFjY291bnRpbmdPYmplY3R9LT5Vc2VyQ3VycmVudFBlcmlvZEdldCgKICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgPT4gJERheSwKICAgICk7CiAgICBpZiAoICRVc2VyeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICBteSAlSW5jb21wbGV0ZVdvcmtpbmdEYXlzID0gJFNlbGYtPntUaW1lQWNjb3VudGluZ09iamVjdH0tPldvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKTsKCiAgICAgICAgIyByZWRpcmVjdCBpZiBpbmNvbXBsZXRlIHdvcmtpbmcgZGF5IGFyZSBvdXQgb2YgcmFuZ2UKICAgICAgICBpZiAoICRJbmNvbXBsZXRlV29ya2luZ0RheXN7V2FybmluZ30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIEluZm8gICAgID0+ICdQbGVhc2UgaW5zZXJ0IHlvdXIgd29ya2luZyBob3VycyEnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAnJzsKfQoKMTsK
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWxldGUgYSBkYXkgb2YgdGltZWFjY291bnRpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdEZWxldGUuZHRsLHYgMS4yIDIwMDktMDQtMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJEZWxldGUifTogJFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAgPHRyPgojICAgIDx0ZCBjbGFzcz0ibWVudSI+CiMgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgojICAgIDwvdGQ+CiMgIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgID4kVGV4dHsiRGVsZXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IlRpbWVBY2NvdW50aW5nIG9mIn0gJFFEYXRheyJZZWFyIn0tJFFEYXRheyJNb250aCJ9LSRRRGF0YXsiRGF5In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgT2JqZWN0In0/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kUURhdGF7IlllYXIifSZNb250aD0kUURhdGF7Ik1vbnRoIn0mRGF5PSRRRGF0YXsiRGF5In0iIj4kVGV4dHsiTm8ifTwvYT4gPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJlllYXI9JFFEYXRheyJZZWFyIn0mTW9udGg9JFFEYXRheyJNb250aCJ9JkRheT0kUURhdGF7IkRheSJ9Ij4kVGV4dHsiWWVzIn08L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIGVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGltZUFjY291bnRpbmdFZGl0LmR0bCx2IDEuMjggMjAxMC0wNi0yNCAxMjozNTo1OCBqcCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLUNTUyBmaWxlIChkZWZhdWx0IFlVSSBTYW0gU2tpbikgLS0+CjxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9hdXRvY29tcGxldGUvYXNzZXRzL3NraW5zL3NhbS9hdXRvY29tcGxldGUuY3NzIj4KCjwhLS0gRGVwZW5kZW5jaWVzIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6WVVJUGF0aCJ9YnVpbGQveWFob28tZG9tLWV2ZW50L3lhaG9vLWRvbS1ldmVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9kYXRhc291cmNlL2RhdGFzb3VyY2UtbWluLmpzIj48L3NjcmlwdD4KCjwhLS0gT1BUSU9OQUw6IEFuaW1hdGlvbiAocmVxdWlyZWQgb25seSBpZiBlbmFibGluZyBhbmltYXRpb24pIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6WVVJUGF0aCJ9YnVpbGQvYW5pbWF0aW9uL2FuaW1hdGlvbi1taW4uanMiPjwvc2NyaXB0PgoKPCEtLSBTb3VyY2UgZmlsZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUtbWluLmpzIj48L3NjcmlwdD4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci5Qcm9qZWN0QXV0b0NvbXBsZXRlIHsKICAgIHdpZHRoOjM2ZW07IC8qIHNldCB3aWR0aCBoZXJlIG9yIGVsc2Ugd2lkZ2V0IHdpbGwgZXhwYW5kIHRvIGZpdCBpdHMgY29udGFpbmVyICovCiAgICBwYWRkaW5nLWJvdHRvbTowLjVlbTsKfQouQWN0aW9uQXV0b0NvbXBsZXRlIHsKICAgIHdpZHRoOjMwZW07IC8qIHNldCB3aWR0aCBoZXJlIG9yIGVsc2Ugd2lkZ2V0IHdpbGwgZXhwYW5kIHRvIGZpdCBpdHMgY29udGFpbmVyICovCiAgICBwYWRkaW5nLWJvdHRvbTowLjVlbTsKfQo8L3N0eWxlPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgovLwovLyBBdXRvQ29tcGxldGlvbiBub3QgZmluaXNoZWQgeWV0LCBpdCBpcyBjdXJyZW50bHkgZGVhY3RpdmF0ZWQKLy8KCi8vIEluaXRpYWxpemVzIEF1dG9jb21wbGV0aW9uIGZvciBJbnB1dCBmaWVsZAovLyBGaWVsZE5hbWUgY29udGFpbnMgZWl0aGVyICJQcm9qZWN0IiBvciAiQWN0aW9uIgovLyBSb3dOdW1iZXIgY29udGFpbnMgbnVtYmVyIG9mIHJvdyAoMSB0byAxNikKZnVuY3Rpb24gaW5pdEF1dG9Db21wbGV0aW9uSW5wdXQoRmllbGROYW1lLCBSb3dOdW1iZXIpIHsKCiAgICB2YXIgRG9tID0gWUFIT08udXRpbC5Eb207CgogICAgJFFEYXRheyJKU1Byb2plY3RMaXN0In0KICAgIHZhciBteVByb2plY3RzID0gSlNQcm9qZWN0TGlzdFtSb3dOdW1iZXJdOwoKICAgIC8vIERlZmluZSBhIGN1c3RvbSBzZWFyY2ggZnVuY3Rpb24gZm9yIHRoZSBEYXRhU291cmNlCiAgICB2YXIgbWF0Y2hOYW1lcyA9IGZ1bmN0aW9uKHNRdWVyeSkgewogICAgICAgIC8vIENhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcKICAgICAgICB2YXIgcXVlcnkgPSBkZWNvZGVVUklDb21wb25lbnQoc1F1ZXJ5LnRvTG93ZXJDYXNlKCkpLAogICAgICAgICAgICBjb250YWN0LAogICAgICAgICAgICBpPTAsCiAgICAgICAgICAgIGw9bXlQcm9qZWN0cy5sZW5ndGgsCiAgICAgICAgICAgIG1hdGNoZXMgPSBbXTsKCiAgICAgICAgLy8gTWF0Y2ggYWdhaW5zdCBlYWNoIG5hbWUgb2YgZWFjaCBjb250YWN0CiAgICAgICAgZm9yKDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgY29udGFjdCA9IG15UHJvamVjdHNbaV07CiAgICAgICAgICAgIGlmKCAoY29udGFjdC5uYW1lICYmIChjb250YWN0Lm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHF1ZXJ5KSA+IC0xKSkgfHwgcXVlcnkgPT0gJyAnICkgewogICAgICAgICAgICAgICAgbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aF0gPSBjb250YWN0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWF0Y2hlczsKICAgIH07CgogICAgLy8gVXNlIGEgRnVuY3Rpb25EYXRhU291cmNlCiAgICB2YXIgb0RTID0gbmV3IFlBSE9PLnV0aWwuRnVuY3Rpb25EYXRhU291cmNlKG1hdGNoTmFtZXMpOwogICAgb0RTLnJlc3BvbnNlU2NoZW1hID0gewogICAgICAgIGZpZWxkczogWyJpZCIsICJuYW1lIl0KICAgIH0KCiAgICAvLyBJbnN0YW50aWF0ZSBBdXRvQ29tcGxldGUKICAgIHZhciBvQUMgPSBuZXcgWUFIT08ud2lkZ2V0LkF1dG9Db21wbGV0ZShGaWVsZE5hbWUgKyAiQXV0b0NvbXBsZXRlSW5wdXRbIiArIFJvd051bWJlciArICJdIiwgRmllbGROYW1lICsgIkF1dG9Db21wbGV0ZUNvbnRhaW5lclsiICsgUm93TnVtYmVyICsgIl0iLCBvRFMpOwogICAgLy9vQUMudXNlSUZyYW1lID0gdHJ1ZTsKICAgIG9BQy51c2VTaGFkb3cgPSB0cnVlOwogICAgb0FDLnJlc3VsdFR5cGVMaXN0ID0gZmFsc2U7CiAgICAvL29BQy5mb3JjZVNlbGVjdGlvbiA9IHRydWU7CgoKICAgIC8vIEN1c3RvbSBmb3JtYXR0ZXIgdG8gaGlnaGxpZ2h0IHRoZSBtYXRjaGluZyBsZXR0ZXJzCiAgICBvQUMuZm9ybWF0UmVzdWx0ID0gZnVuY3Rpb24ob1Jlc3VsdERhdGEsIHNRdWVyeSwgc1Jlc3VsdE1hdGNoKSB7CiAgICAgICAgdmFyIHF1ZXJ5ID0gc1F1ZXJ5LnRvTG93ZXJDYXNlKCksCgogICAgICAgICAgICBuYW1lID0gb1Jlc3VsdERhdGEubmFtZSB8fCAiIiwgLy8gR3VhcmQgYWdhaW5zdCBudWxsIHZhbHVlCiAgICAgICAgICAgIHF1ZXJ5ID0gc1F1ZXJ5LnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgIG5hbWVNYXRjaEluZGV4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocXVlcnkpLAogICAgICAgICAgICBkaXNwbGF5bmFtZTsKCiAgICAgICAgaWYobmFtZU1hdGNoSW5kZXggPiAtMSkgewogICAgICAgICAgICBkaXNwbGF5bmFtZSA9IGhpZ2hsaWdodE1hdGNoKG5hbWUsIHF1ZXJ5LCBuYW1lTWF0Y2hJbmRleCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkaXNwbGF5bmFtZSA9IG5hbWUgPyBuYW1lIDogIiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZGlzcGxheW5hbWU7CiAgICB9OwoKICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIGZvcm1hdHRlcgogICAgdmFyIGhpZ2hsaWdodE1hdGNoID0gZnVuY3Rpb24oZnVsbCwgc25pcHBldCwgbWF0Y2hpbmRleCkgewogICAgICAgIHJldHVybiBmdWxsLnN1YnN0cmluZygwLCBtYXRjaGluZGV4KSArCiAgICAgICAgICAgICAgICAiPHNwYW4gY2xhc3M9J21hdGNoJz4iICsKICAgICAgICAgICAgICAgIGZ1bGwuc3Vic3RyKG1hdGNoaW5kZXgsIHNuaXBwZXQubGVuZ3RoKSArCiAgICAgICAgICAgICAgICAiPC9zcGFuPiIgKwogICAgICAgICAgICAgICAgZnVsbC5zdWJzdHJpbmcobWF0Y2hpbmRleCArIHNuaXBwZXQubGVuZ3RoKTsKICAgIH07CgogICAgLy8gRGVmaW5lIGFuIGV2ZW50IGhhbmRsZXIgdG8gcG9wdWxhdGUgYSBoaWRkZW4gZm9ybSBmaWVsZAogICAgLy8gd2hlbiBhbiBpdGVtIGdldHMgc2VsZWN0ZWQgYW5kIHBvcHVsYXRlIHRoZSBpbnB1dCBmaWVsZAogICAgdmFyIG15SGlkZGVuRmllbGQgPSBZQUhPTy51dGlsLkRvbS5nZXQoRmllbGROYW1lICsgIklEWyIgKyBSb3dOdW1iZXIgKyAiXSIpOwogICAgdmFyIG15SGFuZGxlciA9IGZ1bmN0aW9uKHNUeXBlLCBhQXJncykgewogICAgICAgIHZhciBteUFDID0gYUFyZ3NbMF07IC8vIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBBQyBpbnN0YW5jZQogICAgICAgIHZhciBlbExJID0gYUFyZ3NbMV07IC8vIHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0ZWQgTEkgZWxlbWVudAogICAgICAgIHZhciBvRGF0YSA9IGFBcmdzWzJdOyAvLyBvYmplY3QgbGl0ZXJhbCBvZiBzZWxlY3RlZCBpdGVtJ3MgcmVzdWx0IGRhdGEKCiAgICAgICAgLy8gdXBkYXRlIGhpZGRlbiBmb3JtIGZpZWxkIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0ncyBJRAogICAgICAgIG15SGlkZGVuRmllbGQudmFsdWUgPSBvRGF0YS5pZDsKCiAgICAgICAgbXlBQy5nZXRJbnB1dEVsKCkudmFsdWUgPSBvRGF0YS5uYW1lID8gb0RhdGEubmFtZSA6ICIiOwogICAgfTsKCiAgICBvQUMuaXRlbVNlbGVjdEV2ZW50LnN1YnNjcmliZShteUhhbmRsZXIpOwoKICAgIHJldHVybiB7CiAgICAgICAgb0RTOiBvRFMsCiAgICAgICAgb0FDOiBvQUMKICAgIH07Cn07CgovLyBJbml0aWFsaXplIEF1dG9jb21wbGV0aW9uIGZvciBwcm9qZWN0IGFuZCBhY3Rpb24gc2VsZWN0aW9uCnZhciBQcm9qZWN0QUNPYmplY3RzID0gbmV3IEFycmF5KCk7CnZhciBBY3Rpb25BQ09iamVjdHMgPSBuZXcgQXJyYXkoKTsKdmFyIEV2ZW50ID0gWUFIT08udXRpbC5FdmVudDsKRXZlbnQub25ET01SZWFkeShmdW5jdGlvbigpIHsKICAgIC8vIGFkZCB5dWkgY3NzIHRvIGJvZHkgdGFnCiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9ICJ5dWktc2tpbi1zYW0iOwoKICAgIC8vIGluaXRpYWxpemUgQXV0b2NvbXBsZXRpb24gZm9yIHNlbGVjdGlvbiBvZiBwcm9qZWN0cyBhbmQgYWN0aW9ucwogICAgZm9yICh2YXIgUm93TnVtYmVyID0gMTsgUm93TnVtYmVyIDwgMTY7IFJvd051bWJlcisrKSB7CiAgICAgICAgUHJvamVjdEFDT2JqZWN0c1tSb3dOdW1iZXJdID0gaW5pdEF1dG9Db21wbGV0aW9uSW5wdXQoIlByb2plY3QiLCBSb3dOdW1iZXIpOwogICAgICAgIC8vQWN0aW9uQUNPYmplY3RzW1Jvd051bWJlcl0gPSBpbml0QXV0b0NvbXBsZXRpb25JbnB1dCgiQWN0aW9uIiwgUm93TnVtYmVyKTsKICAgIH0KfSk7CgpmdW5jdGlvbiBDbGVhckF1dG9Db21wbGV0aW9uSUQoRmllbGROYW1lLCBSb3dOdW1iZXIpIHsKICAgIHZhciBUZXh0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEZpZWxkTmFtZSArICJBdXRvQ29tcGxldGVJbnB1dFsiICsgUm93TnVtYmVyICsgIl0iKTsKICAgIHZhciBJREVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChGaWVsZE5hbWUgKyAiSURbIiArIFJvd051bWJlciArICJdIik7CiAgICBpZiAoVGV4dEVsZW1lbnQudmFsdWUgPT0gJycpIHsKICAgICAgICBJREVsZW1lbnQudmFsdWUgPSAnJzsKICAgIH0KfQoKZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBmb3IgKHZhciBDb3VudGVyID0gMTtDb3VudGVyIDwgMTA7IENvdW50ZXIrKykgewogICAgICAgIHZhciBSZW1hcmsgID0gJ1JlbWFya1snICAgICsgQ291bnRlciArICddJzsKICAgICAgICB2YXIgUHJvamVjdCA9ICdQcm9qZWN0SURbJyArIENvdW50ZXIgKyAnXSc7CgogICAgICAgIGlmICggZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tQcm9qZWN0XS52YWx1ZSApIHsKCiAgICAgICAgICAgIHZhciBSZW1hcmtDaGVjayA9IHByb2plY3RfcmVtYXJrX2NoZWNrKFByb2plY3QpOwoKICAgICAgICAgICAgaWYgKCAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbUHJvamVjdF0udmFsdWUKICAgICAgICAgICAgICAgICYmIFJlbWFya0NoZWNrCiAgICAgICAgICAgICAgICAmJiAgKCFkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1JlbWFya10udmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tSZW1hcmtdLnZhbHVlLmxlbmd0aCA8IDgKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IlBsZWFzZSBhZGQgYSByZW1hcmsgd2l0aCBtb3JlIHRoYW4gOCBjaGFyYWN0ZXJzISJ9Jyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1JlbWFya10uZm9jdXMoKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBwcm9qZWN0X3JlbWFya19jaGVjayhQcm9qZWN0KSB7CgogICAgdmFyIHJlZyA9IC9eKCRRRGF0YXsiUmVtYXJrUmVnRXhwIn0pJC87CgogICAgaWYgKCByZWcudGVzdChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW1Byb2plY3RdLnZhbHVlKSA9PSBmYWxzZSApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKLy8gRmlsbHMgb3B0aW9ucyBvZiBhY3Rpb24gc2VsZWN0aW9uIGFjY29yZGluZyB0byBzZWxlY3RlZCBwcm9qZWN0CmZ1bmN0aW9uIEZpbGxBY3Rpb25MaXN0KFdvcmtpbmdVbml0SUQpIHsKCiAgICB2YXIgUHJvamVjdFNlbGVjdGlvbkluZGV4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIlByb2plY3RJRFsiICsgV29ya2luZ1VuaXRJRCArICJdIikuc2VsZWN0ZWRJbmRleDsKICAgIHZhciBQcm9qZWN0TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJQcm9qZWN0SURbIiArIFdvcmtpbmdVbml0SUQgKyAiXSIpLm9wdGlvbnNbUHJvamVjdFNlbGVjdGlvbkluZGV4XS50ZXh0OwoKICAgIHZhciBBY3Rpb25MaXN0ID0gJFFEYXRheyJKU0FjdGlvbkxpc3QifTsKICAgIHZhciBBY3Rpb25MaXN0Q29uc3RyYWludHMgPSAkUURhdGF7IkpTQWN0aW9uTGlzdENvbnN0cmFpbnRzIn07CiAgICB2YXIgQWN0aW9uU2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkFjdGlvbklEWyIgKyBXb3JraW5nVW5pdElEICsgIl0iKTsKICAgIHZhciBTZWxlY3RlZEFjdGlvbklEID0gQWN0aW9uU2VsZWN0aW9uLnZhbHVlOwoKICAgIC8vIHJlbW92ZSBwcmV2aW91cyBhY3Rpb25zLCBsZWF2ZSBmaXJzdCBlbGVtZW50IChlbXB0eSBlbGVtZW50KQogICAgdmFyIEFjdGlvblNlbGVjdGlvbkxlbmd0aCA9IEFjdGlvblNlbGVjdGlvbi5sZW5ndGg7CiAgICBmb3IgKHZhciBBY3Rpb25TZWxlY3Rpb25JbmRleCA9IDE7IEFjdGlvblNlbGVjdGlvbkluZGV4IDwgQWN0aW9uU2VsZWN0aW9uTGVuZ3RoOyBBY3Rpb25TZWxlY3Rpb25JbmRleCsrKSB7CiAgICAgICAgQWN0aW9uU2VsZWN0aW9uLnJlbW92ZSgxKTsKICAgIH0KCiAgICB2YXIgT3B0aW9uQ291bnQgPSAwOwogICAgZm9yICh2YXIgQWN0aW9uTGlzdEluZGV4ID0gMDsgQWN0aW9uTGlzdEluZGV4IDwgQWN0aW9uTGlzdC5sZW5ndGg7IEFjdGlvbkxpc3RJbmRleCsrKSB7CgogICAgICAgIHZhciBBY3Rpb25JRCA9IEFjdGlvbkxpc3RbQWN0aW9uTGlzdEluZGV4XVswXTsKICAgICAgICB2YXIgQWN0aW9uTmFtZSA9IEFjdGlvbkxpc3RbQWN0aW9uTGlzdEluZGV4XVsxXTsKCiAgICAgICAgZm9yICh2YXIgQWN0aW9uTGlzdENvbnN0cmFpbnRzSW5kZXggPSAwOyBBY3Rpb25MaXN0Q29uc3RyYWludHNJbmRleCA8IEFjdGlvbkxpc3RDb25zdHJhaW50cy5sZW5ndGg7IEFjdGlvbkxpc3RDb25zdHJhaW50c0luZGV4KyspIHsKICAgICAgICAgICAgdmFyIFByb2plY3ROYW1lUmVnRXhwID0gbmV3IFJlZ0V4cChBY3Rpb25MaXN0Q29uc3RyYWludHNbQWN0aW9uTGlzdENvbnN0cmFpbnRzSW5kZXhdWzBdKTsKICAgICAgICAgICAgdmFyIEFjdGlvbk5hbWVSZWdFeHAgPSBuZXcgUmVnRXhwKEFjdGlvbkxpc3RDb25zdHJhaW50c1tBY3Rpb25MaXN0Q29uc3RyYWludHNJbmRleF1bMV0pOwoKICAgICAgICAgICAgLy8gYWRkIGFjdGlvbiB0byBzZWxlY3Rpb24KICAgICAgICAgICAgaWYgKFByb2plY3ROYW1lUmVnRXhwLnRlc3QoUHJvamVjdE5hbWUpICYmIEFjdGlvbk5hbWVSZWdFeHAudGVzdChBY3Rpb25OYW1lKSkgewogICAgICAgICAgICAgICAgQWRkU2VsZWN0aW9uT3B0aW9uKEFjdGlvblNlbGVjdGlvbiwgQWN0aW9uTmFtZSwgQWN0aW9uSUQsIFNlbGVjdGVkQWN0aW9uSUQpOwogICAgICAgICAgICAgICAgT3B0aW9uQ291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBhbGwgYWN0aW9ucyB3aWxsIGJlIGFkZGVkIGlmIG5vIGFjdGlvbiB3YXMgYWRkZWQgYWJvdmUgKHBvc3NpYmxlIG1pc2NvbmZpZ3VyYXRpb24pCiAgICBpZiAoIU9wdGlvbkNvdW50KSB7CiAgICAgICAgLy8gaWdub3JlIGZpcnN0IGVsZW1lbnQgYmVjYXVzZSBpdCdzIHRoZSBlbXB0eSBlbGVtZW50IHdoaWNoIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgbGlzdAogICAgICAgIGZvciAodmFyIEFjdGlvbkxpc3RJbmRleCA9IDE7IEFjdGlvbkxpc3RJbmRleCA8IEFjdGlvbkxpc3QubGVuZ3RoOyBBY3Rpb25MaXN0SW5kZXgrKykgewogICAgICAgICAgICB2YXIgQWN0aW9uSUQgPSBBY3Rpb25MaXN0W0FjdGlvbkxpc3RJbmRleF1bMF07CiAgICAgICAgICAgIHZhciBBY3Rpb25OYW1lID0gQWN0aW9uTGlzdFtBY3Rpb25MaXN0SW5kZXhdWzFdOwogICAgICAgICAgICBBZGRTZWxlY3Rpb25PcHRpb24oQWN0aW9uU2VsZWN0aW9uLCBBY3Rpb25OYW1lLCBBY3Rpb25JRCwgU2VsZWN0ZWRBY3Rpb25JRCk7CiAgICAgICAgfQogICAgfQp9CgovLyBBZGRzIG9wdGlvbiB0byBhIHNlbGVjdGlvbgpmdW5jdGlvbiBBZGRTZWxlY3Rpb25PcHRpb24oU2VsZWN0aW9uRWxlbWVudCwgT3B0aW9uVGV4dCwgT3B0aW9uVmFsdWUsIFNlbGVjdGVkT3B0aW9uKSB7CgogICAgdmFyIE9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgT3B0aW9uLnRleHQgPSBPcHRpb25UZXh0OwogICAgT3B0aW9uLnZhbHVlID0gT3B0aW9uVmFsdWU7CgogICAgaWYgKE9wdGlvblZhbHVlID09IFNlbGVjdGVkT3B0aW9uKSB7CiAgICAgICAgT3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICB0cnkgewogICAgICAgIFNlbGVjdGlvbkVsZW1lbnQuYWRkKE9wdGlvbiwgbnVsbCk7IC8vIEFsbCBidXQgSUUKICAgIH0KICAgIGNhdGNoIChleCkgewogICAgICAgIFNlbGVjdGlvbkVsZW1lbnQuYWRkKE9wdGlvbik7IC8vIE9ubHkgSUUKICAgIH0KfQoKLy8gVGhpcyBmdW5jaXRvbiBtYWtlIHRoZSBpbnZpc2libGUgaW5wdXQgZmllbGRzICg5IC0gMTYpIHZpc2libGUKCmZ1bmN0aW9uIE1vcmVJbnB1dEZpZWxkcygpIHsKICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzldIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1sxMF0iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzExXSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbMTJdIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1sxM10iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJNb3JlRmllbGRzWzE0XSIpLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIk1vcmVGaWVsZHNbMTVdIikuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiTW9yZUZpZWxkc1sxNl0iKS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJMaW5rIikuc3R5bGUudmlzaWJpbGl0eSA9ICJjb2xsYXBzZSI7CiAgICB9Cn0KCi8vLS0+Cjwvc2NyaXB0PgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLlByb2plY3RTZWxlY3Rpb24geyB3aWR0aDo0NTBweDt9Ci5BY3Rpb25TZWxlY3Rpb24geyB3aWR0aDozMDBweDt9Cjwvc3R5bGU+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkVkaXQgdGltZSByZWNvcmQifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJPdmVydmlldyJ9PC9hPgo8IS0tIGR0bDpibG9jazpDcmVhdGVQcm9qZWN0IC0tPgogICAgICAgICAgICAtCiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RTZXR0aW5nIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAgICAgICAgICAgJFRleHR7IlByb2plY3Qgc2V0dGluZ3MifQogICAgICAgICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOkNyZWF0ZVByb2plY3QgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkVkaXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkRhdGUgbmF2aWdhdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRhdGUifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kTFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoQmFjayJ9JkRheT0kTFFEYXRheyJEYXlCYWNrIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWxlZnQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiT25lIGRheSBiYWNrIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1FZGl0JlllYXI9JExRRGF0YXsiWWVhck5leHQifSZNb250aD0kTFFEYXRheyJNb250aE5leHQifSZEYXk9JExRRGF0YXsiRGF5TmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJOZXh0IGRheSJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJEYXlzIHdpdGhvdXQgZW50cmllcyJ9Ogo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlV29ya2luZ0RheXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUVkaXQmWWVhcj0kTFFEYXRheyJZZWFyIn0mTW9udGg9JExRRGF0YXsiTW9udGgifSZEYXk9JExRRGF0YXsiRGF5In0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJCb2xkU3RhcnQifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkJvbGRFbmQifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlV29ya2luZ0RheXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmNvbXBsZXRlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3RhdHVzIiAgICB2YWx1ZT0iQWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJZZWFyIiAgICAgIHZhbHVlPSIkUURhdGF7IlllYXIifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTW9udGgiICAgICB2YWx1ZT0iJFFEYXRheyJNb250aCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJEYXkiICAgICAgIHZhbHVlPSIkUURhdGF7IkRheSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkRhdGUifTogJFRleHR7IiREYXRheyJXZWVrZGF5X3RvX1RleHQifSJ9ICRRRGF0YXsiWWVhciJ9LSRRRGF0YXsiTW9udGgifS0kUURhdGF7IkRheSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6VW5pdEJsb2NrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXJ0In0gKEhIOk1NKTxzcGFuIGNsYXNzPSIkUURhdGF7IkNsYXNzVGltZSJ9Ij4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kIn0gKEhIOk1NKTxzcGFuIGNsYXNzPSIkUURhdGF7IkNsYXNzVGltZSJ9Ij4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIn08c3BhbiBjbGFzcz0iZm9vdG5vdGUiPiRRRGF0YXsiUGVyaW9kTm90ZSJ9PC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgaWQ9Ik1vcmVGaWVsZHNbJFFEYXRheyJJRCJ9XSIgIHN0eWxlPSJ2aXNpYmlsaXR5OiRRRGF0YXsiVmlzaWJpbGl0eSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIHRoZSBmb2xsb3dpbmcgYmxvY2sgd2lsbCBiZSBlbmFibGVkIHdoZW4gcHJvamVjdCBhdXRvY29tcGxldGlvbiBpcyBpbXBsZW1lbnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvamVjdEF1dG9Db21wbGV0ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJQcm9qZWN0QXV0b0NvbXBsZXRlSW5wdXRbJFFEYXRheyJJRCJ9XSIgdHlwZT0idGV4dCIgdmFsdWU9IiRRRGF0YXsiUHJvamVjdE5hbWUifSIgb25jaGFuZ2U9IkNsZWFyQXV0b0NvbXBsZXRpb25JRCgnUHJvamVjdCcsICRRRGF0YXsiSUQifSk7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQcm9qZWN0QXV0b0NvbXBsZXRlQ29udGFpbmVyWyRRRGF0YXsiSUQifV0iPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iUHJvamVjdElEWyRRRGF0YXsiSUQifV0iIG5hbWU9IlByb2plY3RJRFskUURhdGF7IklEIn1dIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIkUURhdGF7IlByb2plY3RJRCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUHJvamVjdE9wdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSB0aGUgZm9sbG93aW5nIGJsb2NrIHdpbGwgYmUgZW5hYmxlZCB3aGVuIGFjdGlvbiBhdXRvY29tcGxldGlvbiBpcyBpbXBsZW1lbnRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uQXV0b0NvbXBsZXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkFjdGlvbkF1dG9Db21wbGV0ZUlucHV0WyRRRGF0YXsiSUQifV0iIHR5cGU9InRleHQiIHZhbHVlPSIkUURhdGF7IkFjdGlvbk5hbWUifSIgb25jaGFuZ2U9IkNsZWFyQXV0b0NvbXBsZXRpb25JRCgnQWN0aW9uJywgJFFEYXRheyJJRCJ9KTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkFjdGlvbkF1dG9Db21wbGV0ZUNvbnRhaW5lclskUURhdGF7IklEIn1dIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkFjdGlvbklETmV3WyRRRGF0YXsiSUQifV0iIG5hbWU9IkFjdGlvbklETmV3WyRRRGF0YXsiSUQifV0iIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiRRRGF0YXsiQWN0aW9uSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkFjdGlvbk9wdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUmVtYXJrWyRRRGF0YXsiSUQifV0iICAgIHZhbHVlPSIkUURhdGF7IlJlbWFyayJ9IiAgICBzaXplPSIzNSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdGFydFRpbWVbJFFEYXRheyJJRCJ9XSIgdmFsdWU9IiRRRGF0YXsiU3RhcnRUaW1lIn0iIHNpemU9IjciPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRW5kVGltZVskUURhdGF7IklEIn1dIiAgIHZhbHVlPSIkUURhdGF7IkVuZFRpbWUifSIgICBzaXplPSI3Ij48L3RkPgo8IS0tIGR0bDpibG9jazpVbml0SW5wdXRQZXJpb2QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iJFFEYXRheyJUZXh0UG9zaXRpb24ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iUGVyaW9kWyRRRGF0YXsiSUQifV0iIHZhbHVlPSIkUURhdGF7IlBlcmlvZCJ9IiBzaXplPSI3Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6VW5pdElucHV0UGVyaW9kIC0tPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249IiRRRGF0YXsiVGV4dFBvc2l0aW9uIn0iPiRRRGF0YXsiUGVyaW9kIn08L3RkPgo8IS0tIGR0bDpibG9jazpVbml0UGVyaW9kV2l0aG91dElucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9InJlcXVpcmVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiREYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0UmVxdWlyZWQgLS0+CjwhLS0gZHRsOmJsb2NrOlVuaXRSZWFkb25seSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9InJlYWRvbmx5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiREYXRheyJEZXNjcmlwdGlvbiJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0UmVhZG9ubHkgLS0+CjwhLS0gZHRsOmJsb2NrOlVuaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiIGlkPSJMaW5rIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpNb3JlSW5wdXRGaWVsZHMoKSIgc3R5bGU9InZpc2liaWxpdHk6JFFEYXRheyJMaW5rVmlzaWJpbGl0eSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLWJpZy5wbmciIGFsdD0iJFRleHR7Ik1vcmUgaW5wdXQgZmllbGRzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVuaXRCbG9jayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgY29sc3Bhbj0iNCI+CjwhLS0gZHRsOmJsb2NrOk90aGVyVGltZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJMZWF2ZURheSIgJERhdGF7IkxlYXZlRGF5In0+JFRleHR7Ik9uIHZhY2F0aW9uIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9IlNpY2siICAgICAkRGF0YXsiU2ljayJ9PiRUZXh0eyJPbiBzaWNrIGxlYXZlIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9Ik92ZXJ0aW1lIiAkRGF0YXsiT3ZlcnRpbWUifT4kVGV4dHsiT24gb3ZlcnRpbWUgbGVhdmUifQo8IS0tIGR0bDpibG9jazpPdGhlclRpbWVzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSIkUURhdGF7IlRleHRQb3NpdGlvbiJ9Ij4kUURhdGF7IlRvdGFsIn0mbmJzcDs8L3RkPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlcXVpcmVkIj4kVGV4dHsiJERhdGF7IkRlc2NyaXB0aW9uIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgo8IS0tIGR0bDpibG9jazpSZWFkb25seSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlYWRvbmx5Ij4kVGV4dHsiJERhdGF7IkRlc2NyaXB0aW9uIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlYWRvbmx5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9IiBuYW1lPSJEZWxldGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlZCI+KiAkVGV4dHsiUmVxdWlyZWQgRmllbGQifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGb290Tm90ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rub3RlIj4qICRUZXh0eyJZb3UgaGF2ZSB0byBpbnNlcnQgYSBzdGFydCBhbmQgYW4gZW5kIHRpbWUgb3IgYSBwZXJpb2QifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGb290Tm90ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rub3RlIj4qICRUZXh0eyJJZiB5b3Ugc2VsZWN0ICJNaXNjZWxsYW5lb3VzIChtaXNjKSIgdGhlIHRhc2ssIHBsZWFzZSBleHBsYWluIHRoaXMgaW4gdGhlIHJlbWFya3MgZmllbGQifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdPdmVydmlldy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHRpbWUgYWNjb3VudGluZyBvdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ092ZXJ2aWV3LmR0bCx2IDEuMjEgMjAwOS0wNC0wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlRpbWUgcmVwb3J0aW5nIG1vbnRobHkgb3ZlcnZpZXcifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIzMyUiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMiIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3ZlcnZpZXcgb2YgIn0gJFFEYXRheyJVc2VyIn08YnI+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249T3ZlcnZpZXcmWWVhcj0kTFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoQmFjayJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICYjMDYwOyYjMDYwOwogICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICZuYnNwOyZuYnNwOwogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXJOZXh0In0mTW9udGg9JExRRGF0YXsiTW9udGhOZXh0In0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJiMwNjI7JiMwNjI7CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiTW9udGhfdG9fVGV4dCJ9In0gJFFEYXRheyJZZWFyIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgIDx0ciAkRGF0YXsiU3R5bGUifT4KICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249JExRRGF0YXsiU3ViYWN0aW9uIn0mWWVhcj0kTFFEYXRheyJZZWFyIn0mTW9udGg9JExRRGF0YXsiTW9udGgifSZEYXk9JExRRGF0YXsiRGF5In0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgJFFEYXRheyJEYXkifQogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPiRUZXh0eyIkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9In08L3RkPgogICAgICAgICAgPHRkPiRUZXh0eyIkUURhdGF7IkNvbW1lbnQifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiV29ya2luZ0hvdXJzIn08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0ibGVmdCI+JFRleHR7IlRvdGFsIGhvdXJzIHdvcmtlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiV29ya2luZ0hvdXJzIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjMzJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnRpbWUgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7Ik92ZXJ0aW1lIChIb3VycykifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJPdmVydGltZSAodGhpcyBtb250aCkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJPdmVydGltZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiT3ZlcnRpbWUgKHRvdGFsKSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7Ik92ZXJ0aW1lVW50aWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYWluaW5nIG92ZXJ0aW1lIGxlYXZlIn06PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiT3ZlcnRpbWVUb3RhbCJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ0aW1lIC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJWYWNhdGlvbiAoRGF5cykifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOyRUZXh0eyJWYWNhdGlvbiB0YWtlbiAodGhpcyBtb250aCkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiVmFjYXRpb24gdGFrZW4gKHRvdGFsKSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5VG90YWwifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYWluaW5nIHZhY2F0aW9uIn06PC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJTaWNrIGxlYXZlIChEYXlzKSJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7JFRleHR7IlNpY2sgbGVhdmUgdGFrZW4gKHRoaXMgbW9udGgpIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiU2ljayJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDskVGV4dHsiU2ljayBsZWF2ZSB0YWtlbiAodG90YWwpIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiU2lja1RvdGFsIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGNsYXNzPSJjb250ZW50Ym9keSIgYm9yZGVyPSIwIiB3aWR0aD0iNTAlIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJVc2VyJ3MgcHJvamVjdCBvdmVydmlldyJ9OgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlByb2plY3RTdGF0dXNTaG93PSRMUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0mVXNlcklEPSRMUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgKCRUZXh0eyJTaG93In0gJFRleHR7IiRRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSJ9ICRUZXh0eyJQcm9qZWN0cyJ9KQogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJNb250aGx5In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJMaWZldGltZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRhc2sifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBY3Rpb24gLS0+CiAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IiREYXRheyJSb3dTcGFuIn0iIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRlbnRrZXkkUURhdGF7IlN0YXR1cyJ9Ij4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdE5vTGluayAtLT4KICAgICAgICAgICAgICAgICAgJERhdGF7IlByb2plY3QifQo8IS0tIGR0bDpibG9jazpQcm9qZWN0Tm9MaW5rIC0tPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UHJvamVjdFJlcG9ydGluZyZQcm9qZWN0SUQ9JFFEYXRheyJQcm9qZWN0SUQifSI+CiAgICAgICAgICAgICAgICAgICREYXRheyJQcm9qZWN0In0KICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0TGluayAtLT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IkdyYW5kIHRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbEhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdQcm9qZWN0UmVwb3J0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHJlcG9ydGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaW1lQWNjb3VudGluZ1Byb2plY3RSZXBvcnRpbmcuZHRsLHYgMS43IDIwMDktMDQtMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiUHJvamVjdCByZXBvcnQifTogJFFEYXRheyJQcm9qZWN0In0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW4ifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBjbGFzcz0iY29udGVudGJvZHkiIGJvcmRlcj0iMCIgd2lkdGg9IjUwJSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgJFRleHR7IlByb2plY3QgcmVwb3J0In06ICRRRGF0YXsiUHJvamVjdCJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlck5hbWUgLS0+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJVc2VyIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyTmFtZSAtLT4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkFjdGlvbiJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiSG91cnMifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvdGFsIn08L3RkPgo8IS0tIGR0bDpibG9jazpVc2VyVG90YWwgLS0+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6VXNlclRvdGFsIC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxBbGwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJIaXN0b3J5In06ICRRRGF0YXsiUHJvamVjdCJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQZXJpb2QifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkRhdGUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJVc2VyIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQWN0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGFsaWduPSJyaWdodCI+JFFEYXRheyJQZXJpb2QifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVRvdGFsIC0tPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJyaWdodCI+JFFEYXRheyJIaXN0b3J5VG90YWwifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkhpc3RvcnlUb3RhbCAtLT4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdSZXBvcnRpbmcuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciB0aW1lIGFjY291bnRpbmcgcmVwb3J0aW5nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nUmVwb3J0aW5nLmR0bCx2IDEuMTcgMjAwOS0wNC0wMyAxMTo0OToyOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJUaW1lIHJlcG9ydGluZyJ9OiAkVGV4dHsiJFFEYXRheyJNb250aF90b19UZXh0In0ifSAkUURhdGF7IlllYXIifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCIgPiRUZXh0eyJNb250aCBuYXZpZ2F0aW9uIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJSZXBvcnRpbmciPgogICAgICAgICAgICAgICREYXRheyJNb250aE9wdGlvbiJ9CiAgICAgICAgICAgICAgJERhdGF7IlllYXJPcHRpb24ifQogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7Ik1vbnRoX3RvX1RleHQifSJ9ICRRRGF0YXsiWWVhciJ9CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kTFFEYXRheyJZZWFyQmFjayJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoQmFjayJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1sZWZ0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik9uZSBkYXkgYmFjayJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1SZXBvcnRpbmcmWWVhcj0kTFFEYXRheyJZZWFyTmV4dCJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoTmV4dCJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1yaWdodC1iaWcucG5nIiBhbHQ9IiRUZXh0eyJOZXh0IGRheSJ9Ij48L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGNsYXNzPSJjb250ZW50Ym9keSIgYm9yZGVyPSIwIiB3aWR0aD0iNTAlIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJVc2VyIHJlcG9ydHMifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+JFRleHR7Ik1vbnRobHkgdG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IkxpZmV0aW1lIHRvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiV29ya2luZyBIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiT3ZlcnRpbWUgbGVhdmUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlZhY2F0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTaWNrIGxlYXZlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJPdmVydGltZSBsZWF2ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGVhdmVEYXkgUmVtYWluaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1PdmVydmlldyZZZWFyPSRMUURhdGF7IlllYXIifSZNb250aD0kTFFEYXRheyJNb250aCJ9JlVzZXJJRD0kTFFEYXRheyJVc2VySUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiVXNlciJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IldvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiZuYnNwOyRRRGF0YXsiT3ZlcnRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkxlYXZlRGF5In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJTaWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Jm5ic3A7JFFEYXRheyJPdmVydGltZVRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJMZWF2ZURheVJlbWFpbmluZyJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlRvdGFsIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbFdvcmtpbmdIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxPdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxMZWF2ZURheSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxTaWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbE92ZXJ0aW1lVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlRvdGFsTGVhdmVEYXlSZW1haW5pbmcifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICRUZXh0eyJQcm9qZWN0IHJlcG9ydHMifToKICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249UmVwb3J0aW5nJlllYXI9JExRRGF0YXsiWWVhciJ9Jk1vbnRoPSRMUURhdGF7Ik1vbnRoIn0mUHJvamVjdFN0YXR1c1Nob3c9JExRRGF0YXsiUHJvamVjdFN0YXR1c1Nob3cifSI+CiAgICAgICAgICAgICgkVGV4dHsiU2hvdyJ9ICRUZXh0eyIkUURhdGF7IlByb2plY3RTdGF0dXNTaG93In0ifSAkVGV4dHsiUHJvamVjdHMifSkKICAgICAgICAgICAgPC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTW9udGhseSB0b3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiTGlmZXRpbWUgdG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQcm9qZWN0In08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJUYXNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiSG91cnMifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdCAtLT4KICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIkRGF0YXsiUm93U3BhbiJ9IiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50a2V5JFFEYXRheyJTdGF0dXMifSI+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RSZXBvcnRpbmcmUHJvamVjdElEPSRRRGF0YXsiUHJvamVjdElEIn0iPgogICAgICAgICAgICAgICAgICAkRGF0YXsiUHJvamVjdCJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb250ZW50dmFsdWUkUURhdGF7IlN0YXR1cyJ9Ij4kRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0kUURhdGF7IlN0YXR1cyJ9IiA+JFFEYXRheyJBY3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSRRRGF0YXsiU3RhdHVzIn0iIGFsaWduPSJyaWdodCI+JFFEYXRheyJIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9JFFEYXRheyJTdGF0dXMifSIgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkhvdXJzVG90YWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiRUZXh0eyJUb3RhbCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxIb3VycyJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiVG90YWxIb3Vyc1RvdGFsIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdTZXR0aW5nLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgdGltZSBhY2NvdW50aW5nIHNldHRpbmdzCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nU2V0dGluZy5kdGwsdiAxLjIxIDIwMDktMDQtMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPCEtLSBkdGw6YmxvY2s6UHJvamVjdFNldHRpbmcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCB0aW1lIGFjY291bnRpbmcgcHJvamVjdCBzZXR0aW5ncyJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW4ifSIgY2xhc3M9Im1lbnVpdGVtIj4KICAgICAgJFRleHR7IkJhY2sifQogICAgICA8L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iUHJvamVjdFNldHRpbmciPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJQcm9qZWN0IHNldHRpbmdzIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgIDx0ciAgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlByb2plY3QifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IkNvbW1lbnRzIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlN0YXR1cyJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcm9qZWN0IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlByb2plY3RbJFFEYXRheyJQcm9qZWN0SUQifV0iIHZhbHVlPSIkUURhdGF7IlByb2plY3QifSIgc2l6ZT0iMzAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjIiIG5hbWU9IlByb2plY3REZXNjcmlwdGlvblskUURhdGF7IlByb2plY3RJRCJ9XSIgY29scz0iNDAiPiRRRGF0YXsiUHJvamVjdERlc2NyaXB0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByb2plY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld1Byb2plY3QiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblByb2plY3QiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvamVjdFNldHRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlNldHRpbmcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiRWRpdCB0aW1lIGFjY291bnRpbmcgc2V0dGluZ3MifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVByb2plY3RTZXR0aW5nIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiUHJvamVjdCBzZXR0aW5ncyJ9CiAgICAgIDwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiVGFzayBzZXR0aW5ncyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRhc2sifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0dXMifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkFjdGlvblskUURhdGF7IkFjdGlvbklEIn1dIiB2YWx1ZT0iJFFEYXRheyJBY3Rpb24ifSIgc2l6ZT0iNDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbiAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV3In0iIG5hbWU9Ik5ld0FjdGlvbiI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgbmFtZT0iQWN0aW9uQWN0aW9uIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8YnI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlVzZXIgc2V0dGluZ3MifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGNvbHNwYW49IjMiPiRRRGF0YXsiVXNlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbW1lbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEZXNjcmlwdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9IjEiIG5hbWU9IkRlc2NyaXB0aW9uWyRRRGF0YXsiVXNlcklEIn1dIiBjb2xzPSI0MCI+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iQ2hlY2tib3giIG5hbWU9IlNob3dPdmVydGltZVskUURhdGF7IlVzZXJJRCJ9XSIgdmFsdWU9IjEiICREYXRheyJTaG93T3ZlcnRpbWUifT4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiU2hvdyBPdmVydGltZSJ9PGJyPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJDaGVja2JveCIgbmFtZT0iQ3JlYXRlUHJvamVjdFskUURhdGF7IlVzZXJJRCJ9XSIgdmFsdWU9IjEiICREYXRheyJDcmVhdGVQcm9qZWN0In0+CiAgICAgICAgICAgICAgICAgICAgJFRleHR7IkFsbG93IHByb2plY3QgY3JlYXRpb24ifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2FsZW5kYXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNhbGVuZGFyT3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRleHR7IlBlcmlvZCBiZWdpbiJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUGVyaW9kIGVuZCJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRGF5cyBvZiB2YWNhdGlvbiJ9PHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiSG91cnMgcGVyIHdlZWsifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiQXV0aG9yaXplZCBvdmVydGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGF0dXMifTxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGVyaW9kIC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkRhdGVTdGFydFskUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiRGF0ZVN0YXJ0In0iIHNpemU9IjEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJEYXRlRW5kWyRRRGF0YXsiVXNlcklEIn1dWyRRRGF0YXsiUGVyaW9kIn1dIiB2YWx1ZT0iJFFEYXRheyJEYXRlRW5kIn0iIHNpemU9IjEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJMZWF2ZURheXNbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7IkxlYXZlRGF5cyJ9IiBzaXplPSI1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXZWVrbHlIb3Vyc1skUURhdGF7IlVzZXJJRCJ9XVskUURhdGF7IlBlcmlvZCJ9XSIgdmFsdWU9IiRRRGF0YXsiV2Vla2x5SG91cnMifSIgc2l6ZT0iNSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iT3ZlcnRpbWVbJFFEYXRheyJVc2VySUQifV1bJFFEYXRheyJQZXJpb2QifV0iIHZhbHVlPSIkUURhdGF7Ik92ZXJ0aW1lIn0iIHNpemU9IjUiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IlN0YXR1c09wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlBlcmlvZCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIGNvbHNwYW49IjMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIHRpbWUgcGVyaW9kIn0iICBuYW1lPSJOZXdVc2VyU2V0dGluZ1skUURhdGF7IlVzZXJJRCJ9XSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGhyPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVc2VyIC0tPgo8IS0tIGR0bDpibG9jazpOZXdVc2VyT3B0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik5ld1VzZXJPcHRpb24ifQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXcifSIgIG5hbWU9Ik5ld1VzZXIiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TmV3VXNlck9wdGlvbiAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG5hbWU9IkFjdGlvblVzZXIiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyIGNsYXNzPSJyZXF1aXJlZCI+PHRkPiogJFRleHR7IlJlcXVpcmVkIEZpZWxkIn08L3RkPjwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2V0dGluZyAtLT4K
IyAtLQojIEFnZW50VGltZUFjY291bnRpbmdWaWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9yIHZpZXcgaW5zZXJ0cyBvZiBvbmUgZGF5CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpbWVBY2NvdW50aW5nVmlldy5kdGwsdiAxLjExIDIwMDktMDQtMDMgMTE6NDk6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJWaWV3IHRpbWUgcmVjb3JkIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbiJ9IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPCEtLSBkdGw6YmxvY2s6VXNlciAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWaWV3IG9mICJ9ICRRRGF0YXsiVXNlciJ9PGJyPjxicj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlVzZXIgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9ImNvbnRlbnRib2R5IiBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJWaWV3Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJJRCIgICAgdmFsdWU9IiRRRGF0YXsiVXNlcklEIn0iPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4kVGV4dHsiRGF0ZSBuYXZpZ2F0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICREYXRheyJEYXRlU2VsZWN0aW9uIn0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJEYXRlIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXcmWWVhcj0kUURhdGF7IlllYXJCYWNrIn0mTW9udGg9JFFEYXRheyJNb250aEJhY2sifSZEYXk9JFFEYXRheyJEYXlCYWNrIn0mVXNlcklEPSRRRGF0YXsiVXNlcklEIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWxlZnQtYmlnLnBuZyIgYWx0PSIkVGV4dHsiT25lIGRheSBiYWNrIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXcmWWVhcj0kUURhdGF7IlllYXJOZXh0In0mTW9udGg9JFFEYXRheyJNb250aE5leHQifSZEYXk9JFFEYXRheyJEYXlOZXh0In0mVXNlcklEPSRRRGF0YXsiVXNlcklEIn0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXJpZ2h0LWJpZy5wbmciIGFsdD0iJFRleHR7Ik5leHQgZGF5In0iPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGF0ZSJ9OiAkUURhdGF7IldlZWtkYXlfdG9fVGV4dCJ9ICRRRGF0YXsiRGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI5MCUiPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUHJvamVjdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVGFzayJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiUmVtYXJrIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJTdGFydCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiRW5kIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRUZXh0eyJQZXJpb2QifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VW5pdCAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJQcm9qZWN0In0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiQWN0aW9uIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiUmVtYXJrIn0mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJTdGFydFRpbWUifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkVuZFRpbWUifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IlBlcmlvZCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVbml0IC0tPgo8IS0tIGR0bDpibG9jazpVbml0QmxvY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlRvdGFsIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiVG90YWwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJUb3RhbCJ9Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUb3RhbCAtLT4KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSItMiIgbmFtZT0iTGVhdmVEYXkiICREYXRheyJMZWF2ZURheSJ9IGRpc2FibGVkPiRUZXh0eyJPbiB2YWNhdGlvbiJ9Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Ii0xIiBuYW1lPSJTaWNrIiAkRGF0YXsiU2ljayJ9IGRpc2FibGVkPiRUZXh0eyJPbiBzaWNrIGxlYXZlIn0mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iLTMiIG5hbWU9Ik92ZXJ0aW1lIiAkRGF0YXsiT3ZlcnRpbWUifSBkaXNhYmxlZD4kVGV4dHsiT24gb3ZlcnRpbWUgbGVhdmUifQogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3RoZXJUaW1lcyAtLT4KPCEtLSBkdGw6YmxvY2s6VmFjYXRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJWYWNhdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpWYWNhdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPjwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
Iy0tCiMgS2VybmVsL1N5c3RlbS9UaW1lQWNjb3VudGluZy5wbSAtIGFsbCB0aW1lIGFjY291bnRpbmcgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUaW1lQWNjb3VudGluZy5wbSx2IDEuNDAuMi4xIDIwMTAtMTItMDMgMDk6Mzk6NTYgbW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQwLjIuMSAkKSBbMV07Cgp1c2UgRGF0ZTo6UGNhbGMgcXcoVG9kYXkgRGF5c19pbl9Nb250aCBEYXlfb2ZfV2VlayBjaGVja19kYXRlKTsKCj1oZWFkMSBOQU1FIwoKS2VybmVsOjpTeXN0ZW06OlRpbWVBY2NvdW50aW5nIC0gdGltZWFjY291bnRpbmcgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB0aW1lYWNjb3VudGluZyBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFIwoKPW92ZXIgNAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVXNlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lQWNjb3VudGluZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEyMywKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIFVzZXJPYmplY3QgICA9PiAkVXNlck9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJJRCBUaW1lT2JqZWN0IFVzZXJPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFVzZXJDdXJyZW50UGVyaW9kR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHVzZXIgb2YgdGhlIGN1cnJlbnQgcGVyaW9kIGRhdGEKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnMTInOwogICAgICAgIERheSAgID0+ICcyNCcKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCBjb250YWlucyB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgoKICAgICVVc2VyRGF0YSA9ICgKICAgICAgICAxID0+IHsKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgUGVyaW9kICAgICAgPT4gMTIzLAogICAgICAgICAgICBEYXRlU3RhcnQgICA9PiAnMjAwNS0xMi0yNCcsCiAgICAgICAgICAgIERhdGVFbmQgICAgID0+ICcyMDA1LTEyLTI0JywKICAgICAgICAgICAgV2Vla2x5SG91cnMgPT4gNDAuNCwKICAgICAgICAgICAgTGVhdmVEYXlzICAgPT4gMTIsCiAgICAgICAgICAgIE92ZXJUaW1lICAgID0+IDM0LAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIFVzZXJDdXJyZW50UGVyaW9kR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBmb3IgbXkgJE5lZWRlZFBhcmFtIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZFBhcmFtfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVzZXJDdXJyZW50UGVyaW9kR2V0OiBOZWVkICROZWVkZWRQYXJhbSEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBkYXRlIHN0cmluZyBmb3IgZ2l2ZW4gcGFyYW1zCiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKSAuICcgMDA6MDA6MDAnOwoKICAgICMgVE9ETzogQ2hlY2sgY2FjaGluZyEKICAgICMgQ2FjaGluZwogICAgaWYgKCAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfXskRGF0ZX0gKSB7CiAgICAgICAgcmV0dXJuICV7ICRTZWxmLT57J0NhY2hlOjpVc2VyQ3VycmVudFBlcmlvZEdldCd9eyREYXRlfSB9OwogICAgfQoKICAgICMgZGIgc2VsZWN0CiAgICBteSAkUHJlcGFyZVN1Y2Nlc3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCB1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsICcKICAgICAgICAgICAgLiAnd2Vla2x5X2hvdXJzLCBsZWF2ZV9kYXlzLCBvdmVydGltZSAnCiAgICAgICAgICAgIC4gJ0ZST00gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kICcKICAgICAgICAgICAgLiAnV0hFUkUgZGF0ZV9zdGFydCA8PSA/IEFORCBkYXRlX2VuZCAgPj0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBzdGF0dXMgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCREYXRlLCBcJERhdGUsIFwxLCBdLAogICAgKTsKCiAgICAjIGNoZWNrIHN1Y2Nlc3Mgb2YgcHJlcGFyZSBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJFByZXBhcmVTdWNjZXNzOwoKICAgICMgZmV0Y2ggRGF0YQogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICRVc2VyUmVmID0gewogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBQZXJpb2QgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBEYXRlU3RhcnQgICA9PiBzdWJzdHIoICRSb3dbMl0sIDAsIDEwICksCiAgICAgICAgICAgIERhdGVFbmQgICAgID0+IHN1YnN0ciggJFJvd1szXSwgMCwgMTAgKSwKICAgICAgICAgICAgV2Vla2x5SG91cnMgPT4gJFJvd1s0XSwKICAgICAgICAgICAgTGVhdmVEYXlzICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgT3ZlcnRpbWUgICAgPT4gJFJvd1s2XSwKICAgICAgICB9OwogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkVXNlclJlZjsKICAgIH0KCiAgICAjIGNoZWNrIGZvciB2YWxpZCB1c2VyIGRhdGEKICAgIHJldHVybiBpZiAhJURhdGE7CgogICAgIyBzdG9yZSB1c2VyIGRhdGEgaW4gY2FjaGUKICAgICRTZWxmLT57J0NhY2hlOjpVc2VyQ3VycmVudFBlcmlvZEdldCd9eyREYXRlfSA9IFwlRGF0YTsKCiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJSZXBvcnRpbmcoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBsZWF2ZWRheXMsIG92ZXJ0aW1lcywKd29ya2luZ2hvdXJzIGV0Yy4gb2YgYWxsIHVzZXJzCgogICAgbXkgJURhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJSZXBvcnRpbmcoCiAgICAgICAgWWVhciAgPT4gJzIwMDUnLAogICAgICAgIE1vbnRoID0+ICcxMicsCiAgICAgICAgRGF5ICAgPT4gJzEyJywgICAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFVzZXJSZXBvcnRpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkUGFyYW0gKHF3KFllYXIgTW9udGggRGF5KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkUGFyYW19ICYmICROZWVkZWRQYXJhbSBuZSAnRGF5JyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVzZXJSZXBvcnRpbmc6IE5lZWQgJE5lZWRlZFBhcmFtISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkZSBkYXRlIHZhbHVlcwogICAgcmV0dXJuIGlmICFjaGVja19kYXRlKCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9IHx8IDEgKTsKCiAgICAjIGdldCBkYXlzIG9mIG1vbnRoIGlmIG5vdCBwcm92aWRlZAogICAgJFBhcmFte0RheX0gfHw9IERheXNfaW5fTW9udGgoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSApOwoKICAgIG15ICVVc2VyQ3VycmVudFBlcmlvZCA9ICRTZWxmLT5Vc2VyQ3VycmVudFBlcmlvZEdldCglUGFyYW0pOwogICAgbXkgJFllYXJTdGFydCAgICAgICAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0ICAgICAgICA9IDA7CiAgICBteSAkRGF5U3RhcnQgICAgICAgICAgPSAwOwogICAgbXkgJFllYXJFbmQgICAgICAgICAgID0gJFBhcmFte1llYXJ9OwogICAgbXkgJE1vbnRoRW5kICAgICAgICAgID0gJFBhcmFte01vbnRofTsKICAgIG15ICREYXlFbmQgICAgICAgICAgICA9ICRQYXJhbXtEYXl9OwoKICAgIG15ICVEYXRhOwoKICAgIFVTRVJJRDoKICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlVXNlckN1cnJlbnRQZXJpb2QgKSB7CiAgICAgICAgaWYgKCAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17RGF0ZVN0YXJ0fSA9fiBteyBcQSAoXGR7NH0pLShcZHsyfSktKFxkezJ9KSB9c214ICkgewogICAgICAgICAgICAkWWVhclN0YXJ0ICA9ICQxOwogICAgICAgICAgICAkTW9udGhTdGFydCA9ICQyOwogICAgICAgICAgICAkRGF5U3RhcnQgICA9ICQzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhY2hlY2tfZGF0ZSggJFllYXJTdGFydCwgJE1vbnRoU3RhcnQsICREYXlTdGFydCApICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdVc2VyUmVwb3J0aW5nOiBJbnZhbGlkIHN0YXJ0IGRhdGUgZm9yIHVzZXIgJwogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VySUQ6ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtEYXRlU3RhcnR9IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBVU0VSSUQ7CiAgICAgICAgfQoKICAgICAgICBteSAlQ3VycmVudFVzZXJEYXRhID0gKAogICAgICAgICAgICBMZWF2ZURhdGUgICAgICAgID0+IDAsCiAgICAgICAgICAgIFNpY2sgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgT3ZlcnRpbWUgICAgICAgICA9PiAwLAogICAgICAgICAgICBUYXJnZXRTdGF0ZSAgICAgID0+IDAsCiAgICAgICAgICAgIExlYXZlRGF5VG90YWwgICAgPT4gMCwKICAgICAgICAgICAgU2lja1RvdGFsICAgICAgICA9PiAwLAogICAgICAgICAgICBTaWNrVG90YWwgICAgICAgID0+IDAsCiAgICAgICAgICAgIFRhcmdldFN0YXRlVG90YWwgPT4gMCwKICAgICAgICApOwoKICAgICAgICBZRUFSOgogICAgICAgIGZvciBteSAkWWVhciAoICRZZWFyU3RhcnQgLi4gJFllYXJFbmQgKSB7CiAgICAgICAgICAgIG15ICRNb250aFN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ID8gJE1vbnRoU3RhcnQgOiAxOwogICAgICAgICAgICBteSAkTW9udGhFbmRQb2ludCAgID0gJFllYXIgPT0gJFllYXJFbmQgICA/ICRNb250aEVuZCAgIDogMTI7CgogICAgICAgICAgICBNT05USDoKICAgICAgICAgICAgZm9yIG15ICRNb250aCAoICRNb250aFN0YXJ0UG9pbnQgLi4gJE1vbnRoRW5kUG9pbnQgKSB7CgogICAgICAgICAgICAgICAgbXkgJERheVN0YXJ0UG9pbnQgPQogICAgICAgICAgICAgICAgICAgICRZZWFyID09ICRZZWFyU3RhcnQgJiYgJE1vbnRoID09ICRNb250aFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPyAkRGF5U3RhcnQKICAgICAgICAgICAgICAgICAgICA6IDEKICAgICAgICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgbXkgJERheUVuZFBvaW50ID0KICAgICAgICAgICAgICAgICAgICAkWWVhciA9PSAkWWVhckVuZCAmJiAkTW9udGggPT0gJE1vbnRoRW5kCiAgICAgICAgICAgICAgICAgICAgPyAkRGF5RW5kCiAgICAgICAgICAgICAgICAgICAgOiBEYXlzX2luX01vbnRoKCAkWWVhciwgJE1vbnRoICkKICAgICAgICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgREFZOgogICAgICAgICAgICAgICAgZm9yIG15ICREYXkgKCAkRGF5U3RhcnRQb2ludCAuLiAkRGF5RW5kUG9pbnQgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVdvcmtpbmdVbml0ID0gJFNlbGYtPldvcmtpbmdVbml0c0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+ICRZZWFyLAogICAgICAgICAgICAgICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJExlYXZlRGF5ICAgID0gMDsKICAgICAgICAgICAgICAgICAgICBteSAkU2ljayAgICAgICAgPSAwOwogICAgICAgICAgICAgICAgICAgIG15ICRPdmVydGltZSAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldFN0YXRlID0gMDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkV29ya2luZ1VuaXR7TGVhdmVEYXl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudFVzZXJEYXRhe0xlYXZlRGF5VG90YWx9Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICRMZWF2ZURheSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFdvcmtpbmdVbml0e1NpY2t9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudFVzZXJEYXRhe1NpY2tUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgJFNpY2sgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRXb3JraW5nVW5pdHtPdmVydGltZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJyZW50VXNlckRhdGF7T3ZlcnRpbWVUb3RhbH0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgJE92ZXJ0aW1lID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRDdXJyZW50VXNlckRhdGF7V29ya2luZ0hvdXJzVG90YWx9ICs9ICRXb3JraW5nVW5pdHtUb3RhbH07CiAgICAgICAgICAgICAgICAgICAgbXkgJFZhY2F0aW9uQ2hlY2sgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5WYWNhdGlvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICBZZWFyICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgTW9udGggPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFdlZWtkYXkgPSBEYXlfb2ZfV2VlayggJFllYXIsICRNb250aCwgJERheSApOwogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFdlZWtkYXkgIT0gNgogICAgICAgICAgICAgICAgICAgICAgICAmJiAkV2Vla2RheSAhPSA3CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkVmFjYXRpb25DaGVjawogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFNpY2sKICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRMZWF2ZURheQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudFVzZXJEYXRhe1RhcmdldFN0YXRlVG90YWx9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSAkVXNlckN1cnJlbnRQZXJpb2R7JFVzZXJJRH17V2Vla2x5SG91cnN9IC8gNTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFN0YXRlID0gJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e1dlZWtseUhvdXJzfSAvIDU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoICRNb250aCA9PSAkTW9udGhFbmQgJiYgJFllYXIgPT0gJFllYXJFbmQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJyZW50VXNlckRhdGF7VGFyZ2V0U3RhdGV9ICArPSAkVGFyZ2V0U3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJyZW50VXNlckRhdGF7V29ya2luZ0hvdXJzfSArPSAkV29ya2luZ1VuaXR7VG90YWx9OwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudFVzZXJEYXRhe0xlYXZlRGF5fSAgICAgKz0gJExlYXZlRGF5OwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudFVzZXJEYXRhe1NpY2t9ICAgICAgICAgKz0gJFNpY2s7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRDdXJyZW50VXNlckRhdGF7T3ZlcnRpbWV9ID0gJEN1cnJlbnRVc2VyRGF0YXtXb3JraW5nSG91cnN9IC0gJEN1cnJlbnRVc2VyRGF0YXtUYXJnZXRTdGF0ZX07CiAgICAgICAgJEN1cnJlbnRVc2VyRGF0YXtPdmVydGltZVRvdGFsfQogICAgICAgICAgICA9ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtPdmVydGltZX0KICAgICAgICAgICAgKyAkQ3VycmVudFVzZXJEYXRhe1dvcmtpbmdIb3Vyc1RvdGFsfQogICAgICAgICAgICAtICRDdXJyZW50VXNlckRhdGF7VGFyZ2V0U3RhdGVUb3RhbH07CiAgICAgICAgJEN1cnJlbnRVc2VyRGF0YXtPdmVydGltZVVudGlsfQogICAgICAgICAgICA9ICRDdXJyZW50VXNlckRhdGF7T3ZlcnRpbWVUb3RhbH0gLSAkQ3VycmVudFVzZXJEYXRhe092ZXJ0aW1lfTsKICAgICAgICAkQ3VycmVudFVzZXJEYXRhe0xlYXZlRGF5UmVtYWluaW5nfQogICAgICAgICAgICA9ICRVc2VyQ3VycmVudFBlcmlvZHskVXNlcklEfXtMZWF2ZURheXN9IC0gJEN1cnJlbnRVc2VyRGF0YXtMZWF2ZURheVRvdGFsfTsKCiAgICAgICAgJERhdGF7JFVzZXJJRH0gPSBcJUN1cnJlbnRVc2VyRGF0YTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIHByb2plY3QgZGF0YQoKICAgIG15ICVQcm9qZWN0RGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzR2V0KAogICAgICAgIFN0YXR1cyA9PiAndmFsaWQnIHx8ICdpbnZhbGlkJywgb3B0aW9uYWwgZGVmYXVsdCB2YWxpZCAmJiBpbnZhbGlkCiAgICApOwoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICA9ICgpOwogICAgbXkgJFdoZXJlID0gJyc7CgogICAgaWYgKCAkUGFyYW17U3RhdHVzfSApIHsKICAgICAgICAkV2hlcmUgPSAnIFdIRVJFIHN0YXR1cyA9ICc7CiAgICAgICAgJFdoZXJlIC49ICRQYXJhbXtTdGF0dXN9IGVxICdpbnZhbGlkJyA/ICInMCciIDogIicxJyI7CiAgICB9CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBwcm9qZWN0LCBkZXNjcmlwdGlvbiwgc3RhdHVzICIKICAgICAgICAgICAgLiAiRlJPTSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAkV2hlcmUiLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJElEID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtQcm9qZWN0fXskSUR9ICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRhe1Byb2plY3REZXNjcmlwdGlvbn17JElEfSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7UHJvamVjdFN0YXR1c317JElEfSAgICAgID0gJFJvd1szXTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzSW5zZXJ0KAogICAgICAgIFByb2plY3QgICAgICAgICAgICA9PiAnaW50ZXJuYWwnLCAgICAjIG9wdGlvbmFsCiAgICAgICAgUHJvamVjdERlc2NyaXB0aW9uID0+ICdkZXNjcmlwdGlvbicsICMgb3B0aW9uYWwKICAgICAgICBQcm9qZWN0U3RhdHVzICAgICAgPT4gMSB8fCAwLCAgICAgICAgIyBvcHRpb25hbAogICAgKTsKCiAgICByZXR1cm5zIElEIG9mIGNyZWF0ZWQgcHJvamVjdAoKPWN1dAoKc3ViIFByb2plY3RTZXR0aW5nc0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtQcm9qZWN0fSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdE5hbWUnKSB8fCAnJzsKICAgICRQYXJhbXtQcm9qZWN0U3RhdHVzfSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0UHJvamVjdFN0YXR1cycpCiAgICAgICAgfHwgMDsKICAgICRQYXJhbXtQcm9qZWN0RGVzY3JpcHRpb259IHx8PSAnJzsKCiAgICAjIGluc2VydCBwcm9qZWN0IHJlY29yZAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0IChwcm9qZWN0LCBkZXNjcmlwdGlvbiwgc3RhdHVzKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Byb2plY3R9LCBcJFBhcmFte1Byb2plY3REZXNjcmlwdGlvbn0sIFwkUGFyYW17UHJvamVjdFN0YXR1c30gXSwKICAgICk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQ7CgogICAgIyBnZXQgSUQgb2YgbmV3bHkgY3JlYXRlZCBwcm9qZWN0IHJlY29yZAogICAgJFJlc3VsdCA9ICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCBXSEVSRSBwcm9qZWN0ID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1Byb2plY3R9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQ7CgogICAgIyBmZXRjaCBEYXRhCiAgICBteSAkUHJvamVjdElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUHJvamVjdElEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFByb2plY3RJRDsKfQoKPWl0ZW0gUHJvamVjdFNldHRpbmdzRGVsZXRlKCkKCmRlbGV0ZSByZWNvcmRzIG9mIHByb2plY3QgZnJvbSBkYXRhYmFzZQoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzRGVsZXRlKAogICAgICAgIFByb2plY3RJRCAgICAgICAgICA9PiAzNDIzLCAjIElEIG9mIHJlY29yZAogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0U2V0dGluZ3NEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICFleGlzdHMgJFBhcmFte1Byb2plY3RJRH0gfHwgISRQYXJhbXtQcm9qZWN0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUHJvamVjdFNldHRpbmdzRGVsZXRlOiBOZWVkIFByb2plY3RJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIHByb2plY3QgcmVjb3JkCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHRpbWVfYWNjb3VudGluZ19wcm9qZWN0IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17UHJvamVjdElEfSwgXSwKICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1pdGVtIFByb2plY3RTZXR0aW5nc1VwZGF0ZSgpCgp1cGRhdGUgcHJvamVjdCBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFNldHRpbmdzVXBkYXRlKAogICAgICAgIDEgICAgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgUHJvamVjdElECiAgICAgICAgICAgIFByb2plY3QgICAgICAgPT4gJ2ludGVybmFsJywKICAgICAgICAgICAgUHJvamVjdFN0YXR1cyA9PiAxIHx8IDAsCiAgICAgICAgfSwKICAgICAgICAyICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAjIGVxdWFsIFByb2plY3RJRAogICAgICAgICAgICBQcm9qZWN0ICAgICAgID0+ICdwcm9qZWN0bmFtZScsCiAgICAgICAgICAgIFByb2plY3RTdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFNldHRpbmdzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgUFJPSkVDVElEOgogICAgZm9yIG15ICRQcm9qZWN0SUQgKCBzb3J0IGtleXMgJVBhcmFtICkgewogICAgICAgIG5leHQgaWYgISRQYXJhbXskUHJvamVjdElEfXtQcm9qZWN0fTsKCiAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICBteSAkU1FMCiAgICAgICAgICAgID0gIlVQREFURSB0aW1lX2FjY291bnRpbmdfcHJvamVjdCAiCiAgICAgICAgICAgIC4gIlNFVCBwcm9qZWN0ID0gPyAsIHN0YXR1cyA9ID8gLCBkZXNjcmlwdGlvbiA9ID8gIFdIRVJFIGlkID0gPyI7CgogICAgICAgIG15ICRCaW5kID0gWwogICAgICAgICAgICBcJFBhcmFteyRQcm9qZWN0SUR9e1Byb2plY3R9LCAgICAgICAgICAgIFwkUGFyYW17JFByb2plY3RJRH17UHJvamVjdFN0YXR1c30sCiAgICAgICAgICAgIFwkUGFyYW17JFByb2plY3RJRH17UHJvamVjdERlc2NyaXB0aW9ufSwgXCRQcm9qZWN0SUQKICAgICAgICBdOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzR2V0KCkKCnJldHVybnMgYSBoYXNoIHdpdGggdGhlIGFjdGlvbiBzZXR0aW5ncwoKICAgIG15ICVBY3Rpb25EYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc0dldCgpOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjIGRiIHNlbGVjdAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAnU0VMRUNUIGlkLCBhY3Rpb24sIHN0YXR1cyBGUk9NIHRpbWVfYWNjb3VudGluZ19hY3Rpb24nLCApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9e0FjdGlvbn0gICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRheyAkUm93WzBdIH17QWN0aW9uU3RhdHVzfSA9ICRSb3dbMl07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIEFjdGlvblNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgYWN0aW9uIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc0luc2VydCgKICAgICAgICBBY3Rpb24gICAgICAgPT4gJ21lZXRpbmcnLCAgICMgb3B0aW9uYWwKICAgICAgICBBY3Rpb25TdGF0dXMgPT4gMSB8fCAwLCAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uU2V0dGluZ3NJbnNlcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRiIHF1b3RlCiAgICBmb3IgKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICB9CgogICAgJFBhcmFte0FjdGlvbn0gfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdEFjdGlvbk5hbWUnKSB8fCAnJzsKICAgICRQYXJhbXtBY3Rpb25TdGF0dXN9IHx8PSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRBY3Rpb25TdGF0dXMnKQogICAgICAgIHx8ICcwJzsKCiAgICAjIGJ1aWxkIHNxbAogICAgbXkgJFNRTAogICAgICAgID0gIklOU0VSVCBJTlRPIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gKGFjdGlvbiwgc3RhdHVzKSIKICAgICAgICAuICIgVkFMVUVTICgnJFBhcmFte0FjdGlvbn0nICwgJyRQYXJhbXtBY3Rpb25TdGF0dXN9JykiOwoKICAgICMgZGIgaW5zZXJ0CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3Rpb25TZXR0aW5nc1VwZGF0ZSgpCgp1cGRhdGUgYWN0aW9uIGRhdGEgaW4gdGhlIGRiCgogICAgJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5BY3Rpb25TZXR0aW5nc1VwZGF0ZSgKICAgICAgICAxICAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgIyBlcXVhbCBBY3Rpb25JRAogICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJ21lZXRpbmcnLAogICAgICAgICAgICBBY3Rpb25TdGF0dXMgPT4gMSB8fCAwLAogICAgICAgIH0sCiAgICAgICAgMiAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICMgZXF1YWwgQWN0aW9uSUQKICAgICAgICAgICAgQWN0aW9uICAgICAgID0+ICdqb3VybmV5JywKICAgICAgICAgICAgQWN0aW9uU3RhdHVzID0+IDEgfHwgMCwKICAgICAgICB9LAogICAgICAgIDMgICAgPT4gLi4uLi4uCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvblNldHRpbmdzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgQUNUSU9OSUQ6CiAgICBmb3IgbXkgJEFjdGlvbklEICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICBuZXh0IEFDVElPTklEIGlmICEkUGFyYW17JEFjdGlvbklEfXtBY3Rpb259OwoKICAgICAgICAjIGJ1aWxkIHNxbAogICAgICAgIG15ICRTUUwgPSAnVVBEQVRFIHRpbWVfYWNjb3VudGluZ19hY3Rpb24gU0VUIGFjdGlvbiA9ID8gLCBzdGF0dXMgPSA/IFdIRVJFIGlkID0gPyAnOwogICAgICAgIG15ICRCaW5kID0gWyBcJFBhcmFteyRBY3Rpb25JRH17QWN0aW9ufSwgXCRQYXJhbXskQWN0aW9uSUR9e0FjdGlvblN0YXR1c30sIFwkQWN0aW9uSUQgXTsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwsIEJpbmQgPT4gJEJpbmQgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyTGlzdCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIGRhdGEgb2YgYWxsIHVzZXIKCiAgICBteSAlVXNlckRhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJMaXN0KCk7Cgo9Y3V0CgpzdWIgVXNlckxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCB1c2VyX2lkLCBkZXNjcmlwdGlvbiwgc2hvd19vdmVydGltZSwgY3JlYXRlX3Byb2plY3QsIGNhbGVuZGFyIEZST00gdGltZV9hY2NvdW50aW5nX3VzZXInLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtVc2VySUR9ICAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtEZXNjcmlwdGlvbn0gICA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtTaG93T3ZlcnRpbWV9ICA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtDcmVhdGVQcm9qZWN0fSA9ICRSb3dbM107CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtDYWxlbmRhcn0gICAgICA9ICRSb3dbNF07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJHZXQoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgdXNlciBkYXRhIG9mIG9uZSB1c2VyCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAxNSwgICMKICAgICk7Cgo9Y3V0CgpzdWIgVXNlckdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVXNlckdldDogTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVEYXRhID0gKCk7CgogICAgIyBkYiBzZWxlY3QKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGRlc2NyaXB0aW9uLCBzaG93X292ZXJ0aW1lLCBjcmVhdGVfcHJvamVjdCwgY2FsZW5kYXIgRlJPTSB0aW1lX2FjY291bnRpbmdfdXNlciBXSEVSRSB1c2VyX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VXNlcklEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7VXNlcklEfSAgICAgICAgPSAkUGFyYW17VXNlcklEfTsKICAgICAgICAkRGF0YXtEZXNjcmlwdGlvbn0gICA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7U2hvd092ZXJ0aW1lfSAgPSAkUm93WzFdOwogICAgICAgICREYXRhe0NyZWF0ZVByb2plY3R9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtDYWxlbmRhcn0gICAgICA9ICRSb3dbM107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFVzZXJTZXR0aW5nc0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB1c2VyIHBlcmlvZCBkYXRhCgogICAgbXkgJVVzZXJEYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Vc2VyU2V0dGluZ3NHZXQoKTsKCj1jdXQKCnN1YiBVc2VyU2V0dGluZ3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAlRGF0YSA9ICgpOwoKICAgICMgZGIgc2VsZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCB1c2VyX2lkLCBwcmVmZXJlbmNlX3BlcmlvZCwgZGF0ZV9zdGFydCwgZGF0ZV9lbmQsIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUsIHN0YXR1cyAnCiAgICAgICAgICAgIC4KICAgICAgICAgICAgJ0ZST00gdGltZV9hY2NvdW50aW5nX3VzZXJfcGVyaW9kJywKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtVc2VySUR9ICAgICAgPSAkUm93WzBdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtQZXJpb2R9ICAgICAgPSAkUm93WzFdOwogICAgICAgICREYXRheyAkUm93WzBdIH17ICRSb3dbMV0gfXtEYXRlU3RhcnR9ICAgPSBzdWJzdHIoICRSb3dbMl0sIDAsIDEwICk7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXsgJFJvd1sxXSB9e0RhdGVFbmR9ICAgICA9IHN1YnN0ciggJFJvd1szXSwgMCwgMTAgKTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17V2Vla2x5SG91cnN9ID0gJFJvd1s0XTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17TGVhdmVEYXlzfSAgID0gJFJvd1s1XTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17T3ZlcnRpbWV9ICAgID0gJFJvd1s2XTsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9eyAkUm93WzFdIH17VXNlclN0YXR1c30gID0gJFJvd1s3XTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gVXNlclNldHRpbmdzSW5zZXJ0KCkKCmluc2VydCBuZXcgdXNlciBkYXRhIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+VXNlclNldHRpbmdzSW5zZXJ0KAogICAgICAgIFVzZXJJRCAgICAgICA9PiAnMicsCiAgICAgICAgUGVyaW9kICAgICAgID0+ICcyJywKICAgICk7Cgo9Y3V0CgpzdWIgVXNlclNldHRpbmdzSW5zZXJ0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfTsKCiAgICAkUGFyYW17V2Vla2x5SG91cnN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlcldlZWtseUhvdXJzJykKICAgICAgICB8fCAnNDAnOwogICAgJFBhcmFte0xlYXZlRGF5c30gID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlckxlYXZlRGF5cycpIHx8ICcyNSc7CiAgICAkUGFyYW17VXNlclN0YXR1c30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyU3RhdHVzJykgICAgfHwgJzEnOwogICAgJFBhcmFte092ZXJ0aW1lfSAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVBY2NvdW50aW5nOjpEZWZhdWx0VXNlck92ZXJ0aW1lJykgIHx8ICcwJzsKICAgICRQYXJhbXtEYXRlRW5kfSAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlRW5kJykKICAgICAgICB8fCAnMjAwNy0xMi0zMSc7CiAgICAkUGFyYW17RGF0ZVN0YXJ0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6RGVmYXVsdFVzZXJEYXRlU3RhcnQnKQogICAgICAgIHx8ICcyMDA3LTAxLTAxJzsKICAgICRQYXJhbXtEZXNjcmlwdGlvbn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6OkRlZmF1bHRVc2VyRGVzY3JpcHRpb24nKQogICAgICAgIHx8ICcnOwoKICAgICMgZGIgcXVvdGUKICAgIGZvciAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKTsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAnJzsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBzcWwKICAgIG15ICRTUUwKICAgICAgICA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfdXNlcl9wZXJpb2QgKHVzZXJfaWQsIHByZWZlcmVuY2VfcGVyaW9kLCBkYXRlX3N0YXJ0LCBkYXRlX2VuZCwiCiAgICAgICAgLiAiIHdlZWtseV9ob3VycywgbGVhdmVfZGF5cywgb3ZlcnRpbWUsIHN0YXR1cykiCiAgICAgICAgLiAiIFZBTFVFUyIKICAgICAgICAuICIgKCckUGFyYW17VXNlcklEfScsICckUGFyYW17UGVyaW9kfScsICckUGFyYW17RGF0ZVN0YXJ0fSAwMDowMDowMCcsICckUGFyYW17RGF0ZUVuZH0gMDA6MDA6MDAnLCIKICAgICAgICAuICIgJyRQYXJhbXtXZWVrbHlIb3Vyc30nLCAnJFBhcmFte0xlYXZlRGF5c30nLCAnJFBhcmFte092ZXJ0aW1lfScsICckUGFyYW17VXNlclN0YXR1c30nKSI7CgogICAgIyBkYiBpbnNlcnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwoKICAgICMgU3BsaXQgdGhlIGZvbGxvd2luZyBjb2RlIGluIGEgc2VwZXJhdGUgZnVuY3Rpb24hCgogICAgI2NoZWNrIGlmIHRoZSB1c2VyIHN0aWxsIGV4aXN0cwogICAgbXkgJFVzZXJJRDsKCiAgICAjIGJ1aWxkIHNxbAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlcl9pZCBGUk9NIHRpbWVfYWNjb3VudGluZ191c2VyIFdIRVJFIHVzZXJfaWQgPSAnJFBhcmFte1VzZXJJRH0nIiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRVc2VySUQgPSAkUm93WzBdOwogICAgfQogICAgaWYgKCAhZGVmaW5lZCAkVXNlcklEICkgewogICAgICAgICRTUUwgPSAiSU5TRVJUIElOVE8gdGltZV9hY2NvdW50aW5nX3VzZXIgKHVzZXJfaWQsIGRlc2NyaXB0aW9uKSIKICAgICAgICAgICAgLiAiIFZBTFVFUyIKICAgICAgICAgICAgLiAiICgnJFBhcmFte1VzZXJJRH0nLCAnJFBhcmFte0Rlc2NyaXB0aW9ufScpIjsKCiAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBVc2VyU2V0dGluZ3NVcGRhdGUoKQoKdXBkYXRlIHVzZXIgZGF0YSBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPlVzZXJTZXR0aW5nc1VwZGF0ZSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU29tZSBUZXh0JywKICAgICAgICBDcmVhdGVQcm9qZWN0ID0+IDEgfHwgMCwKICAgICAgICBTaG93T3ZlcnRpbWUgID0+IDEgfHwgMCwKICAgICAgICAxICAgID0+IHsKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIFRleHQnLAogICAgICAgICAgICBDcmVhdGVQcm9qZWN0ID0+IDEgfHwgMCwKICAgICAgICAgICAgU2hvd092ZXJ0aW1lICA9PiAxIHx8IDAsCiAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgID0+ICcyMDA1LTEyLTEyJywKICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAnMjAwNS0xMi0zMScsCiAgICAgICAgICAgICAgICBXZWVrbHlIb3VycyAgPT4gJzM4JywKICAgICAgICAgICAgICAgIExlYXZlRGF5cyAgICA9PiAnMjUnLAogICAgICAgICAgICAgICAgT3ZlcnRpbWUgICAgID0+ICczOCcsCiAgICAgICAgICAgICAgICBVc2VyU3RhdHVzICAgPT4gMSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMiAgICA9PiB7CiAgICAgICAgICAgIDEgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDIsCiAgICAgICAgICAgICAgICBQZXJpb2QgICAgICAgPT4gJzEnLAogICAgICAgICAgICAgICAgRGF0ZVN0YXJ0ICAgID0+ICcyMDA1LTEyLTEyJywKICAgICAgICAgICAgICAgIERhdGVFbmQgICAgICA9PiAnMjAwNS0xMi0zMScsCiAgICAgICAgICAgICAgICBXZWVrbHlIb3VycyAgPT4gJzM4JywKICAgICAgICAgICAgICAgIExlYXZlRGF5cyAgICA9PiAnMjUnLAogICAgICAgICAgICAgICAgT3ZlcnRpbWUgICAgID0+ICczOCcsCiAgICAgICAgICAgICAgICBVc2VyU3RhdHVzICAgPT4gMSB8fCAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMyAgICA9PiAuLi4uLi4KICAgICk7Cgo9Y3V0CgpzdWIgVXNlclNldHRpbmdzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+eydDYWNoZTo6VXNlckN1cnJlbnRQZXJpb2RHZXQnfTsKCiAgICBVU0VSSUQ6CiAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CgogICAgICAgIG15ICRVc2VyUmVmID0gJFBhcmFteyRVc2VySUR9OwoKICAgICAgICBpZiAoICFkZWZpbmVkICRVc2VyUmVmLT57MX17RGF0ZVN0YXJ0fSAmJiAhZGVmaW5lZCAkVXNlclJlZi0+ezF9e0RhdGVFbmR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlclNldHRpbmdVcGRhdGU6IFRoZXJlIGFyZSBubyBkYXRhIGZvciB1c2VyIGlkICRVc2VySUQhIgogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICB9CgogICAgICAgICNzZXQgZGVmYXVsdCBmb3IgU2hvd092ZXJUaW1lLi4uCiAgICAgICAgJFVzZXJSZWYtPntTaG93T3ZlcnRpbWV9IHx8PSAwOwoKICAgICAgICAjc2V0IGRlZmF1bHQgZm9yIENyZWF0ZVByb2plY3QuLi4KICAgICAgICAkVXNlclJlZi0+e0NyZWF0ZVByb2plY3R9IHx8PSAwOwogICAgICAgICRVc2VyUmVmLT57Q2FsZW5kYXJ9ICAgICAgfHw9IDA7CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTAogICAgICAgICAgICA9ICJVUERBVEUgdGltZV9hY2NvdW50aW5nX3VzZXIgIgogICAgICAgICAgICAuICJTRVQgZGVzY3JpcHRpb24gPSA/LCBzaG93X292ZXJ0aW1lID0gPywgY3JlYXRlX3Byb2plY3QgPSA/LCBjYWxlbmRhciA9ID8gIgogICAgICAgICAgICAuICJXSEVSRSB1c2VyX2lkID0gPyI7CgogICAgICAgIG15ICRCaW5kID0gWwogICAgICAgICAgICBcJFVzZXJSZWYtPntEZXNjcmlwdGlvbn0sIFwkVXNlclJlZi0+e1Nob3dPdmVydGltZX0sCiAgICAgICAgICAgIFwkVXNlclJlZi0+e0NyZWF0ZVByb2plY3R9LCBcJFVzZXJSZWYtPntDYWxlbmRhcn0sIFwkVXNlclJlZi0+e1VzZXJJRH0KICAgICAgICBdOwoKICAgICAgICAjIGRiIGluc2VydAogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gJEJpbmQsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIChxdyhVc2VySUQgRGVzY3JpcHRpb24gU2hvd092ZXJ0aW1lIENyZWF0ZVByb2plY3QgQ2FsZW5kYXIpKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkVXNlclJlZi0+eyRffTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkUGVyaW9kICgga2V5cyAleyRVc2VyUmVmfSApIHsKCiAgICAgICAgICAgIG15ICRQZXJpb2RSZWYgPSAkVXNlclJlZi0+eyRQZXJpb2R9OwoKICAgICAgICAgICAgIyBidWlsZCBzcWwKICAgICAgICAgICAgbXkgJFNRTAogICAgICAgICAgICAgICAgPSAiVVBEQVRFIHRpbWVfYWNjb3VudGluZ191c2VyX3BlcmlvZCAiCiAgICAgICAgICAgICAgICAuICJTRVQgbGVhdmVfZGF5cyA9ID8sIGRhdGVfc3RhcnQgPSA/IgogICAgICAgICAgICAgICAgLiAiLCBkYXRlX2VuZCA9ID8sIG92ZXJ0aW1lID0gPyIKICAgICAgICAgICAgICAgIC4gIiwgd2Vla2x5X2hvdXJzID0gPywgc3RhdHVzID0gPyAiCiAgICAgICAgICAgICAgICAuICJXSEVSRSB1c2VyX2lkID0gPyBBTkQgcHJlZmVyZW5jZV9wZXJpb2QgPSA/IjsKCiAgICAgICAgICAgIG15ICRCaW5kID0gWwogICAgICAgICAgICAgICAgXCRQZXJpb2RSZWYtPntMZWF2ZURheXN9LCBcJFBlcmlvZFJlZi0+e0RhdGVTdGFydH0sICAgXCRQZXJpb2RSZWYtPntEYXRlRW5kfSwKICAgICAgICAgICAgICAgIFwkUGVyaW9kUmVmLT57T3ZlcnRpbWV9LCAgXCRQZXJpb2RSZWYtPntXZWVrbHlIb3Vyc30sIFwkUGVyaW9kUmVmLT57VXNlclN0YXR1c30sCiAgICAgICAgICAgICAgICBcJFBlcmlvZFJlZi0+e1VzZXJJRH0sICAgIFwkUGVyaW9kLAogICAgICAgICAgICBdOwoKICAgICAgICAgICAgIyBkYiBpbnNlcnQKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0NvbXBsZXRuZXNzQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheXMgYW5kCnRoZSBpbmZvcm1hdGlvbiBpZiB0aGUgaW5jb21wbGV0ZSB3b3JraW5nIGRheSBhcmUgaW4gdGhlIGFsbG93ZWQKcmFuZ2UuCgogICAgbXkgJVdvcmtpbmdVbml0c0NoZWNrID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Xb3JraW5nVW5pdHNDb21wbGV0bmVzc0NoZWNrKAogICAgICAgIFVzZXJJRCA9PiAnMicsICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzQ29tcGxldG5lc3NDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgICAgICAgICAgICAgID0gKCk7CiAgICBteSAkV29ya2luZ1VuaXRJRCAgICAgICA9IDA7CiAgICBteSAlQ29tcGxldGVXb3JraW5nRGF5cyA9ICgpOwogICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgKTsKCiAgICBteSAkVXNlcklEID0gJFBhcmFte1VzZXJJRH0gfHwgJFNlbGYtPntVc2VySUR9OwoKICAgICMgVE9ETzogU2VhcmNoIG9ubHkgaW4gdGhlIEN1cnJlbnRVc2VyUGVyaW9kCiAgICAjIFRPRE86IFNlYXJjaCBvbmx5IHdvcmtpbmcgdW5pdHMgd2hlcmUgYWN0aW9uX2lkIGFuZCBwcm9qZWN0X2lkIGlzIHRydWUKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICJTRUxFQ1QgRElTVElOQ1QgdGltZV9zdGFydCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSB1c2VyX2lkID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkVXNlcklEIF0sCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRSb3dbMF0gPX4gL14oXGQrKS0oXGQrKS0oXGQrKS8gKSB7CiAgICAgICAgICAgICRDb21wbGV0ZVdvcmtpbmdEYXlzeyQxfXskMn17JDN9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVVzZXJDdXJyZW50UGVyaW9kID0gJFNlbGYtPlVzZXJDdXJyZW50UGVyaW9kR2V0KAogICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgIE1vbnRoID0+ICRNb250aCwKICAgICAgICBEYXkgICA9PiAkRGF5LAogICAgKTsKCiAgICBteSAkV29ya2luZ0RheXMgPSAwOwogICAgbXkgJFllYXJTdGFydCAgID0gMDsKICAgIG15ICRNb250aFN0YXJ0ICA9IDA7CiAgICBteSAkRGF5U3RhcnQgICAgPSAwOwogICAgbXkgJFllYXJFbmQgICAgID0gJFllYXI7CiAgICBteSAkTW9udGhFbmQgICAgPSAkTW9udGg7CiAgICBteSAkRGF5RW5kICAgICAgPSAkRGF5OwoKICAgIGlmICggJFVzZXJDdXJyZW50UGVyaW9keyRVc2VySUR9e0RhdGVTdGFydH0gPX4gL14oXGQrKS0oXGQrKS0oXGQrKS8gKSB7CiAgICAgICAgJFllYXJTdGFydCAgPSAkMTsKICAgICAgICAkTW9udGhTdGFydCA9ICQyOwogICAgICAgICREYXlTdGFydCAgID0gJDM7CiAgICB9CgogICAgbXkgJENhbGVuZGFyID0geyAkU2VsZi0+VXNlckdldCggVXNlcklEID0+ICRVc2VySUQgKSB9LT57Q2FsZW5kYXJ9OwoKICAgIGZvciBteSAkWWVhciAoICRZZWFyU3RhcnQgLi4gJFllYXJFbmQgKSB7CgogICAgICAgIG15ICRNb250aFN0YXJ0UG9pbnQgPSAkWWVhciA9PSAkWWVhclN0YXJ0ID8gJE1vbnRoU3RhcnQgOiAxOwogICAgICAgIG15ICRNb250aEVuZFBvaW50ICAgPSAkWWVhciA9PSAkWWVhckVuZCAgID8gJE1vbnRoRW5kICAgOiAxMjsKCiAgICAgICAgZm9yIG15ICRNb250aCAoICRNb250aFN0YXJ0UG9pbnQgLi4gJE1vbnRoRW5kUG9pbnQgKSB7CiAgICAgICAgICAgIG15ICREYXlTdGFydFBvaW50ID0gJFllYXIgPT0gJFllYXJTdGFydCAmJiAkTW9udGggPT0gJE1vbnRoU3RhcnQgPyAkRGF5U3RhcnQgOiAxOwogICAgICAgICAgICBteSAkRGF5RW5kUG9pbnQgPSAkWWVhciA9PSAkWWVhckVuZAogICAgICAgICAgICAgICAgJiYgJE1vbnRoID09ICRNb250aEVuZCA/ICREYXlFbmQgOiBEYXlzX2luX01vbnRoKCAkWWVhciwgJE1vbnRoICk7CiAgICAgICAgICAgIG15ICRNb250aFN0cmluZyA9IHNwcmludGYoICIlMDJkIiwgJE1vbnRoICk7CgogICAgICAgICAgICBmb3IgbXkgJERheSAoICREYXlTdGFydFBvaW50IC4uICREYXlFbmRQb2ludCApIHsKICAgICAgICAgICAgICAgIG15ICRWYWNhdGlvbkNoZWNrID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VmFjYXRpb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBZZWFyICAgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgICAgICBNb250aCAgICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICAgICAgRGF5ICAgICAgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhciA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICREYXRlID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFllYXIsICRNb250aCwgJERheSApOwogICAgICAgICAgICAgICAgbXkgJERheVN0YXJ0VGltZQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkRGF0ZSAuICcgMDA6MDA6MDAnICk7CiAgICAgICAgICAgICAgICBteSAkRGF5U3RvcFRpbWUKICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJERhdGUgLiAnIDIzOjU5OjU5JyApOwoKICAgICAgICAgICAgICAgICMgYWRkIHRpbWUgem9uZSB0byBjYWxjdWxhdGlvbgogICAgICAgICAgICAgICAgbXkgJFpvbmUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggIlRpbWVab25lOjpDYWxlbmRhciIgLiAkQ2FsZW5kYXIgKTsKICAgICAgICAgICAgICAgIGlmICgkWm9uZSkgewogICAgICAgICAgICAgICAgICAgIG15ICRab25lU2Vjb25kcyA9ICRab25lICogNjAgKiA2MDsKICAgICAgICAgICAgICAgICAgICAkRGF5U3RhcnRUaW1lID0gJERheVN0YXJ0VGltZSAtICRab25lU2Vjb25kczsKICAgICAgICAgICAgICAgICAgICAkRGF5U3RvcFRpbWUgID0gJERheVN0b3BUaW1lIC0gJFpvbmVTZWNvbmRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRUaGlzRGF5V29ya2luZ1RpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5Xb3JraW5nVGltZSgKICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJERheVN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICBTdG9wVGltZSAgPT4gJERheVN0b3BUaW1lLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFyICA9PiAkQ2FsZW5kYXIgfHwgJycsCiAgICAgICAgICAgICAgICApIHx8ICcwJzsKCiAgICAgICAgICAgICAgICBteSAkRGF5U3RyaW5nID0gc3ByaW50ZiggIiUwMmQiLCAkRGF5ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkVGhpc0RheVdvcmtpbmdUaW1lICYmICEkVmFjYXRpb25DaGVjayApIHsKICAgICAgICAgICAgICAgICAgICAkV29ya2luZ0RheXMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkVGhpc0RheVdvcmtpbmdUaW1lCiAgICAgICAgICAgICAgICAgICAgJiYgISRWYWNhdGlvbkNoZWNrCiAgICAgICAgICAgICAgICAgICAgJiYgISRDb21wbGV0ZVdvcmtpbmdEYXlzeyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGhTdHJpbmd9eyREYXlTdHJpbmd9ID0gJFdvcmtpbmdEYXlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXMKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lQWNjb3VudGluZzo6TWF4SW50ZXJ2YWxPZkluY29tcGxldGVEYXlzJykgfHwgJzUnOwogICAgbXkgJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUFjY291bnRpbmc6Ok1heEludGVydmFsT2ZJbmNvbXBsZXRlRGF5c0JlZm9yZVdhcm5pbmcnKQogICAgICAgIHx8ICczJzsKICAgIGZvciBteSAkWWVhciAoIGtleXMgJXsgJERhdGF7SW5jb21wbGV0ZX0gfSApIHsKICAgICAgICBmb3IgbXkgJE1vbnRoICgga2V5cyAleyAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICREYXkgKCBrZXlzICV7ICREYXRhe0luY29tcGxldGV9eyRZZWFyfXskTW9udGh9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJERhdGF7SW5jb21wbGV0ZX17JFllYXJ9eyRNb250aH17JERheX0KICAgICAgICAgICAgICAgICAgICA8ICRXb3JraW5nRGF5cyAtICRNYXhJbnRlcnZhbGxPZkluY29tcGxldGVEYXlzCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe0VuZm9yY2VJbnNlcnR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAkRGF0YXtJbmNvbXBsZXRlfXskWWVhcn17JE1vbnRofXskRGF5fQogICAgICAgICAgICAgICAgICAgIDwgJFdvcmtpbmdEYXlzIC0gJE1heEludGVydmFsbE9mSW5jb21wbGV0ZURheXNCZWZvcmVXYXJuaW5nCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICREYXRhe1dhcm5pbmd9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0dldCgpCgpyZXR1cm5zIGEgaGFzaCB3aXRoIHRoZSB3b3JraW5nIHVuaXRzIGRhdGEKCiAgICBteSAlV29ya2luZ1VuaXRzRGF0YSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzR2V0KAogICAgICAgIFllYXIgICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggID0+ICc3JywKICAgICAgICBEYXkgICAgPT4gJzEzJywKICAgICAgICBVc2VySUQgPT4gJzInLCAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKSB8fCAnJzsKICAgIH0KCiAgICAkUGFyYW17VXNlcklEfSB8fD0gJFNlbGYtPntVc2VySUR9OwoKICAgIG15ICREYXRlICAgICAgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkUGFyYW17WWVhcn0sICRQYXJhbXtNb250aH0sICRQYXJhbXtEYXl9ICk7CiAgICBteSAkRGF0ZVN0YXJ0ID0gJERhdGUgLiAiIDAwOjAwOjAwIjsKICAgIG15ICREYXRlU3RvcCAgPSAkRGF0ZSAuICIgMjM6NTk6NTkiOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHVzZXJfaWQsIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcmVtYXJrLCB0aW1lX3N0YXJ0LCB0aW1lX2VuZCwiCiAgICAgICAgICAgIC4gIiBwZXJpb2QgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgIgogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICIgdGltZV9zdGFydCA+PSAnJERhdGVTdGFydCcgIgogICAgICAgICAgICAuICIgQU5EIHRpbWVfc3RhcnQgPD0gJyREYXRlU3RvcCcgIgogICAgICAgICAgICAuICIgQU5EIHVzZXJfaWQgPSAnJFBhcmFte1VzZXJJRH0nIE9SREVSIGJ5IGlkIiwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgVG90YWwgPT4gMCwKICAgICAgICBEYXRlICA9PiAkRGF0ZSwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgUk9XIGlmICRSb3dbNF0gIX4gbXteICguKz8pIFxzIChcZCs6XGQrKSA6IChcZCspIH1zbXg7CgogICAgICAgICMgY2hlY2sgaWYgaXQgaXMgYSBzcGVjaWFsIHdvcmtpbmcgdW5pdAogICAgICAgIGlmICggJFJvd1sxXSA9PSAtMSApIHsKICAgICAgICAgICAgbXkgJEFjdGlvbklEID0gJFJvd1syXTsKCiAgICAgICAgICAgICREYXRhe1NpY2t9ICAgICA9ICRBY3Rpb25JRCA9PSAtMSA/IDEgOiAwOwogICAgICAgICAgICAkRGF0YXtMZWF2ZURheX0gPSAkQWN0aW9uSUQgPT0gLTIgPyAxIDogMDsKICAgICAgICAgICAgJERhdGF7T3ZlcnRpbWV9ID0gJEFjdGlvbklEID09IC0zID8gMSA6IDA7CgogICAgICAgICAgICBuZXh0IFJPVzsKICAgICAgICB9CiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICQyOwogICAgICAgIG15ICRFbmRUaW1lICAgPSAnJzsKICAgICAgICBpZiAoICRSb3dbNV0gPX4gbXteKC4rPylccyhcZCs6XGQrKTooXGQrKX1zbXggKSB7CiAgICAgICAgICAgICRFbmRUaW1lID0gJDI7CiAgICAgICAgfQoKICAgICAgICBteSAlV29ya2luZ1VuaXQgPSAoCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBQcm9qZWN0SUQgPT4gJFJvd1sxXSwKICAgICAgICAgICAgQWN0aW9uSUQgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIFJlbWFyayAgICA9PiAkUm93WzNdLAogICAgICAgICAgICBTdGFydFRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgRW5kVGltZSAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICBQZXJpb2QgICAgPT4gZGVmaW5lZCggJFJvd1s2XSApID8gc3ByaW50ZiggIiUuMmYiLCAkUm93WzZdICkgOiAwLAogICAgICAgICk7CgogICAgICAgICMgb25seSBjb3VudCBjb21wbGV0ZSB3b3JraW5nIHVuaXRzCiAgICAgICAgaWYgKCAkUm93WzFdICYmICRSb3dbMl0gKSB7CiAgICAgICAgICAgICREYXRhe1RvdGFsfSArPSAkV29ya2luZ1VuaXR7UGVyaW9kfTsKICAgICAgICB9CiAgICAgICAgcHVzaCBAeyAkRGF0YXtXb3JraW5nVW5pdHN9IH0sIFwlV29ya2luZ1VuaXQ7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFdvcmtpbmdVbml0c0luc2VydCgpCgppbnNlcnQgd29ya2luZyB1bml0cyBpbiB0aGUgZGIKCiAgICAkVGltZUFjY291bnRpbmdPYmplY3QtPldvcmtpbmdVbml0c0luc2VydCgKICAgICAgICBZZWFyICA9PiAnMjAwNScsCiAgICAgICAgTW9udGggPT4gJzA3JywKICAgICAgICBEYXkgICA9PiAnMDInLAogICAgICAgIExlYXZlRGF5ID0+IDEsIHx8IDAKICAgICAgICBTaWNrICAgICA9PiAxLCB8fCAwCiAgICAgICAgT3ZlcnRpbWUgPT4gMSwgfHwgMAogICAgICAgIFdvcmtpbmdVbml0cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFByb2plY3RJRCA9PiAxLAogICAgICAgICAgICAgICAgQWN0aW9uSUQgID0+IDIzLAogICAgICAgICAgICAgICAgUmVtYXJrICAgID0+ICdTb21lVGV4dCwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnNzozMCcsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJzExOjAwJywKICAgICAgICAgICAgICAgIFBlcmlvZCAgICA9PiAnOC41JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgeyAuLi4uLi4gfSwKICAgICAgICBdCiAgICApOwoKPWN1dAoKc3ViIFdvcmtpbmdVbml0c0luc2VydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV29ya2luZ1VuaXRzSW5zZXJ0OiBOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICREYXRlID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFBhcmFte1llYXJ9LCAkUGFyYW17TW9udGh9LCAkUGFyYW17RGF5fSApOwoKICAgICMgZGVsZXRlIGV4aXRpbmcgZGF0YQogICAgaWYgKCAhJFNlbGYtPldvcmtpbmdVbml0c0RlbGV0ZSglUGFyYW0pICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2FuXCd0IGRlbGV0ZSBXb3JraW5nIFVuaXRzIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBzcGVjaWFsIHRpbWUgd29ya2luZyB1bml0cwogICAgbXkgJVNwZWNpYWxBY3Rpb24gPSAoCiAgICAgICAgJ1NpY2snICAgICA9PiAnLTEnLAogICAgICAgICdMZWF2ZURheScgPT4gJy0yJywKICAgICAgICAnT3ZlcnRpbWUnID0+ICctMycsCiAgICApOwoKICAgIEVMRU1FTlQ6CiAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KExlYXZlRGF5IFNpY2sgT3ZlcnRpbWUpKSB7CiAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkUGFyYW17JEVsZW1lbnR9OwoKICAgICAgICBteSAlVW5pdCA9ICgKICAgICAgICAgICAgUHJvamVjdElEID0+IC0xLAogICAgICAgICAgICBBY3Rpb25JRCAgPT4gJFNwZWNpYWxBY3Rpb257JEVsZW1lbnR9LAogICAgICAgICAgICBSZW1hcmsgICAgPT4gJycsCiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcnLAogICAgICAgICAgICBQZXJpb2QgICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtXb3JraW5nVW5pdHN9IH0sIFwlVW5pdDsKICAgIH0KCiAgICAjaW5zZXJ0IG5ldyB3b3JraW5nIHVuaXRzCiAgICBVTklUUkVGOgogICAgZm9yIG15ICRVbml0UmVmICggQHsgJFBhcmFte1dvcmtpbmdVbml0c30gfSApIHsKCiAgICAgICAgI25leHQgVU5JVFJFRiBpZiAhJFVuaXRSZWYtPntQcm9qZWN0SUR9IHx8ICEkVW5pdFJlZi0+e0FjdGlvbklEfTsKCiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICREYXRlIC4gJyAnIC4gJFVuaXRSZWYtPntTdGFydFRpbWV9OwogICAgICAgIG15ICRFbmRUaW1lICAgPSAkRGF0ZSAuICcgJyAuICRVbml0UmVmLT57RW5kVGltZX07CgogICAgICAgICMgJycgZG9lcyBub3Qgd29yayBpbiBpbnRlZ2VyIGZpZWxkIG9mIHBvc3RncmVzCiAgICAgICAgJFVuaXRSZWYtPntQcm9qZWN0SUR9IHx8PSAwOwogICAgICAgICRVbml0UmVmLT57QWN0aW9uSUR9ICB8fD0gMDsKICAgICAgICAkVW5pdFJlZi0+e1BlcmlvZH0gICAgfHw9IDA7CgogICAgICAgICMgYnVpbGQgc3FsCiAgICAgICAgbXkgJFNRTAogICAgICAgICAgICA9ICJJTlNFUlQgSU5UTyB0aW1lX2FjY291bnRpbmdfdGFibGUgIgogICAgICAgICAgICAuICIodXNlcl9pZCwgcHJvamVjdF9pZCwgYWN0aW9uX2lkLCByZW1hcmssIgogICAgICAgICAgICAuICIgdGltZV9zdGFydCwgdGltZV9lbmQsIHBlcmlvZCwgY3JlYXRlZCApIgogICAgICAgICAgICAuICIgVkFMVUVTICAoID8sID8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wKSI7CiAgICAgICAgbXkgJEJpbmQgPSBbCiAgICAgICAgICAgIFwkU2VsZi0+e1VzZXJJRH0sIFwkVW5pdFJlZi0+e1Byb2plY3RJRH0sIFwkVW5pdFJlZi0+e0FjdGlvbklEfSwKICAgICAgICAgICAgXCRVbml0UmVmLT57UmVtYXJrfSwgXCRTdGFydFRpbWUsIFwkRW5kVGltZSwgXCRVbml0UmVmLT57UGVyaW9kfQogICAgICAgIF07CgogICAgICAgICMgZGIgaW5zZXJ0CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya2luZ1VuaXRzRGVsZXRlKCkKCmRlbGV0cyB3b3JraW5nIHVuaXRzIGluIHRoZSBkYgoKICAgICRUaW1lQWNjb3VudGluZ09iamVjdC0+V29ya2luZ1VuaXRzRGVsZXRlKAogICAgICAgIFllYXIgID0+ICcyMDA1JywKICAgICAgICBNb250aCA9PiAnNycsCiAgICAgICAgRGF5ICAgPT4gJzEzJywKICAgICk7Cgo9Y3V0CgpzdWIgV29ya2luZ1VuaXRzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldvcmtpbmdVbml0c0luc2VydDogTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkRGF0ZSA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCIsICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSwgJFBhcmFte0RheX0gKTsKCiAgICAjIGRlbGV0ZSBvbGQgd29ya2luZyB1bml0cwogICAgbXkgJFNRTCA9ICJERUxFVEUgRlJPTSB0aW1lX2FjY291bnRpbmdfdGFibGUgIgogICAgICAgIC4gIldIRVJFIHRpbWVfc3RhcnQgPD0gJyREYXRlIDIzOjU5OjU5JyIKICAgICAgICAuICIgQU5EIHRpbWVfc3RhcnQgPj0gJyREYXRlIDAwOjAwOjAwJyAiCiAgICAgICAgLiAiIEFORCB1c2VyX2lkID0gJyRTZWxmLT57VXNlcklEfSciOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKCBTUUwgPT4gJFNRTCApOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFByb2plY3RBY3Rpb25SZXBvcnRpbmcoKQoKcmV0dXJucyBhIGhhc2ggd2l0aCB0aGUgaG91cnMgZGVwZW5kZW50IHByb2plY3QgYW5kIGFjdGlvbiBkYXRhCgogICAgbXkgJVByb2plY3REYXRhID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0QWN0aW9uUmVwb3J0aW5nKAogICAgICAgIFllYXIgID0+IDIwMDUsCiAgICAgICAgTW9udGggPT4gNywKICAgICAgICBVc2VySUQgPT4gMTIzLCAjIG9wdGlvbmFsOyBubyBVc2VySUQgbWVhbnMgJ29mIGFsbCB1c2VyJwogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0QWN0aW9uUmVwb3J0aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgICAgID0gKCk7CiAgICBteSAkSURTZWxlY3QgPSAnJzsKICAgIGZvciAocXcoWWVhciBNb250aCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICkgfHwgJyc7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlByb2plY3RBY3Rpb25SZXBvcnRpbmc6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1VzZXJJRH0gKSB8fCAnJzsKICAgICAgICAkSURTZWxlY3QgPSAiIEFORCB1c2VyX2lkID0gJyRQYXJhbXtVc2VySUR9JyI7CiAgICB9CgogICAgIyBob3VycyBwZXIgbW9udGgKICAgIG15ICREYXlzSW5Nb250aCA9IERheXNfaW5fTW9udGgoICRQYXJhbXtZZWFyfSwgJFBhcmFte01vbnRofSApOwogICAgbXkgJERhdGVTdHJpbmcgPSAkUGFyYW17WWVhcn0gLiAiLSIgLiBzcHJpbnRmKCAiJTAyZCIsICRQYXJhbXtNb250aH0gKTsKCiAgICBteSAkU1FMX1F1ZXJ5X1RpbWVTdGFydCA9ICJ0aW1lX3N0YXJ0IDw9ICckRGF0ZVN0cmluZy0kRGF5c0luTW9udGggMjM6NTk6NTknJElEU2VsZWN0IjsKCiAgICAjIFRvdGFsIGhvdXJzCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBwcm9qZWN0X2lkLCBhY3Rpb25faWQsIHBlcmlvZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSIKICAgICAgICAgICAgLiAiIFdIRVJFIHByb2plY3RfaWQgIT0gLTEgQU5EICRTUUxfUXVlcnlfVGltZVN0YXJ0IiwKICAgICk7CgogICAgIyBmZXRjaCBEYXRhCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgaWYgISRSb3dbMl07CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfXtBY3Rpb25zfXsgJFJvd1sxXSB9e1RvdGFsfSArPSAkUm93WzJdOwogICAgfQoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHByb2plY3RfaWQsIGFjdGlvbl9pZCwgcGVyaW9kIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIgogICAgICAgICAgICAuICIgV0hFUkUgcHJvamVjdF9pZCAhPSAtMSAiCiAgICAgICAgICAgIC4gIiBBTkQgdGltZV9zdGFydCA+PSAnJERhdGVTdHJpbmctMDEgMDA6MDA6MDAnICIKICAgICAgICAgICAgLiAiIEFORCAkU1FMX1F1ZXJ5X1RpbWVTdGFydCIsCiAgICApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBuZXh0IGlmICEkUm93WzJdOwogICAgICAgICREYXRheyAkUm93WzBdIH17QWN0aW9uc317ICRSb3dbMV0gfXtQZXJNb250aH0gKz0gJFJvd1syXTsKICAgIH0KCiAgICAjIGFkZCByZWFkYWJsZSBjb21wb25lbnRzCiAgICBteSAlUHJvamVjdCA9ICRTZWxmLT5Qcm9qZWN0U2V0dGluZ3NHZXQoKTsKICAgIG15ICVBY3Rpb24gID0gJFNlbGYtPkFjdGlvblNldHRpbmdzR2V0KCk7CiAgICBmb3IgbXkgJFByb2plY3RJRCAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgJERhdGF7JFByb2plY3RJRH17TmFtZX0gICAgICAgID0gJFByb2plY3R7UHJvamVjdH17JFByb2plY3RJRH07CiAgICAgICAgJERhdGF7JFByb2plY3RJRH17U3RhdHVzfSAgICAgID0gJFByb2plY3R7UHJvamVjdFN0YXR1c317JFByb2plY3RJRH07CiAgICAgICAgJERhdGF7JFByb2plY3RJRH17RGVzY3JpcHRpb259ID0gJFByb2plY3R7UHJvamVjdERlc2NyaXB0aW9ufXskUHJvamVjdElEfTsKICAgICAgICBteSAkQWN0aW9uc1JlZiA9ICREYXRheyRQcm9qZWN0SUR9e0FjdGlvbnN9OwogICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBrZXlzICV7JEFjdGlvbnNSZWZ9ICkgewogICAgICAgICAgICAkRGF0YXskUHJvamVjdElEfXtBY3Rpb25zfXskQWN0aW9uSUR9e05hbWV9ID0gJEFjdGlvbnskQWN0aW9uSUR9e0FjdGlvbn07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUHJvamVjdFRvdGFsSG91cnMoKQoKcmV0dXJucyB0aGUgdG90YWwgc3VtIG9mIGFsbCBob3VycyByZWxhdGVkIHRvIGEgcHJvamVjdAoKICAgIG15ICRQcm9qZWN0VG90YWxIb3VycyA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdFRvdGFsSG91cnMoCiAgICAgICAgUHJvamVjdElEICA9PiAxNSwKICAgICk7Cgo9Y3V0CgpzdWIgUHJvamVjdFRvdGFsSG91cnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbQogICAgaWYgKCAhJFBhcmFte1Byb2plY3RJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdQcm9qZWN0QWN0aW9uUmVwb3J0aW5nOiBOZWVkIFByb2plY3RJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkYiBzZWxlY3QKICAgIG15ICRUb3RhbCA9IDA7CiAgICBteSAkU1FMICAgPSAnU0VMRUNUIFNVTShwZXJpb2QpIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHByb2plY3RfaWQgPSA/JzsKICAgIG15ICRCaW5kICA9IFsgXCRQYXJhbXtQcm9qZWN0SUR9IF07CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVG90YWwgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkVG90YWw7Cn0KCj1pdGVtIFByb2plY3RIaXN0b3J5KCkKCnJldHVybnMgYSBhcnJheSB3aXRoIGFsbCBXb3JraW5nVW5pdHMgcmVsYXRlZCB0byBhIHByb2plY3QKCiAgICBteSBAUHJvamVjdEhpc3RvcnlBcnJheSA9ICRUaW1lQWNjb3VudGluZ09iamVjdC0+UHJvamVjdEhpc3RvcnkoCiAgICAgICAgUHJvamVjdElEICA9PiAxNSwKICAgICk7CgplLmcuIEBQcm9qZWN0SGlzdG9yeUFycmF5ID0gKAogICAgICAgIHsKICAgICAgICAgICAgSUQgICAgICAgID0+IDk5OSwKICAgICAgICAgICAgVXNlcklEICAgID0+IDE1LAogICAgICAgICAgICBVc2VyICAgICAgPT4gJ1RvbScsCiAgICAgICAgICAgIEFjdGlvbklEICA9PiA2LAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ21pc2MnLAogICAgICAgICAgICBSZW1hcmsgICAgPT4gJ3JlbWFyaycsCiAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnNzowMCcsCiAgICAgICAgICAgIFRpbWVFbmQgICA9PiAnMTg6MDAnLAogICAgICAgICAgICBEYXRlICAgICAgPT4gJzIwMDgtMTAtMzEnLCAjIHRoZSBkYXRlIG9mIHRoZSB3b3JraW5nIHVuaXQKICAgICAgICAgICAgUGVyaW9kICAgID0+IDExLAogICAgICAgICAgICBDcmVhdGVkICAgPT4gJzIwMDgtMTEtMDEnLCAjIHRoZSBpbnNlcnQgdGltZSBvZiB0aGUgd29ya2luZyB1bml0CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIElEICAgICAgICA9PiA5OTksCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxNiwKICAgICAgICAgICAgVXNlciAgICAgID0+ICdNYW5lJywKICAgICAgICAgICAgQWN0aW9uSUQgID0+IDcsCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnZGV2ZWxvcG1lbnQnLAogICAgICAgICAgICBSZW1hcmsgICAgPT4gJ3JlbWFyaycsCiAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnNzowMCcsCiAgICAgICAgICAgIFRpbWVFbmQgICA9PiAnMTg6MDAnLAogICAgICAgICAgICBQZXJpb2QgICAgPT4gMTEsCiAgICAgICAgICAgIERhdGUgICAgICA9PiAnMjAwOC0xMS0wMycsCiAgICAgICAgICAgIENyZWF0ZWQgICA9PiAnMjAwOC0xMS0wMycsCiAgICAgICAgfQogICAgKTsKCj1jdXQKCnN1YiBQcm9qZWN0SGlzdG9yeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtCiAgICBpZiAoICEkUGFyYW17UHJvamVjdElEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnUHJvamVjdEFjdGlvblJlcG9ydGluZzogTmVlZCBQcm9qZWN0SUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FsbCBhY3Rpb24gZGF0YSB0byBnZXQgdGhlIHJlYWRhYmxlIG5hbWUgb2YgdGhlIGFjdGlvbgogICAgbXkgJUFjdGlvbkRhdGEgPSAkU2VsZi0+QWN0aW9uU2V0dGluZ3NHZXQoKTsKCiAgICBteSAlU2hvd25Vc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KCBUeXBlID0+ICdMb25nJywgVmFsaWQgPT4gMCApOwoKICAgICMgZGIgc2VsZWN0CiAgICBteSBARGF0YSA9ICgpOwogICAgbXkgJFNRTCAgPSAnU0VMRUNUIGlkLCB1c2VyX2lkLCBhY3Rpb25faWQsIHJlbWFyaywgdGltZV9zdGFydCwgdGltZV9lbmQsIHBlcmlvZCwgY3JlYXRlZCAnCiAgICAgICAgLiAnIEZST00gdGltZV9hY2NvdW50aW5nX3RhYmxlIFdIRVJFIHByb2plY3RfaWQgPSA/JzsKICAgIG15ICRCaW5kID0gWyBcJFBhcmFte1Byb2plY3RJRH0gXTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCwgQmluZCA9PiAkQmluZCApOwoKICAgICMgZmV0Y2ggRGF0YQogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAkVXNlclJlZiA9IHsKICAgICAgICAgICAgSUQgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBVc2VyICAgICAgPT4gJFNob3duVXNlcnN7ICRSb3dbMV0gfSwKICAgICAgICAgICAgQWN0aW9uSUQgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAkQWN0aW9uRGF0YXsgJFJvd1syXSB9e0FjdGlvbn0sCiAgICAgICAgICAgIFJlbWFyayAgICA9PiAkUm93WzNdIHx8ICcnLAogICAgICAgICAgICBUaW1lU3RhcnQgPT4gJFJvd1s0XSwKICAgICAgICAgICAgVGltZUVuZCAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIERhdGUgICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBQZXJpb2QgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgQ3JlYXRlZCAgID0+ICRSb3dbN10sCiAgICAgICAgfTsKICAgICAgICAkVXNlclJlZi0+e0RhdGV9ID1+IHN7KFxkXGRcZFxkLVxkXGQtXGRcZCkgXHMgLisgfXskMX1zbXg7CgogICAgICAgIHB1c2ggQERhdGEsICRVc2VyUmVmOwogICAgfQoKICAgIHJldHVybiBARGF0YTsKCn0KCj1pdGVtIExhc3RQcm9qZWN0c09mVXNlcigpCgpyZXR1cm5zIHRoZSBhIGFycmF5IHdpdGggdGhlIGxhc3QgcHJvamVjdHMgb2YgdGhlIHVzZXIKCiAgICBteSBATGFzdFByb2plY3RzID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5MYXN0UHJvamVjdHNPZlVzZXIoKTsKCj1jdXQKCnN1YiBMYXN0UHJvamVjdHNPZlVzZXIgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGRiIHNlbGVjdAogICAgIyBJIGRvbid0IHVzZSBkaXN0aW5jdCBiZWNhdXNlIG9mIE9SREVSIEJZIHByb2JsZW1zIG9mIHBvc3RncmUgc3FsCiAgICBteSAlUHJvamVjdHMgPSAoKTsKICAgIG15ICRTUUwKICAgICAgICA9ICdTRUxFQ1QgcHJvamVjdF9pZCBGUk9NIHRpbWVfYWNjb3VudGluZ190YWJsZSBXSEVSRSB1c2VyX2lkID0gPyBBTkQgcHJvamVjdF9pZCA8PiAtMSBPUkRFUiBCWSB0aW1lX3N0YXJ0IERFU0MnOwogICAgbXkgJEJpbmQgID0gWyBcJFNlbGYtPntVc2VySUR9IF07CiAgICBteSAkTGltaXQgPSA0MDsKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMLCBCaW5kID0+ICRCaW5kLCBMaW1pdCA9PiAkTGltaXQgKTsKCiAgICAjIGZldGNoIERhdGEKICAgIG15ICRDb3VudGVyID0gMDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBST1cgaWYgJENvdW50ZXIgPiA3OwogICAgICAgIG5leHQgUk9XIGlmICRQcm9qZWN0c3sgJFJvd1swXSB9OwoKICAgICAgICAkUHJvamVjdHN7ICRSb3dbMF0gfSA9IDE7CiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICByZXR1cm4ga2V5cyAlUHJvamVjdHM7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQwLjIuMSAkICREYXRlOiAyMDEwLTEyLTAzIDA5OjM5OjU2ICQKCj1jdXQK
IyAtLQojIHNjcmlwdHMvdGVzdC9UaW1lQWNjb3VudGluZy50IC0gVGltZUFjY291bnRpbmcgdGVzdHNjcmlwdAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVGltZUFjY291bnRpbmcudCx2IDEuNiAyMDEwLTA3LTI5IDA4OjQwOjE2IGpwIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGRlY2xhcmUgZXh0ZXJuYWxseSBkZWZpbmVkIHZhcmlhYmxlcyB0byBhdm9pZCBlcnJvcnMgdW5kZXIgJ3VzZSBzdHJpY3QnCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZUFjY291bnRpbmc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCm15ICRVc2VyT2JqZWN0ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7Cm15ICRUaW1lQWNjb3VudGluZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lQWNjb3VudGluZy0+bmV3KAogICAgJXskU2VsZn0sCiAgICBVc2VySUQgICAgID0+IDEsCiAgICBVc2VyT2JqZWN0ID0+ICRVc2VyT2JqZWN0LAopOwoKIyBJRHMgb2YgY3JlYXRlZCBwcm9qZWN0cwpteSBAUHJvamVjdElEczsKCiMgaW5zZXJ0IHRlc3QgcHJvamVjdCBzZXR0aW5ncwpteSAkUHJvamVjdElEID0gJFRpbWVBY2NvdW50aW5nT2JqZWN0LT5Qcm9qZWN0U2V0dGluZ3NJbnNlcnQoCiAgICBQcm9qZWN0ICAgICAgICAgICAgPT4gJ1Rlc3QnLAogICAgUHJvamVjdERlc2NyaXB0aW9uID0+ICdEZXNjcmlwdGlvbicsCiAgICBQcm9qZWN0U3RhdHVzICAgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFByb2plY3RJRCwKICAgICdJbnNlcnQgdGVzdCBwcm9qZWN0IHNldHRpbmdzIGludG8gZGF0YWJhc2UnLAopOwoKcHVzaCBAUHJvamVjdElEcywgJFByb2plY3RJRDsKCiMgY2hlY2sgaWYgcHJvamVjdCBzZXR0aW5ncyBoYXZlIChyZWFsbHkpIGJlZW4gY3JlYXRlZApteSAlUHJvamVjdERhdGEgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RTZXR0aW5nc0dldCgKICAgIFN0YXR1cyA9PiAndmFsaWQnLAopOwoKbXkgJFByb2plY3RGb3VuZCAgICAgICAgICAgID0gMDsKbXkgJFByb2plY3REZXNjcmlwdGlvbkZvdW5kID0gMDsKCiRTZWxmLT5UcnVlKAogICAgZXhpc3RzICRQcm9qZWN0RGF0YXtQcm9qZWN0fS0+eyRQcm9qZWN0SUR9CiAgICAgICAgJiYgJFByb2plY3REYXRhe1Byb2plY3R9LT57JFByb2plY3RJRH0gZXEgJ1Rlc3QnCiAgICAgICAgJiYgZXhpc3RzICRQcm9qZWN0RGF0YXtQcm9qZWN0RGVzY3JpcHRpb259LT57JFByb2plY3RJRH0KICAgICAgICAmJiAkUHJvamVjdERhdGF7UHJvamVjdERlc2NyaXB0aW9ufS0+eyRQcm9qZWN0SUR9IGVxICdEZXNjcmlwdGlvbicsCiAgICAndGVzdCBwcm9qZWN0IGZvdW5kJywKKTsKCiMgZGVsZXRlIHRlc3QgcHJvamVjdChzKQpmb3IgbXkgJFByb2plY3RJRCAoQFByb2plY3RJRHMpIHsKICAgIG15ICRSZXN1bHQgPSAkVGltZUFjY291bnRpbmdPYmplY3QtPlByb2plY3RTZXR0aW5nc0RlbGV0ZSgKICAgICAgICBQcm9qZWN0SUQgPT4gJFByb2plY3RJRCwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFJlc3VsdCwKICAgICAgICAndGVzdCBwcm9qZWN0IGRlbGV0ZWQnLAogICAgKTsKCiAgICAjIFRPRE86CiAgICAjIHRlc3QgaWYgZGVsZXRlZCBwcm9qZWN0IHJlYWxseSBkb2Vzbid0IGV4aXN0IGFueW1vcmUKfQoKMTsK
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAEo0lEQVQ4y42VW2yURRTHf99lu7tdSr/laoBCa28qERaRRChSUWKEYKhcEqMEKoIKIdbGEDHRaIhCMJK2MZHEB60aHlRCMEDkQSlGFC1Bti1eCoFuuZV7lwK97DdzxoduSxERTnIyk8nM7/wzc+YcyxjDnSxv0U7PaIkZpRGt4yd3LUze6Yx1O3Dh0u9jRusKUbrMKO2J0oivMEojSifFV9vFVzXn9y+L3xW4+MU6z4hUidblxsskK38Y9xVEKRwVIdO1ONDSwemjFzlZ34Lfch6jVK0oqbzcuCp5W3Dx8jrPiKkj6MTGlOTycslIysaFEAPraw+TEw0wd04xKQMHL/p8/kMr+z/dh7rYERelZ145UtkPt/uhK/Z6xpg6OysYm7ckxmfzx/JUToiUgG9g3NAMRkSDCCAGxkcDvLeggBUflOGOyI6Jr+sGjd3o3QI2IlV20I3NWjSeiknZBB2LlECPQErg6dlFTJmaiza94FOtCcTA3GKP8vXzcLMzY6J01U3gomV7YkZL+Zjpebw0IRtlelWmBFLp0Tc3/HBjnPklk9iw5lVSGqbneUxd9TjG1+WhIe/G+sFGpCI8PMKCKSMI2L1KB3pPH1zgcEOcJbNnIiLEZjxB8loX3RrufziXwcX3IEpX3ABrKRtaMIwJQzPw04CBavu8aQD0rc1fMGTiozRetdjdepXWjh5Glz6A+LoMwM1/breHMV5hwRC0segWCNhgG7Ct3vtqbopzujXB2ytfQIuwurqWzvxHaE8F6dGKoANiLEZNzKFBa8+yX/dsIxITpYlGw9R+9Se7vjvCNQVdGro1JBIJ1jz/DIn6H7l6JcmMxSu50K05+3cDgwI2gwI2l5rP0/ztIYaN9hClwRBzjdIYLbi2RfJckizCXEmlVVtw9HgCz/MoLS2lurqa3Zs39uf9up9PEMkehnO9E3O5g7BrQfpfuEYkLkrTmezkyaXTCNqQTIMdC+6dUkpR6WzWrtvAKxs+YvDQkWgDSgwR18Z1bWKlBRSW5NN2or0vZtwyxpAz55v20oUTvIem5ZHpWoRdi7BjEXYhaFu4NvjdXThuAByXlBh6tKFLGTqV4boyXPeFX7f9zo53tiWN2RS1AUTp7Ud+ayVoG8IORFzICsCggEVWhsXggM3wwRGimRlkBWyyAjYR175JRMixOLzzEMD2/nQTX9Wc+OssZ46eJ+iQVmsRcW0irkXE7Q0WSQeNuBaRgEXYtQk5FkHH4sTBBC0HWgBq+sFtdYvjxle1Wz/eh+7yCaYVhB0I25DppKFO7zzkQCi9J+hY+Ne72fLmVoBaYzbFb6oVoqXyUltH/MM3dpDqTJFhWwQsCKbBe/afpqmpjZDduxZIe8/Vbt5/9hMunmqPA5W3FKEL9cuTovTMRPO5+GtLttB48CSuBQELMmxobjxN27EL/dniAA2/HGP1rCoSf5yJAzON2ZS8baHPLqryjNJV4uvyyZNHs2jBgzxWMo6CXA9toPn4Zer2HuPrLw9Q/9MxgFqgciD0f1tTZNT6mPi6QnxVJkp7RinE1xgRgGT69Wv67vSue95Ac0Nrvb6vjyH+b3X/Zf8AFuFkUCNJ29gAAAAASUVORK5CYII=
IyAtLQojIFRpbWVBY2NvdW50aW5nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRpbWVBY2NvdW50aW5nLnBtLHYgMS40IDIwMDgtMDgtMjkgMDU6NTU6MjYgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6VGltZUFjY291bnRpbmc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKClRpbWVBY2NvdW50aW5nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpUaW1lQWNjb3VudGluZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgdGltZV9hY2NvdW50aW5nCiAgICAkU2VsZi0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aW1lX2FjY291bnRpbmcnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgYWxsIHRpbWUgYWNjb3VudGluZyB1c2VyLicsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIHRpbWVfYWNjb3VudGluZwogICAgJFNlbGYtPl9Hcm91cERlYWN0aXZhdGUoCiAgICAgICAgTmFtZSA9PiAndGltZV9hY2NvdW50aW5nJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cEFkZCgpCgphZGQgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dyb3VwQWRkKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0aGUtZ3JvdXAtbmFtZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBncm91cCBkZXNjcmlwdGlvbi4nLAogICAgKTsKCj1jdXQKCnN1YiBfR3JvdXBBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBEZXNjcmlwdGlvbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdmFsaWQgbGlzdAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgIyBjaGVjayBpZiBncm91cCBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyByZWFjdGl2YXRlIHRoZSBncm91cAogICAgaWYgKCRHcm91cElEKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgICAgIG15ICVHcm91cERhdGEgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBHZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWFjdGl2YXRlIGdyb3VwCiAgICAgICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICAgICAlR3JvdXBEYXRhLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgYWRkIHRoZSBncm91cAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBDb21tZW50ID0+ICRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb2t1cCB0aGUgbmV3IGdyb3VwIGlkCiAgICBteSAkTmV3R3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICBHcm91cCAgPT4gJFBhcmFte05hbWV9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGFkZCB1c2VyIHJvb3QgdG8gdGhlIGdyb3VwCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJBZGQoCiAgICAgICAgR0lEICAgICAgICA9PiAkTmV3R3JvdXBJRCwKICAgICAgICBVSUQgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICAgICAgY3JlYXRlICAgID0+IDEsCiAgICAgICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICAgICAgcncgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Hcm91cERlYWN0aXZhdGUoKQoKZGVhY3RpdmF0ZSBhIGdyb3VwCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ3RoZS1ncm91cC1uYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dyb3VwRGVhY3RpdmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICMgZ2V0IGN1cnJlbnQgZ3JvdXAgZGF0YQogICAgbXkgJUdyb3VwRGF0YSA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cEdldCgKICAgICAgICBJRCAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVhY3RpdmF0ZSBncm91cAogICAgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwVXBkYXRlKAogICAgICAgICVHcm91cERhdGEsCiAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRMaXN0UmV2ZXJzZXtpbnZhbGlkfSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwOC0wOC0yOSAwNTo1NToyNiAkCgo9Y3V0Cg==