ITSMChangeManagement
2.0.71
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.1.0 alpha1.
The OTRS::ITSM Change Management package.
Das OTRS::ITSM Change Management Paket.
2.4.x
<br>
<b>WELCOME</b>
<br>
<br>
You are about to install the OTRS package ITSMChangeManagement.<br>
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 2.0.71</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMChangeManagement zu installieren.<br>
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 2.0.71</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>NOTICE</b>
<br>
<br>
In order to grant users access to the change menu, you need to add them as member to the group 'itsm-change'.
<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 das Change-Menü zu gewähren, müssen diese Mitglied der neuen Gruppe 'itsm-change' 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>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 groups 'itsm-change', 'itsm-change-builder' and 'itsm-change-manager' that were created during package installation will be deactivated.
You can activate these groups again in the admin area.
<br>
<br>
All links to change objects and workorder objects will be irrevocably deleted!
<br>
<br>
The statistics that are associated with this package, will no longer be available if the package is uninstalled.
<br>
<br>
((enjoy))<br>
<br>
<br>
<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 angelegten Gruppen 'itsm-change', 'itsm-change-builder' und 'itsm-change-manager' werden deaktiviert.
Sie können jederzeit im Admin-Bereich wieder aktiviert werden.
<br>
<br>
Alle Verknüpfungen zu Change-Objekten und zu Workorder-Objekten werden unwiderruflich gelöscht!
<br>
<br>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>WELCOME</b>
<br>
<br>
You are about to upgrade the OTRS package ITSMChangeManagement.<br>
<br>
<b>Attention:</b><br>
If you are upgrading from 1.3.91 (Beta 1) or 1.3.92 (Beta 2),
all notification texts will be replaced automatically.
This is necessary due to several bugfixes.
Changes, that have been made to the notification texts, will be lost!
<br>
Also, if you are upgrading from 1.3.91 (Beta 1) all existing templates will be deleted.
This is because the internal structure of the template system had to changed prior to 1.3.92 (Beta 2).
<br>
<br>
<b>REQUIRED OTRS PACKAGES</b>
<ul>
<li>ITSMCore 2.0.71</li>
</ul>
<br>
((enjoy))<br>
<br>
<br>
<b>WILLKOMMEN</b>
<br>
<br>
Sie sind im Begriff das OTRS-Paket ITSMChangeManagement zu aktualisieren.<br>
<br>
<b>Achtung:</b><br>
Wenn Sie ausgehend von 1.3.91 (Beta 1) oder 1.3.92 (Beta2) aktualisieren,
werden aufgrund zahlreicher Bugfixes die Benachrichtigungstexte neu installiert.
Evtl. von Ihnen durchgeführte Änderungen an den Benachrichtigungstexten gehen dabei verloren!
<br>
Wenn Sie ausgehend von 1.3.91 (Beta 1) aktualisieren, werden die erstellten Vorlagen
gelöscht. Dies ist notwendig, weil die interne Struktur der Vorlagen zur Version 1.3.92 geändert wurde.
<br>
<br>
<b>BENÖTIGTE OTRS-PAKETE</b>
<ul>
<li>ITSMCore 2.0.71</li>
</ul>
<br>
((enjoy))<br>
<br>
ITSMCore
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start method
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 = 'CodeUpgrade';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# 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 = 'CodeUpgradeFromLowerThan_2_0_3';
# 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 = 'CodeUpgradeFromBeta1';
# 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 method
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 = 'CodeUpgradeFromBeta2';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUninstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm.",
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm.",
);
}
}
# cleanup stats list
{
# load required modules
$Self->{MainObject}->Require('Kernel::System::CSV');
$Self->{MainObject}->Require('Kernel::System::Group');
$Self->{MainObject}->Require('Kernel::System::User');
$Self->{MainObject}->Require('Kernel::System::Stats');
# create needed objects
$Self->{CSVObject} = Kernel::System::CSV->new( %{$Self} );
$Self->{GroupObject} = Kernel::System::Group->new( %{$Self} );
$Self->{UserObject} = Kernel::System::User->new( %{$Self} );
$Self->{StatsObject} = Kernel::System::Stats->new(
%{$Self},
UserID => 1,
);
# cleanup stats list
$Self->{StatsObject}->StatsCleanUp();
}
# define function name
my $FunctionName = 'CodeReinstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm.",
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm.",
);
}
}
2010-07-04 12:13:20
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBiaW4vb3Rycy5JVFNNQ2hhbmdlc0NoZWNrLnBsIC0gY2hlY2sgaXRzbSBjaGFuZ2VzCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBvdHJzLklUU01DaGFuZ2VzQ2hlY2sucGwsdiAxLjEwIDIwMTAvMDIvMjYgMDc6NTc6MDMgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFGRkVSTyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiMgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMgb3Igc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyB1c2UgLi4vIGFzIGxpYiBsb2NhdGlvbgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBGaW5kQmluIHF3KCRSZWFsQmluKTsKdXNlIGxpYiBkaXJuYW1lKCRSZWFsQmluKTsKdXNlIGxpYiBkaXJuYW1lKCRSZWFsQmluKSAuICcvS2VybmVsL2NwYW4tbGliJzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTAgJCkgWzFdOwoKdXNlIEtlcm5lbDo6Q29uZmlnOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwp1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwoKewoKICAgIHBhY2thZ2UgT1RSU01vY2tPYmplY3Q7CgogICAgdXNlIGJhc2UgJ0tlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXInOwoKICAgIHN1YiBuZXcgewogICAgICAgIG15ICggJENsYXNzLCAlT2JqZWN0cyApID0gQF87CgogICAgICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRDbGFzczsKCiAgICAgICAgZm9yIG15ICRPYmplY3QgKCBrZXlzICVPYmplY3RzICkgewogICAgICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJE9iamVjdHN7JE9iamVjdH07CiAgICAgICAgfQoKICAgICAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgICAgICBDb25maWcgICAgID0+ICdJVFNNQ2hhbmdlQ3JvbmpvYjo6RXZlbnRNb2R1bGUnLAogICAgICAgICAgICBCYXNlT2JqZWN0ID0+ICdDaGFuZ2VPYmplY3QnLAogICAgICAgICAgICBPYmplY3RzICAgID0+IHsKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZjsKICAgIH0KfQoKIyBjb21tb24gb2JqZWN0cwpteSAlQ29tbW9uT2JqZWN0OwokQ29tbW9uT2JqZWN0e0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiRDb21tb25PYmplY3R7RW5jb2RlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgTG9nUHJlZml4ID0+ICdPVFJTLUlUU01DaGFuZ2VzQ2hlY2snLAogICAgJUNvbW1vbk9iamVjdCwKKTsKJENvbW1vbk9iamVjdHtNYWluT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtUaW1lT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtEQk9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7SGlzdG9yeU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5LT5uZXcoJUNvbW1vbk9iamVjdCk7CgpteSAkTW9ja2VkT2JqZWN0ID0gT1RSU01vY2tPYmplY3QtPm5ldyglQ29tbW9uT2JqZWN0KTsKCiMgY2hlY2sgYXJncwpteSAkQ29tbWFuZCA9IHNoaWZ0IHx8ICctLWhlbHAnOwpwcmludCAib3Rycy5JVFNNQ2hhbmdlc0NoZWNrLnBsIDxSZXZpc2lvbiAkVkVSU0lPTj4gLSBjaGVjayBpdHNtIGNoYW5nZXNcbiI7CnByaW50ICJDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vXG4iOwoKIyBpZiBzeXNjb25maWcgb3B0aW9uIGlzIGRpc2FibGVkIC0+IGV4aXQKbXkgJFN5c0NvbmZpZyA9ICRDb21tb25PYmplY3R7Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpUaW1lUmVhY2hlZE5vdGlmaWNhdGlvbnMnKTsKaWYgKCAhJFN5c0NvbmZpZy0+e0ZyZXF1ZW5jeX0gKSB7CiAgICBleGl0KDApOwp9CgojIGRvIGNoYW5nZS93b3Jrb3JkZXIgcmVtaW5kZXIgbm90aWZpY2F0aW9uIGpvYnMKCm15ICRTeXN0ZW1UaW1lID0gJENvbW1vbk9iamVjdHtUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwpteSAkTm93ICAgICAgICA9ICRDb21tb25PYmplY3R7VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKKTsKCiMgbm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcycgcGxhbm5lZFhYWHRpbWUgZXZlbnRzCmZvciBteSAkVHlwZSAocXcoU3RhcnRUaW1lIEVuZFRpbWUpKSB7CgogICAgIyBnZXQgY2hhbmdlcyB3aXRoIFBsYW5uZWRTdGFydFRpbWUgb2xkZXIgdGhhbiBub3cKICAgIG15ICRQbGFubmVkQ2hhbmdlSURzID0gJENvbW1vbk9iamVjdHtDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgIlBsYW5uZWQke1R5cGV9T2xkZXJEYXRlIiA9PiAkTm93LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICkgfHwgW107CgogICAgQ0hBTkdFSUQ6CiAgICBmb3IgbXkgJENoYW5nZUlEICggQHskUGxhbm5lZENoYW5nZUlEc30gKSB7CgogICAgICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZSA9ICRDb21tb25PYmplY3R7Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIGNoYW5nZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFjdHVhbFhYWHRpbWUgc2V0IG9yIG5vdGlmaWNhdGlvbiB3YXMgc2VudAogICAgICAgIG5leHQgQ0hBTkdFSUQgaWYgJENoYW5nZS0+eyJBY3R1YWwkVHlwZSJ9OwoKICAgICAgICBteSAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0gQ2hhbmdlTm90aWZpY2F0aW9uU2VudCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBUeXBlICAgICA9PiAiUGxhbm5lZCR7VHlwZX0iLAogICAgICAgICk7CgogICAgICAgIG5leHQgQ0hBTkdFSUQgaWYgU2VudFdpdGhpblBlcmlvZCgkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlKTsKCiAgICAgICAgIyB0cmlnZ2VyIENoYW5nZVBsYW5uZWRTdGFydFRpbWVSZWFjaGVkUG9zdC1FdmVudAogICAgICAgICRNb2NrZWRPYmplY3QtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gIkNoYW5nZVBsYW5uZWQke1R5cGV9UmVhY2hlZFBvc3QiLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlcyB3aXRoIGFjdHVhbHh4eHRpbWUKICAgIG15ICRBY3R1YWxDaGFuZ2VJRHMgPSAkQ29tbW9uT2JqZWN0e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAiQWN0dWFsJHtUeXBlfU9sZGVyRGF0ZSIgPT4gJE5vdywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICkgfHwgW107CgogICAgQUNUVUFMQ0hBTkdFSUQ6CiAgICBmb3IgbXkgJENoYW5nZUlEICggQHskQWN0dWFsQ2hhbmdlSURzfSApIHsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlID0gJENvbW1vbk9iamVjdHtDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0gQ2hhbmdlTm90aWZpY2F0aW9uU2VudCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICBUeXBlICAgICA9PiAiQWN0dWFsJHtUeXBlfSIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBBQ1RVQUxDSEFOR0VJRCBpZiAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlOwoKICAgICAgICAjIHRyaWdnZXIgRXZlbnQKICAgICAgICAkTW9ja2VkT2JqZWN0LT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICJDaGFuZ2VBY3R1YWwke1R5cGV9UmVhY2hlZFBvc3QiLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICB9Cn0KCiMgZ2V0IGNoYW5nZXMgd2l0aCBhY3R1YWx4eHh0aW1lCm15ICRSZXF1ZXN0ZWRUaW1lQ2hhbmdlSURzID0gJENvbW1vbk9iamVjdHtDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAiUmVxdWVzdGVkVGltZU9sZGVyRGF0ZSIgPT4gJE5vdywKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAopIHx8IFtdOwoKQ0hBTkdFSUQ6CmZvciBteSAkQ2hhbmdlSUQgKCBAeyRSZXF1ZXN0ZWRUaW1lQ2hhbmdlSURzfSApIHsKCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZSA9ICRDb21tb25PYmplY3R7Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICBteSAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0gQ2hhbmdlTm90aWZpY2F0aW9uU2VudCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVHlwZSAgICAgPT4gIlJlcXVlc3RlZFRpbWUiLAogICAgKTsKCiAgICBuZXh0IENIQU5HRUlEIGlmICRMYXN0Tm90aWZpY2F0aW9uU2VudERhdGU7CgogICAgIyB0cmlnZ2VyIEV2ZW50CiAgICAkTW9ja2VkT2JqZWN0LT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gIkNoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkUG9zdCIsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cn0KCiMgbm90aWZpY2F0aW9ucyBmb3Igd29ya29yZGVycycgcGxhbm5lZFhYWHRpbWUgZXZlbnRzCmZvciBteSAkVHlwZSAocXcoU3RhcnRUaW1lIEVuZFRpbWUpKSB7CgogICAgIyBnZXQgd29ya29yZGVycyB3aXRoIFBsYW5uZWRTdGFydFRpbWUgb2xkZXIgdGhhbiBub3cKICAgIG15ICRQbGFubmVkV29ya09yZGVySURzID0gJENvbW1vbk9iamVjdHtXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgIlBsYW5uZWQke1R5cGV9T2xkZXJEYXRlIiA9PiAkTm93LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICkgfHwgW107CgogICAgV09SS09SREVSSUQ6CiAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHskUGxhbm5lZFdvcmtPcmRlcklEc30gKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRDb21tb25PYmplY3R7V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIHdvcmtvcmRlciBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFjdHVhbFhYWHRpbWUgc2V0IG9yIG5vdGlmaWNhdGlvbiB3YXMgc2VudAogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgJFdvcmtPcmRlci0+eyJBY3R1YWwkVHlwZSJ9OwoKICAgICAgICBteSAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0gV29ya09yZGVyTm90aWZpY2F0aW9uU2VudCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAiUGxhbm5lZCR7VHlwZX0iLAogICAgICAgICk7CgogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgU2VudFdpdGhpblBlcmlvZCgkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlKTsKCiAgICAgICAgIyB0cmlnZ2VyIFdvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkUG9zdC1FdmVudAogICAgICAgICRNb2NrZWRPYmplY3QtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gIldvcmtPcmRlclBsYW5uZWQke1R5cGV9UmVhY2hlZFBvc3QiLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlcnMgd2l0aCBhY3R1YWx4eHh0aW1lCiAgICBteSAkQWN0dWFsV29ya09yZGVySURzID0gJENvbW1vbk9iamVjdHtXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgIkFjdHVhbCR7VHlwZX1PbGRlckRhdGUiID0+ICROb3csCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApIHx8IFtdOwoKICAgIFdPUktPUkRFUklEOgogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7JEFjdHVhbFdvcmtPcmRlcklEc30gKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRDb21tb25PYmplY3R7V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3ROb3RpZmljYXRpb25TZW50RGF0ZSA9IFdvcmtPcmRlck5vdGlmaWNhdGlvblNlbnQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gIkFjdHVhbCR7VHlwZX0iLAogICAgICAgICk7CgogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgJExhc3ROb3RpZmljYXRpb25TZW50RGF0ZTsKCiAgICAgICAgIyB0cmlnZ2VyIEV2ZW50CiAgICAgICAgJE1vY2tlZE9iamVjdC0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAiV29ya09yZGVyQWN0dWFsJHtUeXBlfVJlYWNoZWRQb3N0IiwKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgIH0KfQoKIyBjaGVjayBpZiBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSBzZW50IGZvciB0aGUgZ2l2ZW4gY2hhbmdlCnN1YiBDaGFuZ2VOb3RpZmljYXRpb25TZW50IHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDaGFuZ2VJRCBUeXBlKSkgewogICAgICAgIHJldHVybiBpZiAhJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICMgZ2V0IGhpc3RvcnkgZW50cmllcwogICAgbXkgJEhpc3RvcnkgPSAkQ29tbW9uT2JqZWN0e0hpc3RvcnlPYmplY3R9LT5DaGFuZ2VIaXN0b3J5R2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgIyBzZWFyY2ggZm9yIG5vdGlmaWNhdGlvbnMgc2VudCBlYXJsaWVyCiAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoIHJldmVyc2UgQHskSGlzdG9yeX0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57SGlzdG9yeVR5cGV9IGVxICdDaGFuZ2UnIC4gJFBhcmFte1R5cGV9IC4gJ1JlYWNoZWQnCiAgICAgICAgICAgICYmICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSA9fiBteyBOb3RpZmljYXRpb24gXHMgU2VudCAkIH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRIaXN0b3J5RW50cnktPntDcmVhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgojIGNoZWNrIGlmIGEgbm90aWZpY2F0aW9uIHdhcyBhbHJlYWR5IHNlbnQgZm9yIHRoZSBnaXZlbiB3b3Jrb3JkZXIKc3ViIFdvcmtPcmRlck5vdGlmaWNhdGlvblNlbnQgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFdvcmtPcmRlcklEIFR5cGUpKSB7CiAgICAgICAgcmV0dXJuIGlmICEkUGFyYW17JE5lZWRlZH07CiAgICB9CgogICAgIyBnZXQgaGlzdG9yeSBlbnRyaWVzCiAgICBteSAkSGlzdG9yeSA9ICRDb21tb25PYmplY3R7SGlzdG9yeU9iamVjdH0tPldvcmtPcmRlckhpc3RvcnlHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAjIHNlYXJjaCBmb3Igbm90aWZpY2F0aW9ucyBzZW50IGVhcmxpZXIKICAgIGZvciBteSAkSGlzdG9yeUVudHJ5ICggcmV2ZXJzZSBAeyRIaXN0b3J5fSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZX0gZXEgJ1dvcmtPcmRlcicgLiAkUGFyYW17VHlwZX0gLiAnUmVhY2hlZCcKICAgICAgICAgICAgJiYgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnROZXd9ID1+IG17IE5vdGlmaWNhdGlvbiBccyBTZW50IH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRIaXN0b3J5RW50cnktPntDcmVhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgU2VudFdpdGhpblBlcmlvZCB7CiAgICBteSAkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlID0gc2hpZnQ7CgogICAgcmV0dXJuIGlmICEkTGFzdE5vdGlmaWNhdGlvblNlbnREYXRlOwoKICAgICMgZ2V0IFN5c0NvbmZpZyBvcHRpb24KICAgIG15ICRDb25maWcgPSAkQ29tbW9uT2JqZWN0e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6VGltZVJlYWNoZWROb3RpZmljYXRpb25zJyk7CgogICAgIyBpZiBub3RpZmljYXRpb25zIHNob3VsZCBiZSBzZW50IG9ubHkgb25jZQogICAgcmV0dXJuIDEgaWYgJENvbmZpZy0+e0ZyZXF1ZW5jeX0gZXEgJ29uY2UnOwoKICAgICMgZ2V0IGVwb2NoZSBzZWNvbmRzIG9mIHNlbmQgdGltZQogICAgbXkgJFNlbnRFcG9jaGUgPSAkQ29tbW9uT2JqZWN0e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICBTdHJpbmcgPT4gJExhc3ROb3RpZmljYXRpb25TZW50RGF0ZSwKICAgICk7CgogICAgIyBjYWxjIGRpZmYKICAgIG15ICRFcG9jaGVTaW5jZVNlbnQgPSAkU3lzdGVtVGltZSAtICRTZW50RXBvY2hlOwogICAgbXkgJEhvdXJzU2luY2VTZW50ID0gaW50KCAkRXBvY2hlU2luY2VTZW50IC8gKCA2MCAqIDYwICkgKTsKCiAgICBpZiAoICRIb3Vyc1NpbmNlU2VudCA+PSAkQ29uZmlnLT57SG91cnN9ICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKZXhpdCgwKTsK
iVBORw0KGgoAAAANSUhEUgAAB9EAAAQbCAIAAACwX8z6AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAfQAAAH0AG5i+efAAAgAElEQVR4nOzde8xt6VkQ8P2dc+ZcZqa2M7Rl7FQKsSqClIBNzKC9WIuUjiReEqJcRkgkilYIEE2NJk5jCGpK6ZBMKhCDSYVqEzSx1UTUtFJabIBeaGhsazutZYBe7Ix2Lmdmzvm2f3ztnnXe23rX2mvtddm/3x8n+6z9rvd91vr2bT3rXc862W63GwAAAACAIbzhDW/4sR/7samjYHj/4T/8h+/4ju+YOooFuDB1AAAAAADAqvyNv/E37rvvvqmjYEh333331CEshpw7AAAAADCkCxcu3HzzzVNHwZDOnz8/dQiLcW7qAAAAAAAAYCXk3AEAAAAAYBhy7gAAAADAsTg5OQkeFB4fWGHo/aOacLuOjZw7AAAAAHB0ttttp+XTmmdUJMm5AwAAAADAMC5MHQAAAAAAwNN2VVCCyd2F5dvttlk7pWbFs7V2z579e9ZP/eqFQfttY2u0/XoItrE+TnqQcwcAAAAA5qKZXK55nFxSWDEeMZlnb+2q9b89trF1M3v3UN5GhqW2DAAAAAAwC0FeeDeRPLe8uaSyw0Hi6ddb1z7jzWztoXVHcQBy7gAAAADATJmavSc78PDUlgEAAAAAWBKz1+dMzh0AAAAAYEnMXp8ztWUAAAAAgJkyobtGYS/ZgYcn5w4AAAAAzEJwz8/dHUFzy3t0OEg8+yj3WTNcoYcxAqYrtWUAAAAAgLloZo2b+eLc8q4d5tLuZ8vjnnuPWx9Sj+H69ZDbRoYl5w4AAAAAzEguKVy/PE5Dx4+TC2t669Qsp9Bn/RT+Hp1zAGrLAAAAAADAMMxzBwAAAAAYTKFqfI/J5grCLI6cOwAAAADAYIbNj8u2L47aMgAAAAAAMAw5dwAAAAAAGIacOwAAAAAADEM9dwAAAABgMNeuXXvkkUc+9alPTR0IQ3r88cevX78+dRTLIOcOAAAAAAzm137t1972tre99a1vnToQhnTt2rX3v//9f/Ev/sWpA1kAOXcAAAAAYDAveclL7rjjjje96U1TB8KQXvnKV774xS+eOoplUM8dAAAAAACGIecOAAAAAADDkHMHAAAAAIBhyLkDAAAAAMAw5NwBAAAAgGmcnJwUnio8e0i5SAoRziRyJnGy3W6njgEAAAAA6OPlL3/5Y489NnUUN7jzzjvvuOOON73pTc2FJyd98pD91hpDLpL9I5zPNpa98pWvvHLlymc+85mpA5m1P/JH/sgv/MIvXJg6DAAAAACgp9/8zd9885vffNttt00dyNN++Zd/+Qtf+EJrs91M8CDjnFu+e6oyQx3MNN9ut7vVd2nuZr672X6fJHgy/ubQzafO/lvY5Fn583/+z7/oRS+aOor5+u3f/u2f/dmf3Ww2cu4AAAAAsGDf8i3f8tznPnfqKJ72m7/5mzU5913Wu7kwlwTvKpg83kx5nz0V5N/j9r3T38ntag7d7D8ees6++qu/+mUve9nUUczXxYsXzx7IuQMAAAAAo2imnrvO5t5lxptLKscN1m2uuHscLDxABfal5NbZk5w7AAAAADCK5qT1A2ecO81bT86Lh37OTR0AAAAAAEAoTnyflWfpt+4+4x6MXP86mOcOAAAAABzaLr/cvK1os8ZLUAO9d/+bG2usJ2+gWhg3GWfX5c2hgzCCoXtsKXMj5w4AAAAAjCvOJufyy8na6+VVaobL9Zwr794pzn5Dt3bFQqktAwAAAAAAw5BzBwAAAACAYci5AwAAAADAMOTcAQAAAABgGHLuAAAAAAAwDDl3AAAAAAAYhpw7AAAAAAAMQ84dAAAAAACGcWHqAAAAAAAA1uzk5GSz2Wy322H7bHZ4NkQ8ym558GxzedDPsHEeITl3AAAAAGBcR57J3W63Qe57WM3dG+/qeM/H+fpj/usMTs4dAAAAmNLp6enUIUCtk5OTUTOnx2M37zueAB7Pv2423i1pna+9qZ5dHswQz/13E00Sb2bS43iaARdC6tr/rkFzyYAZ82TYdCLnDgAAAEzp2c9+9kMPPTR1FFDlb//tv33//fdPHcUanCV24xx6cv51s3GQfx9kvnbQTy653/xvEH8ygPj0TOX2FvpvlVwll7hnJHLuAAAAwMQ+/vGPP+95z5s6Cmjxxje+8dOf/vTUUSxMM+8cZ37jFHChBkturcKVB/Up5lyevVwTptx/cuuS4/brP5ZMuKshc3hy7gAAAMDELl26dPny5amjgBYXLsikdVYoMp6Uuy9ozRBj6BHPVP3Lp8/HuakDAAAAAAAI7Z/g7lR/v7WcS494Oq0yVMI9eW0Bh+TsHAAAAABwUGe54GaJ9mbp9rM2uyT4bpWa2i/DzvVOxtOMORg0iCfIg1dub6H/gmR6PRdPbjmDkHMHAAAAGFgyOZh7jL1xDII/cfO/9U9tbswa59oUVu8UZCGeroN23d7WyOP7vnaKp7Dc+3F/assAAAAAjKVrtus42RvAmpjnDgAAJDzwwAOPP/741FHAUXvOc57znOc8Z+ooAJipkU5WOQe2Pzl3AAAg4bu+67s++clPXr58eepA4Eg99NBDP/zDP/y6171u6kDWLFcoubC8XAE5uWKzyMzu36AoROvqvcsux30mx22Wwanc/OZGJRvnAs6Vuj7A3gA4DDl3AAAg7Rd+4Rde8YpXTB0FHKnXvva1U4ewcjVl1gvp6dYV4xGTefbWrlr/23UbgzAqt6hT4/o+c9syxt7gkH7rt37rd37nd175yldOHQgD+8hHPvId3/EdU0exAHLuAAAAwHEJErW7NHRueXNJfYf7x1MetHefue0Nxipvfuu+Sq5V89QYe4MDe/7zn//Zz372B3/wB6cOhCH9o3/0j77yK79y6iiWQc4dAAAAOHYyuTCg22+//QUveIEJ0Stz3333PetZz5o6imWQcwcAAABYocJc+3Khmz37L5RcV40dOAZy7gAAAN0oH7wT3HoxWLixr2BShXdfrrbMUP2Xq9DknmJNfvVXf/U1r3nN1FEwpI985CNTh7AYcu4AAADsK5c1k01jKY4h+Tv2Nh7DPqTSS1/60uvXr08dBQP7oR/6oa/7uq+bOoplkHMHAAAAjkswxTu+uWiwvEeHg8Szj0Kfue3NNevdf6xm08bYGxzYi1/84he/+MVTRwGTkXMHAAAo2eXOgqRPuSRx8tldMYfcis2x4kRYbqw944/TbZWblszTnT179m+yckXvcWFYzZdcruB4p9dhsGIu7b57d1TGs49kn3Gll+aSTmHU7MP6p2p6BlgEOXcAAICsylmc9f+tfCrI1vWe8lkT/z7bEo9YrhDde1wYQ9eaSMlEee6/zSx2uUF53MpmOTWrF7aiR3jl5fX9jLE3AA7j3NQBAAAAzFRyNujuceVagcp6C4Xsc2H+bGufu0noPaadloPcJ55+vQEAzJN57gAAALVq8sLJgjAzIa8Na1L4hPFmB5iQnDsAMHf33nvv7t/mg9ZVcv8tLyn0X25THjTYiqXYf7dQ6d5777UD1ySYDr9/5n1uuXtgDgZPrMvUAwxCbRkAYM1yecyaDHKnVZJJ/DWlUHvsFurZjStzVkHlzFB9biND9QwAwLDMcwcAFqZ+/nhu/vVulUESnYcZBZiJmdzYs3cYM4kfAGDFzHMHAFauMAN9/2x4IbEu1Q4rENzks1/CurIsTDzW/mHkVhyww5q1WuMBAFgT89wBAJ52b0OwfNN90nqyt9zj3MKaSGoKv+TONFT203W3DLUV5X6SywvnVArDlUPqFGfXjQ1G6fQa4wCaaeJ+iengv/Vj5TrplKfOrThUh7lNO1se99x7XNZtu90+8MADjz322NSBQIvPf/7zTz311NRRAHMn5w4ArFwuUb5/ZrMmQ9qaem7NKVdmtGv6qVwy1J4Jlgy1FT22tNCs5g9UjnOfnuM4madk4ri8JPffritWPlWWWzG5vOvGJjct93jPcVmxk5OTb/3Wb3WvYObv2rVrP/ADPzB1FMDcybkDAKu1S2vOavpwPKm5PM05mfYt9xO3ibvt1KaTobaiXz/xKl2bJQNo3dv9eo4f5CLnGASFVtRd4dj8r//1v+68886po4AWr3/96x944IGpowDmTj13AGDNgkxoLmMbrxKnUAfMR8ePh+0n2XMyR1yzMPfU/rtl/71Rs6WbLhubDKkQ5549Q9NZ0ZWdyoT7Sd7YAQMAkGSeOwCwcoXM6dxSn4Us7f699W6z57i9h6jvp3KI8f7cc3shsVw9JrabCw8AMDdy7gDAsUjm3OeWLZ1bPP0MtRXr2BsAAMBRkXMHANapPJO9nG2/90aFfkZ1gKE7dd5vtwy1Ffv3Y547AABwAHLuAAA9BQnoXJtNx+InS0/gzifJDsD6FO52cHYbgx4Fl2pW7HpbY7dBBjhmcu4AwDrVJMQPEMNmuqxxzbbHbZaY6a78K4+3sevYjbHHHnvsbW9720c/+tGpA4Ej9YEPfOBrv/Zrp45iMrmcdSGRfXYj4h5j1azYNYFe3152HmB95NwBgJXL5UM3xZRoZQWVQrNB8q39OknmoOPwdmEHO2T/3VIeurfkRrVu6abvxlaGNFLPc3DzzTe//e1v/+///b9PHQgcqd/93d89f/781FHMyC4tHmSoc8s33We+J7uqGbc5UKGToOVueWETAFgiOXcAYLV6ZIcHH6XT0M2M9iDKXY20f4baik79tDYb78UwYM8zTNb/zM/8zCte8Yqpo4Aj9drXvvbSpUtTRzEjQUb7THOSeL9J7rmudo8rxy23P8u279baPThbLtUOsDLnpg4AAGBEuaTtAVLbA+adc0PUrNhckmxWXmsQQ2Wlk/1Ubmm8fMCN3b/nWeXZASZ08mXB4xpx5nq73dans3snvg8wBADL4mwqAMCxmOE06pEcz5aO6q677vrxH/9x89xhKmfz3F/3utdNHcgh3H777R/60IfuvPPO3ZLc7O9gefm/9Vr76TpueUnuMfP3+te//oEHHrj//vunDuQGz3jGMz7+8Y8/97nPnToQOHa/9mu/9oM/+IMf+MAHzHMHAFib5DzrVaahj2dLAWgVz4jvNE2+d2maPWvajNQVABNSzx0AYJ2OJ+l8PFsKcMx2+ehm/fTdXUk3Uc30rj0HXXUdt9x+Vy1n1zgo6R6PC8ByybkDAKxNcqL3KhPTx7OlM1fIcAW3FuzUZ+uKXTNrCjjAgiSLs7e2DNpUvuWD25/2GLd1eSHI+jgBWAo5dwCAdTqe1PPxbOnkcjnrQrYomP5Zr2bFrlmq+vay80Cr5meUTwwAmuTcAQCAnnL1EAp1ErrOfC+XeiiMG1d1SHYStNw0SkDkNgFg48MBKmy327/yV/7K1FEwvG/4hm84klt89ybnDgAA9BRktM80J4nveT/AoKug/kPruOX2QennoLaybBoA7Gm73f77f//vf/7nf/6mm26aOhYG8/73v/9Xf/VXp45i7uTcAQCAkuS9AeurJMeZ7vqheye+62vayK0DwKj+6l/9q5cvX546CgbzzGc+8/3vf//UUcydnDsAAFCSnGkOAAAknZs6AAAAYLXiyeZn5Vx6rz72iqN2BQDAMZBzBwAAetol0JuZ9F2d9Gap9B49J7vqNG65ffNeqfF9U3NdAQCLE3z7lx8fWHx/msrG/WI2meAw1JYBAACqxNnnXD66uTxoU18IvtC+ZtzW5YUg6+MEABak60+IuVlKnJjnDgAArMRJg4NSoCxZ6qrrDNCxZ4wW+u9UqqvrinPbDwDLYp47AACwEvLssBoHOHN2VkUqXtgpkgMEWXiqX6a7ZsWu21Xf3jlRcpoV3iqXBy/mmhWDwnfNWnb1qxcGrdzG3YpxGHFUQe27TpuZjHzXf7kT9iHnDgAAAMxdLuuUTH4FCaya1FIub1V+qtBPZTw121uzfJPKo/UYombc5kCFTuLtLexPjlzwpm59nFxSWDEeMZm/bu2q9b+V27j7bxBGHFW5//L+ieWy9p06oYacOwAAADBrufRZLjm1uxPyLi8cPNhEabjkPZ8LWblk+67xFLT2v2c5l1yWrXLccvvc9paznByt4FXRnN+dXN5cUt/h/vGUB+3UZ73yWuX90yMwb9KhyLkDAAAAsxDk088eBNmf+mRQa65qz7R1V8OmseL4O/XfO5j6/SZtR2/re/EkryZhxeTcAQAAgFlQ3wBYq+A84nwy7/OJZE3k3AEAAIAlGSQj3yPNNKszAXH8neq5996WAdNzs9qfMKo5v9pnG9iiybmzco8++ugXvvCFm2+++Su+4iumjgUAAIA+gnomwf0G4+W7e3XuGjRvV9hct1lzvLlucohkdYhm+67xFDa5tf8g/nrBDU67blewjcn2he3NjQtNc85Qr56dPwg5d1bu2rVrV69evXDBSx0A4EA6TbQ8pMIxZO+Ya1bseuzqWBc2qbdV7n1RuMFpskHuqcL7rnWIfeLpNGi5q649779dNZ3U/yk5WsF9O3M33a3/foxXHCSeAQ11vUhlnIXhDrCxx0kikpW7fv36ZrM5f/781IEAACxe5WHY4W9LWKmcUOsXc82KXY9d69s7MAYOJjl/H4aSuwCi94URhYszmnLnzge/ICO+CCa+XiQ4SdD1R1duv7UO5+qTMci5s3Knp6ebzebcuXNTBwIAsELB0WxwnBYfMRZKLuyO95Ltg2e7pn5yR5KFI8yuM9/LJRoK4ya3K+4k3j+7cg25TQAYkA8Zxrb/NRY1F7XUX+lSeSFI/VsjF17ltTi5Zyv3T78LXOhNzp2VM88dAGAk5au2myWSgwdBg21UUjluHySmk/0UxJn61vg7yV2UXTluuX1u/yTPcwALkvvk8b4GWDo5d1ZOzh0AYE/Je+W1FhEuX6YdK+eYktdEDyiOresF7EONO/gQwGx5X8Oa9P6RwyrJubNyassAAOxpqNtqxfPT9w8JAGAO/DihSSKSlTPPHQDgMDrl0Lsm3Me+KWuyNk79oL3DG3C75nnfWgCAI2SeOytnnjsAwEiCuijxvT13Dc4eN9s3a5TXt0+Ou6mYWbZr36yfnoun004IbnAaBFM5brl9bv8UxgUAYEJy7qycee4AAEOpKdoeLCyUfQ9uHNravmZ5Tk0/lUPnemjdFb2XF4KsjxNWKbgLca7NJG+Twrg1YR9GLpJChG7dDFDD5F/W7Gx61MY8dwCAZTppWFOWZ63bBQOqKZdU8/bZ/y3Wr3BTYdz5vOt7nNesD17BK+CYmefOmp1Ncj85OZFzBwBYovlkpoa11u2CUSWLWQVP5W7U3Gn5WdWmoLhTctxynDVBNp+q/GSIi2s1i1ztwg7qfdXH3zpuvNOaMTSXK37Fdrv9s3/2z7761a+eOhAG9k3f9E1ThzB3cu6s2VnOXcIdAGD1chMqJXpgHYKLQoKccvJxMumc66eQpO56PUozWZ8LuL63QBz/LsjmXR92YRf2W1fJ7QpuhhHcbcInMCcnJ+94xzv+3b/7dxcvXpw6Fgbz67/+6+9617umjmLu5NxZs7MbqCrmDgCwejI7sA7JuwqX3+D9bn08YIdd9bgRdG7dmptkHKDGi09gyr7927/98uXLU0fBYLbbrZx7q4Pm3O+9997CfwsLk23KLQvPxk/VD9p1rbh961q9t+tIVO7GM26gCgAAsCDJGesjDbFQneatJ+fFAzC2A9XcuPfee5M56/EyyLmEfr9Ef+/TA/0aM5Szee5qywAAAKzVGHnkXJ+DjBV3claepd+6+4x7MHL9wLE5xDz3Xbo5Oc89yIPn2rR2Xt9zTRit8beu1Rrk4KsQu3DhwjOe8YxLly5NHQgAAAD9JWuqBDfw3FTMYc/VdSnXbOl3D9XmbUWDTpo10LvK7YdkbfrCuMk4uy5vDh2E0XW/AazJ6PN/c5nu8lNDDVrz1C5v3qmoi5z4Itx888133HHHbbfdNnUgAAAsXv1E1E59xkPk5sDGzyYXxt3CEsVZ2m1Dc0nzqcqe466S/cdPDdJ/M/JgQ/p1nuy5/GzlfmhdHnee22RoVfjyGuMruJ9cJIUIZxI5B3ageu6FKeTzT17vGWGnGfG9+2y9VqAcT00/5QbJ8xbxVsfNCtGWN7McPAAAgxuvvPIibEe+FWFz98a7Ot7zcZnmY/7rMJT/9//+3wc/+MGpoxhAbtI67O93fud3fvRHf3TqKG7wxBNP/PzP//xSXuq5L6xC/GN/BdfLRVKIsP7vsqCv8scff/yf/tN/OnUUc/S///f//sIXvrAZO+deOX98Z9RgmsMllx9g9GFVbkhyk5PJ8XLGPNdJ4YRKbvRO0ba+fmqaAQAwuKCqQ5D/3T3eRiUgdkuaKeagfTxKTTDBcPF/m10VqlIEpRhaQ+ra/65BMCG0vI31kmFDjQ996EOvetWr/vgf/+MHHnfwl6vXP+P5rd/6rbe//e1TR3GD09PTX/zFX3zRi170FV/xFVPH0kfhizK5fFP98yDoZ9db758lnSTjz/182lVn2n/cA9hut7//+78/dRRz9NGPfvTzn//85mDz3A8sl4xu5ogPluIfdazWWeSbTD59E2Wrg3VzGfNyFr6TOF1eM2i5BwAADmYblQaOj1p3/202Dg50B5mvHfSTO4pu/nebKamcO+oOnu3df6vkKks5CGcF/tgf+2O/8Ru/ceBBb7/99gOPuI/9Z7OyaK9+9avvv//+qaN42unp6fnz59/73vdevnx56lhCp6en9913X2uz+AT5pu3ruF78Nb258Tt6jJ8lZ5Lblfv5tKzz5TfffPMb3/jGqaOYo5/7uZ97z3ves1lBzr33HOo9c8c1yfR9EsG50wZj9B+cjQgWNtvnsvmBmk5yf4g47S7hDgAwraCA+NmDZnY7aF9zeXVuIlthlVa5PHv5gvRy/8mtS47br/9Y8nhbDRmYFe9B6KH8c6Is/qrt+vMguWLyZ8lh6tj4GFm9xefcczolamsS6HEnle0PmREeMClf039lyyDzXu6w0Di5ooQ7AMDYCkXGk5ITyiqHGEOPeKbqXz4dgLXq+nNijKFrRh/7ZwNHYvE5996p8+SK9dne1pZd8/iF8A6z4v5qduAYpwGk3QEAZmv/I9VOBVuTxeX3jKdTamCohHvuMQAcoWSpt03dz4N9vkYnTLj79l+6xefcm5LlTXZPbfIJ3/q8bb8Z8fv0sI/Bx6o8J5FsJtsOALAyu5t97TLdzdLtZ212RUt3q9TUfhn2IDMZTzPmYNDcReidtrfQf0Hy2D4XT+FieQBYkObvhM2Xv9FyX6/79L/rvPk9vsn/LIlrr8dxdl2e+zkRD91jS5mPc6P2XpPzHSMHPVIq9pDp8n6aE/bnHOf+4ssUkk5PTw8QDADAkQgO/7ZfFjzOPRUs2dyYPg7aBKN0CjJunxu9PGiwvNP2lvvfrRVkATrFU1huchwAs1X4mm795g2eqhwu7jz3xV0etzXOmuVx57lNZtHGzbnv1JfzHmqgoOf90+U9ZrgHmst7hzGt5LT9XPo73mO5Wf/lJZ3iaXryySc//vGPf+ITn6jvEAAAgGMW3OZx8lLOhQDmEN6ZXCSFCGcSOcBIRs+555Lg5acGGbHy2V3WuLDi/Ge45wwVc/KPldstnZYkk/Jdw062P5vkfu7cgU4sAQBAVyNNZDM/jhWoz8kOm9UNJpz26GHYbHIhhvm803OR7B+81DywUIeo515Oao+XyI6nYPdLnZcTwcGz0+blgzn1Y3S+GTSPn+yw61T3XPvLly+/8IUvvH79et8AAQAAmIvyjRY6Ld+miiYXyigX+kk+TnbV9QYMuXha4+yXzt427kGdLHI91A0kWv8orX9EgPk7XG2ZwgTzMYarD2PUSCY3bKI8To7XTGkvLK9fvVVyxZOTkwsXVnWjYAAAgCO0u2XxmSAPm6yJXFje7K35VDKr22yczP/WjJuLvyAZTzKYHoJ4msHvbu2YvGX0/kPH2xX8UVr/uADz59Y6AABAwl133fXjP/7jr3jFK6YOBI7Ua1/72kuXLr3uda875KDvfve7/+7f/bvve9/7DjnoZrO5/fbbP/ShD915553JZO62MYU8WLjJ3zS46/Lks4X/1jxurpjcqFb18XSVu26gmQEPHhTi3/Ov0GlnTuv1r3/9Aw88cP/9908dyNNOT0/Pnz//+OOPX758eepYQnOOjd7e/va3/9RP/dR/+2//bepA5ujnfu7nfviHf/ixxx4zBRgAAACYhVyyNf7voSPb29xyx51y9yvY/wCH5PaSAAAAwGIUEr7D3k+1ct0e8Qwi7vysIEy/dfcZ9zAk+oEFMc8dAAAAmLWgzPeu2nj8VG6Vswc19ziNb+lZ7r8mnrgGeuu09zie8n7oKq4t0yzdvrlxbnth3GScnZY3xw1iyO18gJmTcwcAAI7CDOsCJ00V51L2T40gxzdUn8n8bFzVuvnfOM+46VjT42jFuyXId5cb13RS37i1/5p4uv6hazaqcj9Udp7sObmNhRh6LC/35g3CyviGOhJy7gAAQJWlH3otJfjx4iz/BZeyf2rEc4qHVb7HY/L+mbIYAGeO/DPQN9SRkHMHAAB6Sk6Mak7gSj5O1hkoVIEIFm7qJmollxcmfOXiqTnyDEoulOMv9D/I/szFU1NSoz6Y5M6p3GPBcLn/FsaNn9pEOz8XUtf+dw1qJvb2kAwb4Hh0+lpsNo6LIOV+Nmx8Q/XiG2ofcu6s1uc+97ntdnvbbbfddNNNU8cCALBCuYlRwQSuZl2CoARws33yWDTZf+4C6tzyTepQuTX+3HDl/dAcokf/uaxBcNDefBz3U8g+5LYl3j9D7ZykIJJc6qQwbjLO4O+7Se2Trv23Sq6SS4tAIH7RnvHK4ajUfJ3t/ttsHOTfc5/wPYLxDcX+5NxZrUceeeTatWvPfOYzpw4EAGDZglTs2YNkFnsnOVutuWJylfLQcefBirnl/fRbvX6toY51y/2MdETd6Y+Ya5k765B7UbX2X/Ni26f/WDKdsX/Gh+Ph5cFRKfyc2HT8xM6tNcgnvNhACRQAACAASURBVG8oBiHnzmqdnp5uNptz585NHQgAwLI1Z2kFh2djH63V5HaT88Q3DiaXqXCxwtz69wID6KTwcyKpxyf2qB/LvqHoRDqS1ZJzBwCYSvMC8DE677T8wEYNo0fnh9xdZxe/VzZuvVh+wI0dqv/musmKATN5EQKszP6frr6hfEMdmHnurNNZwn0j5w4AMJo4pZ4sOJObtxUcECYvM0/2HwyRmxSWXN6seJOrRbOLZ9egPF+sa62brv03u4rr2MaPCzV2mk+V98+AwXcSRBhvbBBP1zi79l+QTF4cpvARwJp0+sTerVJT+2XYD1vfUHQi5846neXcO53GBACgrKYa6SZK8vbrpLL/ffqp6b/yyHPs/jc3Hhu39jPILh3kj1tWP8Q+W1TYOTX97xoEmZ1O8RSWD3vSAmD+aj6WW5/atH0zlgftGmQhHt9QJJkCzDopLAMAMDfBRC0CJw0OceHYFD4b5zOZLBdJIcKZRA5wYDKSrJOcOwDA3Gy/bOpAZmrbMHUsJIz0d/HnzplPrvYwkQw4P3c8A15mFJjPnxuWyDfUDKktwzrJuQMAMKBcPsjhKBxMoTLyrh5x8y1Z0z5+KrmwfCOEyv5btytoWegh3tia/ne9NYPcRkWxh6rsXNhpwd+rR7lqgJmTc2ed5NwBABiQHBBM6yS6G/O2cTPkOHdc2b6y/2TWu1P/Bc28c7L/feaAx3EGQQb599x29ZDcruTfK7eTWYGzP+v3fM/3nD9/fupYGMzv/d7v/d//+3+njmLu5NxZJzl3AACAxWmmaOsnPicbFFLVyZsxDljeZNj0cRxbp4R+bt568o6Lw+6HQlRjD8Gs3HLLLXLua3Lp0qVnP/vZU0cxd3LurJOcOwAAwOI0J3fvmZnttHpyPvg6dJq3vuL9wCTOXkI/8zM/c/ny5aljYTBvf/vbf+qnfmrqKOZORpJ1knMHAACgh0KieZIcdDzoWXmWfuvuM+5hSPQDK2CeO+sk5w4AwLJ0uilifZ/JKau5WzU2n83Vo1B2mUkUaqRsUq/tXD2W3O06g7ueNmuOJ2+Imounx+1Ad42bHwKFeLqK49wFGde+L4ybjLPr8ubQzced7jrL4rzjHe+4ePHi1FEwmA9+8INTh7AAcu6sk5w7QMF73/veX/mVX5k6CmDunnzyyWDJ/JOt84+wYOwyysEtGYMdVXk/SQ7sfe9731/4C3/hkCM+9NBDjz/++CFHzEmWXK9v3Glh/FT5DdKv/5px94mnvvNyVffcuDVx9hu63A+LdnJyctddd/2Tf/JPpg6Egf3JP/knpw5h7uTcWSc5d4CCd7zjHW95y1te8pKXTB0IMGudpmee5Yvj6Y2bG+c2Nps15znGy3P9BF3Fy5MzJQu3H6ycXR50m/tvIc74qU2033Ihde1/16AmX9ZVMmZG8uijj37+858/5Iif/vSnX/GKVxxyxD0FU7aBWTk5OXnPe94zdRQwATl31knOHaDs5S9/+X333Td1FMCs3XXXXeUGueR4cop0s0ZBkGcvLE9OtY7LHTSXx3m3QW4JGHSeO0lQiLN1vwXP9u6/VW4v7TatU2+M6iUvecnrXve6Q474Pd/zPS972csOOeKevGIBmCE5d9ZJzh0AYChBPv3sQb+aAMnaBYXlhfx4p9IKyXni/fqJ8+DlmjDl/muqZ+zTfyyZcFdGBkaVewt7rwGslZw76yTnDgAwlEIR8IMNPWA/g2/FIPPoD9O/fDpMwvsO4NjISLJOcu4AAAc26v0/e9jFUw7srDxLZZ+t5Vx67IROqwyVcE9euwAAwCDMc2ed5NwBAMaWq9mSXB7c57D5ILk87ifZVbB67oaihdoy+wsGDcrTx/Hk9ltuu7r2X5BMryfjKRfkAQCgQM6ddXrBC15w/fr1m266aepAAADWo6b4eE3L+qruyf6TXfUIsubZyvY1W9evk3797xoE5zB6x9OkQA0AQJmcO+t0/vz58+fPTx0FAAAAkzm7XMNZotgYeyZ384nyzbGbFzDF7Z3kAxZKzh0AAGCdxshVyX9xGIMkW+MSVVNFMjeD7JmC4AYShWt34gar3OHAsZFzBwAAAOYuOT960/2GDYUp1buF8T0nCu3jYMr3lmgNMlg399/KcZPbVQipx3ZtokT5UEnzZMwA8yfnDgAAAMxarm5J1ynSufbBvOxdg1zON9dP80bHHTfxafHNGJJx1oyb267c5g++Xbm9t9u0Tr0BLIWcOwAAADALzbxwMzMb1ELJzcvuOkTSIDVt9uw5l2cv14Tpesvo5JLe/ceSCXdlZIBjIOcOAAAAzEJlEfAgDd1viCXKzfefYf/y6cAxOzd1AAAAAAAlo97ws364PcM4K89S2bi1nEuPYDqtMlTCPXntAsC6mecOAAAAzF2ytkxcCyVO9TZvE5prX6hdk7xxaK594Z6rgwiC2SXlc+O2xtlcN6jhU9N/QTK9noynsPMBFkrOnRW6evXqI488cvny5VtvvXXqWAAAuEEz+RU/VZ7OWZmIGaqfUeUi6bd/YH0KhWXKLQdfnnuqfmHlsz2GqCmwU99Jv/53DSoL/nTabz73gIVSW4YVunr16kMPPfTII49MHQgAwKoMUhOgR+Ks/NR4/YxqqKxfkuoNAAATMs+dFbp06dKznvWsS5cuTR0IAMBqBRUGcv/d1GWKc/UKutZn6NFP1xn0zf/u6iE0J3jmqhjvk+5Pxt8cuvnU2KUtAJLG+LTxCQYslJw7K3TlypUrV65MHQUAwJrFZQSSSef4v7neNlFGO5e8PkA/SfF2bVL1jne7osd+yEluV3B/xd2DeGgAAA5Jzh0AAChppnqbs6dzefb4FoX7G6rPwu0Wu67bWvJ4jP2QjGrsIQAA6ETOHQAAKGlOEq8sFBPPB1+HTvPWV7wfAAAocA9VAACgp6C8SWyoRPN4/ZzFP3YMEybc5foBAA7MPHcAAGBIzZoqcc3xs+XJ234Gywv95AzVT2v/mxtrrLfW2NlnP+SWN4cOwgiG7rGlAAD0JucOAABUSWZvWxfmHrd2Urnunv10qude2XOuvHunOPsN3doVABzG1atXv+/7vm/qKBjeN3/zN//9v//3p45i7uTcAQAAAGYnuORlBQbfotydM4IhcnfPzt0Zu/flUDRdv379rW9967/8l/9y6kAY0q//+q+/613vknNvJecOAAAAzIuk5+bGOlHrMOoWNV8z8esnfjnF+XovucGdnJx8//d//9RRMKRbbrnlzW9+89RRLICcOyt07dq1k5OTc+fOrezXCQAAuR94EiWwesENEgpTlXeTqeN7LTSf2kRTm4N+4vbxU8HC1sgL/23tZ5O6qUNNPJWzy3vEWbN/gr9XMqSune8adC1BVikZM0A9OXdW6MEHH3zyySef//znX7lyZepYAAAYkgwIHKdckj05Vbl51+Ig/x7f0Di+AXLzv7kbL3eaIh0kcJMnA2r62UQJ6OYNlvefst0jzpr9E58rDbrt2nmr5CruLA0ckpw7KxSfhAcAAGD+gnz62YN+tz5O3s24sKRwCJkcsdMhZy5/PWCtla7x51r2iLP1PEF5yT6dx5IJdzVkjlnyJV2uRLQm6966OZNzZ4VOT083m825c+emDgQAAIAOpsqC5W7FWTBIeD3GHTWenAHjHLVz6UUKcq8NrxnGICnJCpnnDgAAsGKjHu6N1HlrpZSu49a3Pxu3svHgcXZaZaiEe/KCCYCDMc+dFTLPHQAAYE2C8iO5mifNCVi5WuSbRhI22U9cDr7cPniq93bFteab0cZDN9sPFU/XOCv3T5AKD9bt2nlBMr3e6cXDJHJ/5cLy8p8vuWLw5mq+j+pX7/2aqemz/j4EyRULH4bxuD2CoRM5d9amcJ8WAACITViLID4MBs7UFGGvaZms6p7sqnWtyngK6setHLpr+8Hj7DpozcbWdL5rEBSd7xRMYbkaNYdUU2Y9mRbPlenPXfGwk8yzt3bV+t8e29j7qcrYcmcUKjeQfZgIzNrIuQMAjOTwv6+GGrHcz4SHl/XH6mNHAkcimDoNTCtI8gYXQMTLm0sqOxwknn69de2z+VSnPdAv+18Ohj2Z587anBWWObsYbepYAABWLqgG0LyQOXl5cu64rlyCoLJ9OchyP8Ggwea0xt9csRxMbtxC/0PtB2DjnbI6I/1BvU4mZOf3kPttwITk3FmbuIgVAABjKCSjd9V4c+2b/80tz1363fU66MIl5PFPx21USni3+lDXX+f229j7ARhb7jjUexPooVNqq1DbnUnIubM2bqAKADCsIC989iBIIcUZpWSOqVBWtXdIY8hVBy6M2y+nFlwNMLf9AAfz1/7aX/uH//AfTh3Fvv76X//ryeXf933fd9hAGNef+3N/buoQOAr1Py2cd58hOXfWxgk9AIBhFe7f1burpni+dr9+DmDUcRe0H2Bwb3nLW/7e3/t7z3rWs6YOBFr81//6X//H//gf3/u93zt1IKslfZxjzyyLnDtrI+cOADCJQQ4FC7/ihjrUHOmQtVM992Ct+uUbh9ys1z333HPnnXdOHQW0ePTRRx944IGpo1iPoH5arq5a/XdfvOIg8eyj3GfuqX0iKV+WN/gGkiTnztqoLQMAcBhBLZTWe37GtVOax9XNNsEhd2U/laEm55IH931N1prvMW5NMLvtPcB+AIC5yX1H55Z37bB8ejtZHK/fuPUh7f9Uof/4v8GWjrGBxOTcWRvz3AEARlJZtL1w/JZ7KjjG3meITkOXtyiu6t5j01ob1zzO9e9QmTW5//77/8Af+ANTRwEt3vWud331V3/11FGsTc3Pg/Lywpdm8ku88IWbG7eyWU6/nxD774H63w9+VAxLzp21OfuMMM8dAABgKf7m3/ybjz766KOPPjp1INDihS984Z/5M39m6iiAuZNzZ23OasuY5w4AALAUP/ETPzF1CAA9leunHzIS5kPOnbVRWwZg0T71qU/9iT/xJ6aOAububW9728tf/vKpo5iX3M8/x7oAwKh6/9jwK2XF5NxZJzl3gIXabreXL1/+7d/+7akDgfm6++67r1+/PnUUs+OoFQCAmZBzZ20cbgEs3blz55773OdOHQXM10033TR1CAAAQJb7TLI2assAAAAAAFORc2dtLl68eOutt16+fHnqQAAAAACAo6O2DGtz66233nrrrVNHAQBZJycnx1kJbaQNP9r9SaWzyx8P8yLxagSAnatXr37rt37rq171qqkDYWB/6k/9qalDWAA5dwAAoMrhc8r7j7jdbg9WdbA+VNl5AFbvwoULv/zLv/xLv/RLUwfCkN797ne/733vmzqKBZBzBwAAetqls89S28076zST3bv8cjP93Uw6J5efLYw7KfRTGWoy+OSzvTvfRPuhZrsAYDUuXLhwcnLyl/7SX5o6EIb01FNPfeQjH5k6igWQcwcAGFEurVbOGObyj8GM3VyfzexnOYxC2MHq5f/GnQfRJsdt9tOpk0K3vYOhh+RfcPPlV2A8lTv3Qsotj1/J5X7qQ437z41VqXmyobmwuR+GGgsAgJmTcwcAGEsyzbfpntGuWTGX/Sz3sL/67apcsbWTflsqxbmP5n7OnbqId2/uREu8sEf5l67te/z1h3rBeOEBABwbOXcAgFEESd5gRm3lWoHcU8mxWsMoCOqExP+t6bxHwr21k95bKu+5jwHP2bRe8bCpy6cPmBAPXuEAALCnc1MHAABwLGoyekHm8WD3fjwkyc21GuTlWuhkn/57rHuwN+Aq3+YA0En5B8BMvitzkRQinEnkHJ557gAA8xLU7tj/l/qemcphK1CPeuDhqObAcjcYOMncIzSuIdN8dTXbBC+8yn6STvI3dG32tudru3m9xebGN+9uHv0mekO1Bg8Ale67776bbrpp6ihuUHNxW7nx7qmZ/MbLRVKIsP5bfkGzUh577LE3vOENU0cxU+9973uvX7++kXMHAJiVMX5tz+fne7JAzYDms6VrVVm0vUd9pKAu0D5D5Fp2fXl0at8aZOWuA4CuTk5O/tbf+luf/OQnpw4kdO5cVXWN3Enowsnp5hnu+v53vTXPxydrJzYb1wxRHjcuoNeMobl8Kefjr1+//rGPfWzqKGbqYx/72LVr1zZy7qzPgw8++Pjjj99xxx233nrr1LEAwA1mMntlwjCCecpjhzGTHc6czWTeHAD0dnJy8qY3vWnqKBIeffTRf/Ev/kVrs+SVnbkkeFfJe8Y0L6oL8u9x+94/JpPbFVzPN/gVpYfxjGc8Y54vuTn4B//gH3zwgx/cyLmzPtvtdikfUgCsW/DTud/P6MpjjHis/cOIf/q3Lum3jZ06GWNLOWZeJABwAM3fbF1nc3eqKVdeN3kJWvzjtrLz3vz8OAZy7qzN8573vNPT0/Pnz08dCAD0KdkcHxh0Sru3djJG4Zp+nTdT5J06mWpLmbn966gCACOZcFZEp3nryXnx0IOcO2tz7ty5ypJhAHAANUWcy9WrC9Woa8petz5VsE/x7q4b3qlm93i1v1kuf2UAWKU48V1fz32fFP+ECXfXa66AnDsAwOINWHoSAAAOZpfabmbS4+sae/++jWvL7G5YGt9AtTBuMs6uy5tDB2G4XnNl5NyBzWte85qPfOQjU0cBq/Kd3/mdP/ADPzB1FByRQqnKgsLkHT/0AQAYXOVllJvu1zVWDpfrOVfevVOc/YZu7YolknMHNu9973v/8l/+y1//9V8/dSCwEv/m3/ybj370o1NHwdHpd/PSMSIBAAA4ZnLuwGaz2fzpP/2nX/rSl04dBazEBz7wgS9+8YtTRwEAAABMwK0mAQCAIZ0VP506ig6mvUnasvYVAACt5NwBAIAqldnhGZYtKkc+YcD7330BAIC5UVsGoKfet00/sGacS4mZY3b2Er169erUgcB8nZ6ezufDfJcLPruRbxDY2bPNhcmb/e6aFdoHz3a6afBZ42ZXyf7jYHZjBc8mx42Dbw0p10kypHL89UMDADA2OXfW5nOf+9zJycntt99+7pzLOGCzcQTO0jz44IOf/exnr1y5MnUgMGsf+MAHXvnKV04dRTYZHTybTF43/3uW4C63DxLuyX5ykucDdk9tosz1Lpgg/9513Jzcfivvn3isoeIBAGBYcu6szcMPP7zZbG677bapAwGgjzvvvPO5z33upz/96akDgfl62cte9k3f9E2HHDHIC589CNK7cbY3uaRQI6Umb54MaQy7YArz0HOrdB0onstfT80ZAIAZknNnVQozrWBPna4BLz/bnDpX7jM5pS43ViHy5iS+4Mr33IXqQQqg39DQw9kr7eLFi1MHAvN1+N85Q9Uoy32p7RPSgY06bo/940sZAGCG5NwB2uVKopev6S78t/Kp4GB7z8rs5Yviy09thku4ALBWnb4gJpzQPdIXWad67sFa9cs3vogBYLH6/Vpo7bNmol7w06L1XjV+b+xJzp1VMc+dMQTfNM3MdeEbqPz9lHsqOVZrGP2UO2ytGAAAucu2dldW7RqcPY7rqMRtyu2T424qvqfi67eaoW4ax8DNADY3fl32GLcmmN1+yC3PxT9UPABwMEeeye1RR66T8kQ994Y5JDl31knOnVHVfAkNde08AMxHTdH2YGHhYC95orfypG+PA8LWUGsi7HFCvbVxzeNc/w6MAVi04Jx37ji6We+0OV0sd5l4cop365dmubxqYZ5B8tR4oWZsMqSu/e8aFH487GP/eX5HTs6dVfFZwKwUvqH37HAoTgawdIVfgb0v26xZseuvT79WobfC8TMAsHTBdV3JZPruv/FFcru88CDzteOLv8vxxPEnA4iPuyu3t9B/q+QqucQ9Y5BzBxjFGCm2+XcII8m9ocoTTvudVapZset7p7697DwEvCMAYAWaP7CT1dKC9oXf5Lm1Cr/h639O5PLs5WOEcv81lwnu038seUyhhsyBybkDdDaT76fBw5jJdkGNwsWVyeWbugnsrV3VjNscqNBJfAntrop0bhOAgtYjcwBgKs1fvDVfzfG87/ohxtAjnqn6d1w/E3LurJByGQwruL6s3xdY5csyHmvYMMpj+WJmQZIlm8qXcHaSe3dUjltun7uEVs1E2If3DgCs0lBlWit/KsQzY/aPp9OP/KES7o73pyXnzqr4BGEkhTuW1KwS/7d+rFwnvV/tzV8Pg3QI4ylfgloWv+k6vch7vyM6vdn7DQEAAOuwu9Bz9yu6Wbr9rM1uwspulZraL8P+2E7G04w5GDQ+lu+xvYX+C5IHI7l4csvZn5w7QJXKEmw1/+26YuVTNavUbEVrPL6GORjzMgAAYE0KR5f1T21Sx9cDHke3Hib3HrTr9rZGHlwp22MnFKbzOwTbx7mpAwDgaYWCFUAn8fyO5uyYHquPveKoXQEAAHAw5rkDzEi/C7sGvL85LEXz2tJNplxSs2Z6155zlZcqxy23z11SWhgXAAAgNtJRg4ORPcm5syrJW9XBsuxZPQZWqbIs0qb6as2asWoqL/Vb3qPiEyxLpzuVje2QwbhADQCAjZw7AMD+3HqII1GZU66/mfABHDKY+re/7DwAq/fUU09tt9t77rln6kAY0qc+9aknnnhi6igWQM4dAGBfcmccraCwUvBeiOeYJ09QBTWdku2DZ/cpxRaMu7kxLx9H1a/zwnbtikp1ih8AluX09HT3L6txenr6nOc8Z+ooFkDOHQAA6KOZZE/euHiXHw8eBA2CGzAk2wcJ92Q/9aE2x40f95CscJjbrj3HAoBFuHTp0snJyb/+1/966kAY0lvf+tY3v/nNU0exAHLurNB8rmUGAFiB5J2BW2+ZkFzS+77fuRsUV5rwdily69Dqp3/6pz/+8Y9PHQXc4AUveMGP/uiPTh0FsFRy7qyKQ5p+vu7rvu7HfuzHpo4CVuV7v/d7pw4BYDDxDPF+4vnp+4e0p92UcxPPYUK/9Eu/9If/8B/+o3/0j04dCHzJJz7xiX/7b/+tnPv+ttvtu971rqmjYEj/83/+z6lDWAY5d2Dz4Q9/+J577vnGb/zGqQOBlfhX/+pfffrTn546CoBD65S27ppw3/NCxh4p9U713Pch3Q+bzeY7v/M7X/WqV00dBXzJO9/5zg9+8INTR7F4586d++Zv/uYf+ZEfmToQBvaSl7xk6hAWQM6dVbnpppv+0B/6Q1NHsUjf+I3f+NKXvnTqKGAl3vnOd37xi1+cOgqA0QX1XuJ7hO4anD0OblW6q3Ve3z457qaYGQ9uZBo3HmSS+67z+Eav8XaV4wGAdbhy5cpv/MZvTB0FTEPOnVU5OTm5fPny1FEAAKxTTdH2YGGh7PvucWX7muWFll1T253ad90PPeIBAGAp5NwBgJU4WCGIrgpTaHvHXLNi16m7ClwwQ8l59CP1DwAAgzg3dQAAAC0qk2KzzRcXAusdc82K483qlabkYLYNo/Y/RucANYLiVOXHMxGENMMIAaZlnjvQgamawEwEZZ2Dt3z8wVIoOb2rqpxsHzzbdcptrl5zoY5z14/TZFc14ya3K+4k3j+7stS5TYBJ5DI+XqLAUuxfTWsq848Q4MDk3IGEXM66PFWz3+yGmhVHnarpByIsTvOdG3+A7J6NHwQNmrdwzLUPEtPJfgriTH1r/J0EXQV1q1vHLbfP7Z9BbjjJItx+++3f9V3fNXUUtb7yK78yufyOO+44cCQwoG/4hm+YOgQAoDM5d6CKqZrA4SWvqm69v2JySSG1XX7vB+sOful0HNv+t23sN+7gQ7ACX/jCF37yJ3/yW77lW6YOBI7UP//n//wZz3jG1FGw2XQ/Gjo7OV24PC532NI8qGkexdSv3vs2GPXRBuFtbjyvP16EAAsi5w5UMVUTOLzkx0IP8fz0/UOCI/EH/+Af/Jqv+Zqpo4Aj9cxnPvPSpUtTR0H2UCX3OLmksGI8Yvk4pTBuj2vyuka73W5bD6PGiBBgWdxDFXjayZcFj2skJ5bW/37aZ6rm2EMAM9cph9414T74xPbW/jt99vYOb8DtGnsXAcCEgqTwbpp2bnlzSWWHg8TTr7dkn/XDHSxCgMUxz51VuXbt2iOPPHL+/HnXYPYz1JRSgFHlDt6ax8DNx832zQtf6tsnx91UHDfu2jcvysnF02knNK83j4OpHLfcPrd/CuOyPj/yIz9y2223TR0FHKlPfOIT3//93z91FITW98XX6XLA9W0+wBjk3FmVp5566nOf+9zFixfl3A8vOVVzU/2brHeWf9ipmn5Bwjwlr6QpNwsaJJ+qbF+zPKemn8qhcz207orey8uz8HxgHoM3vOENDz/88NRRwFF74QtfOHUIHIVkxXYAepNzZ1XOZrifP39+6kBWyFRN4Kis9SLotW4XI7nrrrumDgGA0Zl7BDA4OXdW5eLFi3fcccfUUaxB/XxGUzWBVVrrJ8NatwsADubIM9RHvvkAleTcgUUyVROYidzF1z6aAGAFzq6LjW98lVveo8NB4hlQcKjVdbgDRAgwf3LuwCL53QbMhI8jAFi3XDnK3mUqy3do38ndH2vw8pjx3elz/42rgOauM1bAEzhycu4AAAAAWftXvNzn7u49biZfDq913daqoV0b7B8hwLKcmzoAAAAAAABYCfPcAQAAAFarUDXeTHOAMci5AwCUapJO0s/g5hCYu6gBwCR8/wIcmNoyAMDcFSZnDWWoY9HZHtPOIbDKGA7w5wYAABiPee4AwMLscrLb7bb5eHNjunaX4d1N8Q4aB10lhzhwP4Xt3bWP+0m22U0qD2aXJwftEWenifPlHuINqdwzAAAAMyTnzqo8+eSTn/rUpy5cuPA1X/M1U8dyFOZQqWBwq9yoM4NvWrJMRLwwmcsrL1/l/mdAzYRyObncbJN8ccZJ8wn7KW9vvJlBNryZwj5rU86/995vPcRnRHLb1YwWAABgieTcWSEH6vurzHc00z2rscqNOjP2piU7z+XycsuhKchfnz3o/copt6x/g3TqZ8BblnVqv2scZVNCVAAAIABJREFUrJXrpEecq6/GA8DBfNu3fdtb3vKWt7zlLVMHAk979atfPXUIwILJuQNVgqmUyYnMXcsU5GodxEUGgn7KQS60/EKuPsb+5TJa/179al/E3SbnsfZglis78YzsxVlK2EuJE4BV+s//+T+/6EUv+vqv//qpA4Ev+ehHP/qf/tN/+sf/+B9PHQiwVHLurMpapydPLlc2IXi2a5mCXK2DTSN722lC66LLLwSJ5vLJgH5lLpKbc4CaErAIQ32DTPVNVDnugG/qyhOK+4/iUwjgGNx9992vetWrpo4CvuSd73znu9/97qmjABZMzp0VcnDeW2sZh/i/uSW9yynUl2Xo13+u8RzKL+Ty7Hvuz/KSfTqHCe3eL4U3S3DyKf5Yi0/InTRKig/ez26VXD85u/a7DuNzirtxd6vEZzfjUJP7rXecrZuwuTFTn9uuwhU2AAAA8yfnDjxtqDIO8dTp/UOaiUniGXB/HrhzGEryrbdLOle2bO059/iQ/XTqPFhS+VR9SF1P6XVtXIhqbh/+AAAA9c5NHQAMSbrwMDrt565/lLH/iPXlFwYcsb631oouPQKrX8U7CAAAAGBP5rmzQibHDa61zEK5LEBQNr2mfXLcTdsfdwXlF5Ja92c5zta/V6fOC5K1I3LB5JYDAEBO69yUHr8qa1bseh3wntcNA7B0cu5AQqFAQW5hoSxATXGD3E/S3rULFlp+oWaIwob06KRH57sGwbFE1z9i4XjJIQpHKHehibcDAEco94Ow/AO431WbNSsO8pM+yU9fgFWSc2dVVMZYLlOegSPnow8ACnLXXxauy+w68z3ZVc248R3Ck50ELTfjXy8LwFTk3Fkhv1SWyF9tiUb6q3kxAAAQCDLaZ5qTxPecgBV0FVz92TpuuX1w06agAKZfvwDrI+cOLIzyCwAAsErNn/pdZ393vRdUvHp94/K4gw8BwOLIubMqasscAz9VAQBglZIzzQFgcc5NHQCMwu8zAACA4xFPwDor59J79bFXHLUrAKZlnjsAsDadJsd1vcHafIwRebDrWm8cFzybuyG26YoA7Gn3FdP8+mvWdQlqpnftOeiq67jl9rt7pe4aByXd43EBWDQ5d1bFvACAVYqPn8tH1PFThfb1ZVjnZuzIc3eT241eaJ9cBQAqxd8ghe/xXJv6QvCF9jXjti4vBFkfJwALIufOOi03gQJAq90EsbP/ts7LLrQvD5FsXzm7PBgu999mV4V5dsFkutaQuva/a1BOCvSWDBsAlqvwUwEA5NyBASjjsE+fyjhAV4UEbpzRLrdPGmS+djBo87+5/nMXxQfzzXPR9u6/VXIVF8IDcMx8/QFQIOcOJCjjkKSMAxxYsjrqYV7nhTd7fQC5PHv5w6Tcf80F6fv0H0t+tvjwAQAAyJFzZ1XMuRuJMg7KOMAkCmehDjb0GHIXuMywf58kAAAAXcm5szaXLl06u3B+6kBWRRmH5LPKOMBMdH2X7ZlH7lRmanfWLde+xxdWj3Je/eQuvpGIBwAAKJBzZ22+6qu+auoQFkwZh5pnlXGAOchdQbJbGGS6O7WP39TDvumCYHYn53IXCQXxBCcFg3W3223X/guSH265eHLLAQAAjoqcO/A0ZRwm718+HZIK19nULOzRvms/Ba3jNnPW+3fSr/9dg+CEZad4Cst9uAEAAMfj3NQBAMvTNae8Z467U7Gg1nIu/co4jNQ4XjdZ00atJAAAAIClMM8dqKKMw0YZB+AIjPRJ4gMKgLlJ3nDlwDeJ2af/TjeY6bri3PYDwOLIuQMJyjgo4wAAAFM5wK/Z5D2Z4kHLkRwgyMJT/S6HrVlxkEOwJMcpwJGQcwcAAABmLbiuNFmSMVi4Sy4nr7uNZ7jHywvXrbb2UxlPzfbWLN90n/neb7uCrSh0Em9vj+uAARZKzh1gSso4AABAWeG+R0Gqt1m7cvff+EHQzybKIO8W5uZlJ9t3jaegtf/9b5rV7Cq49LZ13HL73PYW9ifAysi5AwAAANML8ulnDwpFHcvKLXvXZultvHtW9ei/dzD1+01uHThmcu4AAADA9JIzrwFgcc5NHQAM7Pd///c/+clPPvbYY1MHAgAAwPAGmZ/eo5MDz4svi4M5K+fSe/WxVxy1K4C5Mc+dtbl+/fpTTz11/fr1qQMBYHRLnwS39PgDXW/dVtNh77vV9Vu+pj8HwJoE9UyaxcQL9yw9+2BvPm62j2uON9dNDpH8Nmm27xpPYZNb+w/irxfc4LTrdgXbmGxf2N7cuAArI+fO2jznOc85PT29ePHi1IEAMJjy7cvG6Hko5f5Xdqg5amHc3K3ecner67qc2Gc+85lHH3106ijgBhcuXPiqr/qqqaPgEOIP59zHdesvhEI5+EKzTkPsE0+nQctdde15/+2q6aT+TwmwJnLurI1s+9gGn8ZYOeggI64st2JKKcesMDNrl/nNvQ53T+0mXgVd5eZ/xRO4glV2a5X7zy3cZN4vhe2KI8lJbkv835r9kNveQkhd+99EHxEH+LhIbssxe81rXvNf/st/uXLlytSBwJdcu3bt1ltvfeCBB6YOBI5R7ic9AEly7kBCIekw6jTGnPpfdaaUDsWUUmYuzhRvUheJ516HzfbJ6VfJi7VzF1YH75GgfWH+VxB/7v2S265OgmCCcwM14ybjjD+FavZ/uf+COJu/zVzFzyB++qd/+p577pk6CviSD3/4w3fffffUUcCR8g0L0ImcO1BlnynPm7apkZVTKYPO4ymfppR22q54FVNKmZvmKzn3Lo7lcuiFBpX9jLfWPj3Xj5jLs5dP4JX7T+7t5Lj9+k82rjkRCAAzl/ty9EUGsAJy7kC73JTG+qnN5X4KUx07TWU1pdSUUlYml1fdp6tBeluZ3If2UvoHgCXyawRgxeTcgafVTCkNUq7J1ElNWrZmamTZ2D9STSndNM5VmFLKolW+UHuckerUz0jvl8qLb87kruAJeusawCD7bcBRAAAAJiTnDjytx5TSmsS0REnAlFLYX/MCms2N17KcvQWajzc3vhFyl24EF5QkTz02c9a7C0cKJxoL1Zzi+HP9FLZrEEGQu+3K7YeucXbtvybI5PKaIF2sczyW8vOjEGfNJixlMwEAjsqFy5cvTx0Dx+vv/J2/85M/+ZNTR0E3NQncMaaU9mBKab/+e4wCY6u8MiZIxZYbd+08frZyiMprfSobj3SRUHKIfTYqvkaqU/+bVLmwrpcfdV3uc4+58YIEAFioC0888cSDDz545cqVqSPh6LzxjW98+OGHp46CKrkpinENk2C2Y7CwdWpksHyTmQoaPGVKqSmlAAAAADNxYbPZPOtZz7r55punjoSjc+XKlTFy7levXr169erFixe9qvdRnkfZOutwqPme/Z4ypbRH/xtTSoH5OfBHhE+kRcudUS6f982d0i6fMA5ObLdOCOgUfxxJoU3zbHprGDXb5V3A8ZjzC77TZbXjxTDb/QOwCOemDgAG9thjj33uc5975JFHpg6EEQXztQGAY7a7zCvIKTeXxxfnFZ6tfKrQYadfKeU4C222X75uL86tt0ZYHx5MYv+f+uUe5vwumENs9TE4KANIcg9V1mYOkwIYm7/vSEwpBWBx4ou0dksKXzTlKZyVV2g1k9qFMFr1+ELsFOFuiW9eFi13lUby0pOa2pXxpR5x/7ujy8rDzFz75n/jNs2wW0OtiTO5SuUnQLmH5Hb1vsQHYMWWlHNf1sVNw2Z+l7Xt05JzBwA4ZjW/A3MJrOMRpOMdbjBzcTI6TlIHyejcq7qZ+G7tf9u4N1LcLNl5sn2QDW+msJt1n3L590JSPhnnPpL7p7xdPj0AYkvKuS+Ib50JybkDANAqmJg5diGLPQWFYvzWZa2CUk5nDwpll5rGe1907blT+9yVKIXLWbqOO9Se8ckDUE/OnbWRcwcAoGyMKTJj//5MTm4dxHHO9Geectde5IquHCGHugCLMN+ce6cia+Vnm9dqlfuML4zqUZgsrmgWd1LotnLEykJv8Zau/htazh3geCz9e22S+Ht8US5xP4/xe6DyV2JrxeH65Yvb7TMxk103kzAKtnW172FuCgn33PtuVu/HyhMGA8Z8sGPkWe1ngGnNNOeeqy3Yeq4799/Kpwo13eq/PIISbOXEd33MuR56x7lWcu4A61MuyTpGz0Mp9z/Jt1XN5fnxKiMFM54em9lJ1x+rXZdTbztEXfLKV0s81rBhlCOs6XDsMGAq26ge+tnLuzC7Ljn7bdN45zaPHHP97GbU7RqU31aF9tuojPtuleAbodksiCf+dmuu0mPKYG4TNjfun5rt2nNcgJWZY849+A6rnH/R75g2OVZrGJ2UZ5oHCfqaEcvHZr3jXA05d4BjUDiKbh7Txu2ba+UOUHPHuvHBZ5x6C77Zy6FuUr8TgiDL21XYOfXtc+OWg8/13ynIzY37c3Pjbt9U/FHidVvj6dr/rkHwi6u8gfvzo65ej4xP/ErrlHZv7WTwP1whsRi8yDuF4WXGbMUvy9yHcNc8QK59a+PK816F9s33ac1T9fGXY+v0Hu+xH3yGAMTmmHOPdf1uG3Va07Q6/SYOfkMfye9pOfexTbKHh3r1TvIu6LHHlvhuHeOFEZ9iPHtQk6Pst3xxu/2YBYna3cLdxLdNcSpxs33y0LHZT7A8fhx82wbtC8euQfy50+q57SrsnE7tC6fzO+3nToKds/tv5U5IRhv/Aqx5MZT7L4s/+gqJUUZVkwOK39HJ/3ZdsfKp+lVykeyZffNqBAA4mGXk3CvlJkzt3+GwCt2WR8w9u+JzDD2cO3dus9mcnp5OHciyFZIO9RPBBlR/lFhOl0xytNljjy3xqHjsF0buDGIufdZ1OfPUfFF1mrYZL+mRBu332hjvFdW1564n6YeKp9/kgCD33XXQ3LOtL4ZO/efa13wosQ7r+/uuYBMAAGZoPTn3MX4vjvQDtF9CsDCbrCbO48nLm+c+kn2mGDefSk4v3f3V4lGS4wbtg8aFVSrjz/Wf07V9btxy8Ln+OwW5aWSIdv+t2QnxU5sb/4iFeLr2v2sQTB0tb+D+kpvDtHJ5zH26GqS3lYnTiCsOZlYby+L0O4E34GmeAfnNDL3l3tTeUADsLCPnPpNj45HCKHQbX9y9qcgKJa/U3hzNLwDz3MeQu3K/fipxuZ9t/or+5GUr20xZg8K7I9lPZYWB1vd+1/aFWXKdtreTYOfs/lu5E5LRxscbcZBd+y+LEwT90h8cm8pXWqcXZCGJlutnJr9nyvbPQXdK5JXPVvYIZqg/4rADsSb9voLHiGRP84wKFsHbB4BWc8y5Bzmgfoc0lQdR8VjDhlEzYi6ZXjniSHEulzk7+wjy6WcPgp0ZpDiT77WaNGguvV5v7L/yePEE+2fP/ruOmzxR0XXQ3LPJJQPO74vz+IUTGKxb82Te5sbzVbvzSZvGSyL3obRNXWyxW7fQvnneqPChl+w/F3+un8J21eyiTuPGJ/ni9v3iqZQLJvdH6brTuvZfGWdyeU2cThwCAMD6zDHnvilWG6hZJf5v/Vi5TgY8BCp0WzlikGcvrxU0Xj059330OHlTkwg+qldgjThNvOJgZrWxLFflWbog9Vlu3LXz+NnKISrPO1Y27nSard+4rcOVG+x/wjLZ/z57OP651an/XYPgA63rqdCuy317AgDAQs00576pnj5Z89+uK1Y+VdB6/Lb/kXn9Jhybs9oym83m9PR095gB1eRMxyjj0MMishXKOIwxEBy5weeeAwAAUG++OffDOIaiBKvcqIIxLk0gdyV+fEFJcFF/sLC1AkCwvLkwzhS3XtTf2k9rPNsuZROUcUgG2bX/yjiTy2vizC2HNfHCHsmBd+zkf8dHH330Pe95jxkMzMeDDz741FNPTR0FM1Iz9WSqw+HCuPO5MjsXSXmOzhwiB5i/Y8+590u+FKZqzurrZz7f5Qd27ty509PT09PT8+fPTx3LUlVe6Z9smVs4YPvyU73LKSQX1r+Deo/baX/WXAPUNc6uZRa6Btm1/10DZRygIPdrxMuYodxyyy1ve9vbfuVXfmXqQOBLnnjiiZtuumnqKI7Cf/yP//Ezn/nMIUd84okngiU1P8ziCUDJNntF1vcnYvm39EzKLeYiKUTY6QrXpf8mefjhh1/4whdOHQWwMP/n//yfswfHnnPf9PoOXso3x1LiHNzRnmw4HnMrmzC3eIBj4AOHA/iJn/iJe+65Z+oo4Es+/OEP33333VNHsX7f/u3f/r73ve+hhx465KA1X2qF2XLl6027Lm/O/Oh6aWahcaGTTgew8XXGu9WbYQdXo9bH3zpuvNO2UfnKHvtthk5PTx955JGpowAW5tKlS1/7tV+7kXNnlc6+2k9PT6cOhLHM7Ufb3OJZjWMr4wAAMLnv/u7v/u7v/u4DD/qyl72s3KBQFTb3OJl0zvVTSFJ3nVjTTNbnAq7vLRDHvwuyWb9xF3Zhv3WV3K5tVCdz26ilufRf17fffvvHPvaxqaMAlkrOnRU6Kzy69C945kYZBwAAGFWQHz97UP693fXX+AHK0bT2H2eu+63bWsLxMHVsHBABxOTcWaFnP/vZ2+324sWLUwfCqvgpCQAAo0rOWB9piIXqNG89OS8egAO4sNlsHnrooatXr04dCUfnscceG6n8yy233DJGtwAAAMzKGNn5XJ+DjBUnvuvrue8TwIQJ9xXUmQHo6sJms3n+858/dRgcqR/6oR+aOgQAWJsx7iWemyiXu0HcJpqIV7/ckfniFP5kvV+NNSt2fal4acFyJWuqBDfw3FR82uTqupRrtvS7h2rzcyzopFkDvavcfkjWpi+Mm4yz6/Lm0EEYXfcbwMpc2Gw2jzzyyM033zx1JBydf/bP/tnv/d7vTR0FAAswn0zZfCIpGLt4a82d6zaZg/+a5cxW7m9U+MP1fjXWrNj1BVPf3qsRJhe/BwtLetzjtH75GP0HbTrVc6/sOVfevVOc/YZu7QrgGFzYbDZnpzqnjgRYgLEPQQtXcZ49iCdUThLPQg0+9fWQ817j4ThmhXltuXnTzfY186yT/e8mcAXtg7Vqgg/6jP9bE0+wevwe2XN7m2vVHKUPJbktzFPrJ3/8d+z6ZZTsqmbceCZmspP4k6H8TgcWIfd7EgAOwz1UgYQeE9n27LnQf2GVSeJZrlGnvpr3yiHlLsrOvX7ii6nLr7dc/4PkgoNOmv/tGk/wXgsG2n97y+LM6TZ/YT5rFZ8r2rS9MjvJfaFUjltun/tkcNYHVsBbGIBpybkDVcpTIzfRwW18WLtbWD9hbbewPLUzGWdwwFyIv98EuuR+SM7dm//U10XMe91Ighyl5oszfinmztLleuv64hmvfS7PXj4xVu4/fja5ZPD9U3OOjaUrvxPL4lddp1dF75dQ/Wlmr1Kgq9zHi88TAHbk3IEqufxsfBH3plhypDyDPpepz+WSKifWlad21sfTdQptJ1NNfTXvlTnLJXNrVlmi3IfnUvpnrXq8EwFWzCchAK065NwLP7IrZ3H2W7FHxsdXIPSzz0S2pjmkWQtp3wOMWLM82fLwU1/Ne4XekinsrpN/yz+u9omntXHX/vsNxJFLnvrdVL9Ter/YBvze94IHAKCrRM69POszqXc+q2bF8a7s9gN6rZ566qknnnji/PnzV65cmTqWhRlwItus0qxLn9o5avxL3zkcp1xhqHIVi9b2wQUiyVOP23zBpf3FFw/trkfpF39z3e1227X/yjiTy2vinMMJWvbUvMRt8+U/Yu6V1qPn3Iutctxy+9w7pTAuAADUqJrnnvvFWfgl2nXme/nHdGHc+HdzspN4NlnXw0sW5LHHHvvsZz976623yrkfUnBkW/OeGjsXn+y/kFMeKZ4FTX0175XZiq/PqGzZ+lTXeQaFZweZJRCksFt7ru+kX/+7BsF7vOtO6LTc58lstV47lVxe//5NNuv0Ju20vPyS9iIEAKC3qpx7kNE+E5QO2CeIXBWCynHL7YPJNcHsFT+mV+nChQtXrly5dOnS1IEchWaOOHivNdvE7YPlhQlom9TpsdYJbpsbPxxyE+56T6CLg0lOlBvE2FNfzXtl9cZ4YwIz5BsEAIA5eDrnnrz6suvEzOaS+iB6/yCOxx18CJbolltuueWWW6aOYtn6vYUrp0wOMtV0nwluNRPuJpwod/ipr4uY97qRMGUPXjn7O+Q+9PeiNy8eYE+FSX6TxxM/tZk6vHIkhQj9sAdW79zu0fbLgscAJw0+GQAAgFHVX0yfa9nvcvyaCSX94umnxySkw+s6k6b8VNOwOxPgkKpqy7SKPwc7nXHtncUb8PNXJhEKvDtIOvALw+sQAOBolWsndlqeLIpYuNy/0E/ycbl2ZXKIwvYGjVvj7JfO3t5YMnS3OfH+qR+iPG7uj9L6RwRYhG73UM3VNd7eWB+5XuELr37ccvtCneXcuAAAAMBMBNmGk7b7tJWX557aZCYUNrPA5bxEbtxc/AXJeHJJ8K7ieDY37pwg/94j/px4u4I/SusfF2AREjn3+mLEhauuKj8Wy4WDBykBXL40zMc3AAAAzEHuPnPb6nu51eiUBxgqaTB4mZR4n9SHGqybTJsEC8cu8yI5A6zMMLVlDmyoa5oAAACAmYhnlOf+e+jI9ja33EWneesr2P8AB7bInPvcvqsAALrqVHR1t8oSfwX12NLWDpNH/rmKt5sos9B1+RJ3O8BaFRK+uU/sfT7Ja/LRvdfdxz731dtzh/RbcU++joFlWWTOHQA4KvM5yhowkh6Xac9kJ3Q16gXpyTK7m/wEya7L6WHwsyxDKfxZe8dcs2LXl5OXH8QK95PL3actubxwW874/nDl+88FDcrx9KgDM9599YL+d50HN8Br9lwYNxlnp+XNcYMYcjsfYP7k3AGAhSkcAyenKscHz0FX5fab6Fg0aF8ZZ+W8szie3KDl/isHTW5j/N9Nxf4JVo+zADX7v5zg2ETpyAMcgSe35ThV7ocDlP3tpxB875hrVuz64qlv75XJisWv7cKHf+6NUO6kvnFr/zXxDPVR0GM/VHae7Dm5jTVfxP3+KJ3+ZABzJufOOj344INXr1593vOed+XKlaljWZWxD+0KV4OePShnXg4Wz6iOpNzEGLMglZs4HrmJXbmpyvGErHgCV6F9MG6nA9rkuDmFqdZxBrxH/4Ugg4ls/fZPc0mchazc/7nOy+KPlCAT6t06kv3PsjSbFdoHz3b947Z+I8SddP2eKpwYK4+b3K6as2tdzwICAHAwcu6s0+mXTR3IUuWSHfsfzpXTKLmEe9fZE6PGM7YeU+2WeJg99izIIPeXfLxpy/0VljOez372sw8//PDZ4+aLJM4rlU/RxYaaX9ZV1xz9UP13HTd+zZfjKfdfM0+t0H+/P1bNm50BDXKWZVN3VixITHf94ybPWpXj7yT32qsct9/Zta5nAQEAOBg5d9bp3Llzm81Gzn1A5Ylpm+igMT5c3C2snwi2Wxg/WzlxLBlPzQSx1v6T+6FyTlzX9rlxy8Hn+q8ZNOg2999NfifET20y2YF+syCT2xVMcS1s4CAkO0by5JNPXrt27exxLn9asOi/SJxJnDCYzfjxzG17ySmf/Ur+N7dkn7M4yTCGEsfW6cOk9ydP/Zm2RX+4AUlDnXgGYIbk3FmJ7Xa73W7P5rZvt9snn3zy8ccf/+IXv3i2cPdU8/ESH4zU+e/+7u/W7OGzB0E+NL44elMs8VGeQZ/L1OeO5CsnrJUn1tXH03WCXk7X9oUJfZ0mxNUL9sw2Mwd2k98JyWgHnAVZKU7oB9kNhzTsY9STLvunFOvP6v1/9u49VperLPz47He/e+9zTnevHCrl2iak6QUwTVOLcrGJ0hIMQUAIRrkk+p+IEERU5A9KEIJCMMYLkPgTo1LlHzShioZIIVyiRGIboBqgFUuKnNbSntP27LNvvz/eMp2zLs88a82aWWtmvp8/TvaZd95nPTPvzLzvPLNmTaW4ChiRT9D6iV5eLn0NIOLql1PCqyx86AAmgEMZAExYfM096ERuSMLJQHTOym6hoZWgAtfewO68884rrrgiSe3YXplra2uLxWL177j+0My2sbGRsN0777yzXmnNFbj6I2JDLaGsKZRZB2gx7fxx+fviBxXg7Dq4nEzrxQbNlOj4vvmNur/vAgZGZM1zk4q9/fiu/znnN64POQ+Dh/6bLeRsfck0f2PYFzKbu6E9f51n/ca0m7QvH+X6t9enkaczvrF+WhfH94n4kgmdDr1er7L0/T3uvCpchezmcdtMwuXiGw0AAKAcjpq78ufaMDWsCELy0Tlr3thfuW3CP6Cf8YxnvO997+ujeP3AAw888MADF1544fHjx3Mv5Qh88IMfXP2RqiNbZZWW8m7DCTvWZVFU/n0nU9TCohzGMUT+rg96ST9R+WrHJoyqsT6I5ppWxzyb5enuQVpfEpowDhShlxhDp2f/FitWkqssxjzy/M52K8XGE3qVS68O2OXqmjy/cHUt4iogAAAABqDq5278KDR+z9l9QIQf3/XvQl+/M/v3pRFHmadmujP5iCY07TqXyw5irx9fV7JpOHr06DXXXNNH5AXjuQ/OOGNU7rO9btLO+EINdxRVle41aP1xz3nE7phMr70goxvC5BlVqsm3C/REeWkn9CqLcn7NdJ/Qq1z6JuRrUUku/KS9ugYAAIABtNfcmyeKzpsu6zqy8Ycxg9F5xDm/UZh2xhHYlfrW/IMYoYxf2K3tyvP71o/zOgdaUXMfTLMsa2zDzXns+Y3pQseu5h/27uzrOFadvdP5OrJFd0yzk3F2QBN06RBnr2dlh7jufMn4LhCGrrTQ+Mo8ndM1efqmY1xyfXBsMD0ZeMXyOWY01SPwVJcLAAAAK4/X3I0+qqs/Wrt7OKcIpW35N6Xx3u7dOeX4rfnYb0/VbvImYFhfX6+qan9/P3ciYxW3a8hdveTgQb3DhJdSdWRL2AHNJ7rd1uYSdoiEOkVCAAAgAElEQVTTxw/9sJSfiHKjqlxXKLtsJJrpXBDFiu8rns0D6G6q+9FUlwtANOGHpf4u1b75MhEy5AczgNl6vObu7MEdwe6fHh2KQzOi0c89LXpjpcVwE8CUsCMDJeDqFzAx5fxUHiYTuf9K8v6IcXyZCBkqV105HzcApKIaz70p6FAY+sXQ9xeJc2ycqv+vgYTLxVeREjX3tNjq0mJ99oThJgBgtjgmA5MnDFd42BjuMmh++yXnRHlMSGX81uUy5hQihNYxmv9trit7bFvfckUQVprxeYWOIQkAo9Bec/cNZRs9FG/r/M52q5DvKuU4yHryF6eyXXl+YfzloC9srFBzR3Z0uAMAAACSsO+nb54s27Vj5fzK+M6qd1B8QbMg4IzfpQ+fcxwCu1BTL6ZvuSI4l8v5eflWMgCMmqPmbh/pnMe+5kRjBudLyvk10300cZRN+yK0roro6UKS+jxRo+aO7NhtAQAAgCDOzmqtv6udMwilaucZd8Lb09OeCET0R/S9V1OrGWAcG06UAMxB8NgyfUh171Jpprpco7B6hurBwcEwPxoAAAAAAB01O3d3PIkOeruzP/g0BPVbn/B6AICBLXInUFVVddiQO5eUprpco7Dq517R1R0A4Le6u7n8mMUSlrT7epjPasTo9sQ+tnzNG0MjsxMBceR9fMhMfI3qDzUdx6WJfm8XHLsATEMR/dz1GB8ZeovF4uDg4ODgYNXnHQAwXj2N8tnHvVAD318VumbSrkkhVPf1oM+TQWAHw55YB0/eruaNqQbetLEToXzCGCmVaxQa33gs9bPThPmNMccPXc9X8+Xjiy+oZ66HVpfzCWXnWSfZHFTdXi577HU7z9DpzaabfztXMgCM2shq7hx8oVfX3HMnAgBIzDgbrP+uXCeWVeNkz3c65zsd1cfRR9bkIyyynaQzSGghIHRAvNbltYMYp+KhwY2V1qW6gVTmvCf2seULoTTt2lUtZxB2IoyFvSnKl7u6TLRfMmZLEl/Tbpd89MGdke0/5BzipidZKAAYhZHV3AE9HqM6gNDTyNkSuqUkWYd0T8PcrGpGzY5gdket5n9bO4g1g0TEMd7rnB6Uj8GO40xb2a5+foFdD6386yGUM7jd205eKAxgbnti1fOWb4cySmCt7crzsxNhkuqLRmzDAICiUHPHZNWPUc2dyCgpf7Y2u4YVLvSHeNof7nKHmu7rMKj3HCckGBGjarb6I7Q6XEt16Uue09iphR08qEVnL13l/BrJD+Z2DkkOPhzBsmBP1Ou45Ucno9/r2YkwMWzSAIAyUXPHZK36ue/v7+dOZCLkbpX2ebLmJm6h22b9alCZqXJ16aoa/V/sOEKe+vk1+TjXmDNIUNFBSNJez8JyAWXydXdN3kp/lw9TpR1U3/T1i1fGBwzsiQDQhe/gxqEJACYsoOYuVI6CuljaEZSv2jOn6iYTGh+jsFwut7a2VpV3dCTfNG3fpKy8ids5v1FwT1Jm8t00Leepn1/Q903o3Dxepm9961snT57MnQUCJNw7+igaKnPzHbg6ho3j/LKo+q8vcJQbtcL3xLh2U53ghLYbjZ0ISI59CgBmyFFz11SamkLvl5Rv7dT/XmSsBsguvvji3CmMT+vN4/Z/fVOib+LW3wze+t45D7+QMA4i3HPPPdTc+1bX5prfwr6DgO8mD/t62OrV0DjN+ZsXvXw7eMRNJ76Dm9G0nI9mfmVK9fzNeqLQbhBn8Hql1a3IC4VhzHZPTL7l1wGd+SjblednJwIAABhMez934xdb5fp9bPwyC6p5CXFC5xfihHYwseMYv4Nbf/QDY9TcsLtszGtWf/DuKUXM37oUEXmyjwNZOHe9ulSknFOe3iWOECo0Tmtw5asJFy0opdB29cHltcrBeRgz3xOFt3Tf8ptXDuLabZ3OTgQAADCY9pp73S3C98vM7pkSXfNSFuZa2+3YEdUZ3+i0YvQK4UcqZiVomx+yI7kyMedsQru97uN2u0HXCDs2zbELAIDxCu3qBAAAgGE8XnN33o0Y99MtumRm3/iZKk6q36D8lsU8td7cbdyk7LvJWj+/s91KsQ/6Tj6dN0378tTMH5pP8pvQhfjcPA4AwBzwVQ7IBuvLMjp9rBnfPcRGK8JgX/b8dBICMF6P19ybRbSOBzWOicDYKe84Vt5J7bxdWnnnddDxZG7DL/hm5uZxYIx83Q5y7bOl5QMMgy0fKESSYmuSXn2TLPum6u/oY4xDIJ/vhA6WAACj0D62zJBSHfQZqwEYHW6OBjBzpR36SssHGAZbPlAs3/2m0c+TM+Y37kM17h8V5reT8d1aqqxLGO/1/VfZrnO5hJQilquyKiEJRxqgxgJgpNI8Q9U3ZkLo/MoxFhirAZge9h0AAAAATr5xS0K7SPvmN/pl1zP4ar6+OB1rEc5GjWsAQe36lsu3+MmXy7f26kULigYAI+KouetHOQgdCyJijIVUcRirAZiM0m76Li0fAAAAYKSaP62blVmjb5+vX3ZoE05JxrTpGNlXZ5fHhJHja+oYXeLbnAV3hpEBMBNljS0DAK1K+1lWWj4AAADASCkHATfK0HFNjJGvv3+B8amnA5i5Re4EgL4cHh5+5zvfufvuu/mmBwAAAIDx6vWBn/rmOqaxGp5FOXPrcC4RyQS9JVXB3XnvAgBMXqH93BmrAd2tra3t7OxUVXVwcLC+vp47HQBAcfp4xPpgj20fUusJf8flpSsc4rBlArPiHFumy/PkmvMLY9c4n9/mm79+9psdJwnfc+x87bbmaTyvLjS+wFnVceYjrHwAGK9Ca+4cZJHEU57ylMVisVhwPwcAjFtPlS950NJyYla5a3/y0326L69y0SiAZic/nW94hWyZVe71AExS3ufMaV7ST1S+GtGEZoCd0OfVhcavZ1AO+BO03ji6AhivQmvuQBLHjh3LncLETbI755DooAfEMXpg1X9Xnk5w9Q7l659lvys0jj6yJh/n8sqN2n83/5DzaW1aWC47SNDhy7dQdvJ99xxEhFltmRUbJwAAANSouQNwUNZqe+rOOR+FdNCjNN+HkydP/tZv/VbuLLy+/OUvP+c5z8mdRbxmX6rm3/aDv5rzCJu60TkrNI4waGlcPnJ6revBiN+6fuSmjYUSljeC8wqHM3nfSkBGs9oyhfzZOAGg6ueKI4dWAONFzR2AitFPzdmtrLXDmqaDm/GqvuNbM7h9Dt9rPqFdVo34mumVayWHxncuL73z+rOxsZE7Ba8XvOAFz33uc3Nn0c6oX6/+CK3N1XxzBu1crXMaF8yEwl/fu5szfvILpfYFwiTLxbGoKK17YpBRb5kJ4wAAAGDCqLkDaCd3HNN3WNN0cDPKwfriWjO4UX/vO5/QLqvV2fVu5wIO1kGP3nk9Offcc2+++ebcWYxec4/obyu1a3Npg/cUuY7vPNDlygeTFLEnsmUCAABgzgJq7kKvTP2vZLkrWWhHM73+IueSfInsYuLqD18nXONVX2dkannjounI5ryF3J4S3bVT30VUDt5sZZh80m7qdNADhpTw4lN/5ftmE+XsyM4LsVX/h5qiVgJWivpQcm2ZVWHrAQAAAFk4au7On4nCb8eg35Stla+ezlR77cKWRa9LZHS2bS25BnVGRslSdSn1XcLpklIXpeUDoDtnL1rjy9G4MGxfSrTvNVm9GhqnOX/zhhLfxbOIMZ2MJpyrwniLnKey6Xr+Zr3St7ytS6GJX68c42+73YjmkNx8tsyqseeycQIAAEDW3s/d+MVZuc5Uha7Qmh+d+l+oxpy+/+pDNd/Y2mXbnjNhnsappjMf56mLnVJo/MqqSCY8VUjYcxDliLi7JSh4eEY9xs91uY6uo0CTc7OsS13KOeXpXeIIoULjCELflaTpVKtOH19eexyg8upvoyp/y5SDh8YHAADAtLXX3Osyse+Xpd1HLKjLs9GlujUZuzubM8PWdu2OMHH5p8rT1xlHXj922ND4MmXvJEzeYVuXT6PDl6+jmX5+Z7uVuNUZPc7sfbC/fOr3tiZpZFv/0dxP7TxboynjK5c3ojkAuTh/OxnHQ0zShz70obe+9a1Bbzn33HM3Nzf18x8cHAQm9Ti2TAAAAMzZ4zX35i/jjsWX6G6hdj3LN49cU+tIiKNfIXF5tl4n0ExJkn8lXmgRZijK7u7uI488sr6+vr29nTuXkVH23lL2Jmtu/5r5NdOVychNp8on7spc6/QhO+gVvi+P0cmTJz//+c/nzmKUbr/99twpjEmqgxJG5+Uvf/mVV16pn/+hhx7a3d0NauLDH/5wYFKPY8sEULiiTmaHuZ91SMmXyO5cuPrD7rPY/K+z/+K4ahoAxuvxmnvzYNTxoJPlmOU7BEfoNf+EefYafxrfPadPn/7+979/7Ngxau7l8/0MyqW0fDAu29vbDzzwwFve8pbciYzSzs7OchnwjPfJ8H1l930IytUuOnrGM57x4z/+47028bGPfazX+DK2TGDmup+QyhGKOpgk7EFYiF6XyBgMoLUvUZLBDAAgVFnntMqDcn349h0oQw/u+vmDrtYmz7PqeRxtZyvy91nhFotF1e3OaAymtE2rtHwwLtdee+3ll1/+e7/3e7kTGaW77777+uuvz51FBrkOOxzuUCa2TAAGoatyPbF5r7nxknP+1vj1Gb2mFGBE9v23NU51duXBaFqIo6xXRORprAdnPs31L6RkxxeC128RbtjtwpkzACSR5hmqvvGIQ+c/7DB+sRDH2W519hdnPb+QfxK+PH2/CYx8jJXZOi5za3wfZ73el4xvenbr6+tVVe3v7+dOBCmNpePbWPIEAAAACufrqmx0EatnEGqpdmVZiG/XFuS+880ZjGsAQV2t7fN6Oc8gEXn6ajW+9W+8KsePLgQ536IvegBArxw199Ybc1pf6jJd34VcH0ezCKHzK+nzDG1USDg0fuX60g1KRpie96Ix/dwnaSw/nsaSJwAAAFCIZt22WTy1+8bZ+vv5rY/sq19r8lcS4vSdZ2tVQTMlVc8kZ6mh+wUJAEilrLFlgLTo5w4AAAAAY9HsNC3UT1PVrweTMP9e68h9r+dU8amnAyjfIncCKEVP31h5vwhXNfeKsjsAwGV1I3P5MYslLGn39TCf1QiklfwoZA/B4WxiraHj9ITJY5Lkb5/QtyTXOlJKaDL6+YN2/+R5hr4lScHdeWMEAJSg0H7uqe42AtbX1/f39/f39+v6OwBgdHrqzZTwRu9eYw4gbg23jmnbJSV9PnR2G0x/qzpVZDaGquejkFHqau2SHDod8LHHN19zPY/NGGe1+ZZ6ej1xzf9cOqOku2Y9Ry1V/r58mm8RlrdKXSTx5Vkvu9Fo6Hpzxm++RblEzqOcLxlhIwGA/iyrqnrFK15RWjnyJS95iXP6z/zMzwycCfrzrW9966qrruq7lbrm3ndDAIDBGGdr9d/V2edgxomf79zb+a7QOPrImnyERTZmtleFPn/7xFiZjDCzEMRoNDR4wuSRkLEFOjsedtkCe92SfXHkdivxIKDfl41dtfuRx64DBi2XUJ00ipjyAnbnXBbMkL0N+DZF+QKwcqJmZv1mGRRKk3+X5U2SZ5eVbMwQsUqNw0LEGvBN52gDoD/Lqqouu+yy5bLQDu+YsAceeOBpT3ta362srift7e313dA86QsoA+iSjPPHlhyw12UXfvwlaZcflxi75qlX829fx8nDszuUyQEj4vhKjdH5GHxx7HaD1oNzHSrZ9UFhPYRyBk+YPFLpuOW3foh9b8m+OHK7HTc8u3IUfQST97jQ5QpaHPvXSLNkXxXz4xAAACCXZVVVH/jAB44dO5Y7E8zO+973vnvvvbfvVlbXk+jnHkp53mWcX+XVJRlf7wwhYK/LLvfd6N5uXJkPGJ5RxVv94awZaaS6lCXPaeyk8mFE32Lrjt9Hu13YOSdpl4NSFq17ov1fQdCHOMCW7Iwj73HOI0/oHm3XwVt/eMgxNVNSrU/nZb/ogzMAtOrpkMKRCkB/6N6OiVv1c6fm3l3zHNvZ06rqcDO4Hb9qnM7ZcfSp2ukZTftqB/rgxnRnu/pWWuM7uwF2yd/3oawxXAMK4KvmJG8lyyU0PbuYNUy7wMowe6Lc9MCytBuxpxcVH5gP3+7Dly8AoLasqupTn/rU1tZW7kwwO9/4xjcuuOCCvluh5p5ETzcvO+c36uOhfaacXa6MqrddH1eedvrWQ8KbtZ35yOs/iPNKhvNDcV5cAaYq4QbfdxnLFz9hu0lWhfPLouq/HsGBK6OEO1FRcfTNVYFjEwvzR+zREYPDRGAXQ09e9apXffrTn/70pz+dOxGVN7/5zc7pb3nLWwbOBL16zWtekzsFACO2/Omf/umPfOQjudPATF1//fV9N0HNPUjczeNpb17WD48QETyhXMM4MFwDsFJXyYWRGVrv27Cvb61eDY1jX9hbZeXbYUPvI9HEFy4u2u3WM/iuTcr5NJNv1g19ebZG0wRPmDxS8e0prXuQ8kPse0v2xRG+ap1HnlR8e5DmyFMp1nNofE2SzumaJH3TMVuf+MQnLrvssssvvzx3IsBj7rrrrltuuYXrKACiLf/5n/85dw5Aj3iGapDm2VqXkx/j7V16X47lHGwseQIj5dzF6hKbck55epc4QqjQOEnia9rVXEBV5qNsQh+/7+QRTb/mU32IvW4McZur88gT1K4wvzMl5ZFHDhIXv3LdBhT0oUdMpyv9bL3mNa958YtfnDsL4DGf/exnb7/99txZABixRe4EgH7xDNU+BNXQQwvuHYdHaH17quEX+h4+Qt/uqp/a8O0CKMFaA1UqAAAAACgBz1DFxDG2TBLJb15und/ZbiV2xaqHIJBveW7mUzVKyc0RDHzTfcvlyzPoZu2IdlujaeIzXAMwauybAPo28HGGw9ps3Xrrrf/93/+dOwvgMf/1X/+VOwUA40bNHRO3qrkfHBzYVVEIIu74Dr15WXkTd8Qd4q2hUt0f3ffwEZp2Q1uRP1mGawAy8n1J5doNS8sHiMOWDIzCTTfddOedd37hC1/InQjwuJe85CW5UwAwYtTcMXGLxWLVaXd/f381zgzKxHO0AMxcaYe+0vIB4rAlA6Pw27/927lTAAAgJcZzx/QxvMwoHDbkzgUAAAAAAACIRLdfTN/6+vre3t7e3t7W1lbuXJDA2G8SH3v+AAAAAAAAEFBzx/QdP368qqojR47kTgRpjL02Pfb8AQAAAAAAIKDmjuk7duxY7hQAAAAAAAAAzAI1dwAAMCmrEZxy3VOSt/WerJ5GnqXdanIrE2Mhb34lb5zJczOOAPUoeUYTzdHznPPrp5e5YgEAAPR4hioAACid70EITnmLNR1bD1rShHHk+XOtUmW7qVYaWvW3qnNt+QJ58yu5KNxrbquC+EpzbTenN18KnQ4AADAN9HMHAAAjU/fi1HfndHao9MUR4rd22IwrE6/etZroDKXJXxNHSEZu19lo3ZzxqrPdiA9L04s2dKUhreaab90S5D0uesvXxGnNP3R+e2blFu7cW+3/Voo9vfKvf19KofErq9f5ALuSc1kAAADGhZo7AEh3MSe5QZtTRyCtVUXGWfN1sgdGWP3XF8c33RfHV2rU59NcLmctT5O/sX70hx1hfmcdsG7UqL/78gziW5nyStCvNCQU92H59rjoLb81jiZ/+7/65Q1iJOm7fFUp9nQ5H/0RzBdfYP86apbsq0FK8wAAACWj5g7AoXttYlzVDSFV4xwyeXzDuNYb0Dejirf6o1mrUsaRd2RfHOf01gOC5qARWpyKy79Xvk8hbZ5Gx9vQo3H3ozdW5D3R+V9B0JZQ2pbfbN3ILe4ql11/F94lx9RMSbU+nZcbucoFAABQo+YOQMXXDVO4Sdl3h7I9vx2/apzO+eIbtRhnkKrtHNI3m/B2u29XaHwjf816A+bJV80J5etX3iWljqJ711Zll5L7O3BFrASOoqmk2hO7ND0Hfe/pIzqSAAAAjB01dwDt+r7T344fdxN0s13lDeZ2ZV9Y3gjO+KluigcQoe8ykya+ck/3HUgjUgrtWdzHgSjogmXzLfrpFb1rs0q18kuL4wvunKJs0b7u3hpfk1Lo4DAR2MUAAAA0qLljFh5++OHd3d1zzz13fX09dy5FC715vI87/fUxhznl63LzeGvkJHGA2ZJvpmnWs+whStYaw5Hr//YdEHzxNclX/uOqc8QJZ/7KOALf/Pb6bK6Q6uwCXJIDpm9hhZXcutKik4HMWMm+lW/fzmVvSEEfYmic0PyrwCOJ3Ipe6J4eup4jjiStSTqna5IUVj4AAMAEUHPHLJw4cWJ3d3dra+vo0aO5cyla82wtog+mplbe9zlV3VWcfljAlDh3Z/3EyqoNCROFv0Pj+7SWtJTxI+J0aVeTidCoPp9UnwvfAsnJ20PrdHk3idvN9Snp81ROVx4cgpoO3dND10/ckcT4TdVlpWmm8xMOAABMADV3zMKxY8cODg4Wi0XuRCYidLiDYW527knHm8c7Ns05J+Bk9GwFAAAAAKAc1NwxCxdffHHuFMZNc19wlzv97Thyu/JN0EGd3Pu+edwZP9VN8cBssXcAwGAGPuRyhAcAABNAzR2AQ9zN413u9I++Ob2jvm8e7/umeADF8t21k2sfLy0fYBhs+QAAABgeNXcARUj1HK3ShqYBMFulVfRKywcYBls+AAAAhkfNHUARUp0Sc2oNAAAAAACAjKi5A5g4bioHAAAAAADAYKi5A5g4ausAAAAAAAAYzCJ3AgAAAAAAAAAATAT93AEAwKSsRpTKdY9L360nib+2tjbV9YMs6mHcjE82aEuTt405bzl9LLvx0Tg/QWN0vvol33PvMx5YAAAASkM/d8zIwcFB7hQAADF8D2Zwylv06bt1ZXx5jWVcRZqmgz5uDMn50awqrSvGS0FbmjzznIu5fS978xO06+zGh9uc2Z4fAAAAK/Rzx1zcfffdu7u7T3/607e2tnLnMmJj6cEk5Dn2LqIAqsaOrN+jnR0zfXGE+EIHT3tiqnxC469mljuuOhtdTWwe4nzLWwUeToV+0EZ8TfL6dtGr+hPxbVeV4hNXNmFvCco9tO8t3MjQ99/Kv6fbLxkJCymFxq9naE5JtTc5cwYAAJgnau6Yi8ViUVXV/v5+7kTGwXfKNPx5VNzJm/CWJH2ygu6U5+QTSG61IzsraE72KAqr//ri+Kb74vhKeKnyCY0vVL6cdcC6UaM66cszlC9/Z3xf8qmSQULCDmhvafacQXuub6Ot2vbQvrdwI46vuF/59/TW5TVejY7fylflr7jKBQAAEGhZVdVf//Vff/KTn8ydCebrL//yLzc3N/tuZX19vaLm3oGvK5bz3DKoA5od34gTdL7X2rHOWcdRBvfF8S1vRP4Amoz67OqPZm1LGUe+2OaL45zeWvJWXtiLyCcofijfWo3OU3iXccDXv7ePBYeGvCdGhwpiby3OQr8vfq9buK/OHnfk8b0atLyt8W12wZ2rXAAAANGWVVXdcccdZ86cefnLX547GczRG97whj//8z+n5l6+oK6RqbqICl019XkK8SM44/uWNyJ/AE3NPbfLrmQffLqn1NFYjgy95hn6uYxlpU1Pqj2xKmyLKjCfXPH5uQIAAJDWY2PLPOc5z3n961+fNxXM0xve8IZhGlrV3Pf29oZpbqQiOrIJHU5DO2RpmutO01EuOnKSOAB61Xdf6QLj91RNC7pJyHhX0HSOrqjCt/zue2LQFu68t69jPkEbf6qCu6+fBAAAAIIwnjvmYrlcVvRzb5OwI5tT3x2+AMyKMNZTdXa9zB7PpHmPjv5v30U7X3xf5r44mnY18e2UhPXTbKg6+0Cd6iKlL3/l9LTJICFjc6pczwL17Ymh82v2XOf8ddj+tnCf1vyNRo18jJWjPzL44gvsn2S+ZHzTAQAA0ETNHXPB2DKlEQruvlpSkisBdrtxXTXjmubUFIjj3Hf0E43pzht0NH+Hxhe0Ji+0q+94q5korxn5yoEmDaEV5d9xLaIPyt1BeKnL9NY9V37JGSHVFu6bvzX/6CBx8esZjGsP+mSE6fzOAQAAqI2s5j6uX3JpC3mpqo0jWoFpUXPvKKhrpPEWZ98oX5fGyjqBjOuopekop198Ob6vA1pE/gA0jB0NAAAAQF4f/ehH3/ve9+bOAtPxT//0T8985jNzZxFvZDX3EaEQUBpq7kHkjpD2FE3XM3mGPrpSatpNEl/Zqw5AKuxWANBFH0dRjswAMHMPPvjg9ddf/zu/8zu5E8EU3HTTTWfOnMmdRSfU3DEX1NyHRBdUAPCNoJXwBrhe4wMAAABBLrrooquvvjp3FpiCjY2N3Cl0VXTN3Tcgg/zcHt+jh+QH/hjjTjRfjRgXwn5ykfBoKWERjJntwWqcc9qLZgx/EbQsk7GquR8cHBwcHCwWi9zpTNwMNzAAMPR9JORICwAAAABlKrfm3qwd+/4O+q/yJaPXmBBB0CzcO0eODk3MvhKgnNN4PtKc+x0vFovFYnFwcLC/v0/NfdTo2gkAAAAAAIBiFVp5NErDyocQygVl30t2W5o0ggi1ciOsvkV5FTGyhxPDy0zDoUfuvAAAAAAAQIy4gttY2B187RlWEjY07VVavkJr7jZNQc0ol7NtwbCque/t7eVOBAAAAAAAAHPk7JubvDchfRPzKndsmThGd/i0F4gSEsLqWxTmnPkwMj7L5bKi5g4A6GbCT0bJ+ONhwmsV5WPLBwAAQFqTqrn38XO5p1/AEWPgBM1ZPzOWX/BN1NwBYKS6f6Ml/E6MHmuuj3xC48QNxDcAzVrlh012w38Ew+wphW/5FRs/AGByfCNIN78W7e8+56t1Bcz3RmMoZmOQDF9bQub65ppTmhfa7edKtq4QzYoyGnI+GNKO1rpEPsYbjd7Pwsc3k181o6m5F/JDs6c0hLD6FgtZRSXb2NioqLkDwCT4fhQ6f1L7fsgaP3ztl+z4XfI02vL95LXbbf5uVpese6kAACAASURBVMYRkpHbdTbqOzdwthvUbzd0JejnxzCEPc7eYivFnmvP3P1DH8uW74vPxg8AmBjju9X5d9B/lS8Zv8yFCPr8NYsjd4q1f0TpIwc1FL2qBd0/lAkrtOZubCVxH4amz4izrbRpaFqs/9a3KMyp3NlmiH7uw0u1Bfa9JctfS1Xn81j2RCAt3w845Re6Md3+O/pHZ2uecj7yr2f7LaFf9ML89q/8ZqNGFbKP9dO68kNXGgYg73H2Z6HZc6sePvRRbPnCcrHxAwCmxPjCan7NCV9k8tecpspciT/4g35XBzUX/e3sixZdIxVyi05S+CliXEtIuGbGotCae+XpGqN/i/1ffVu+IAm3BiGs8JJR+3PO2bodJykgjhQ1d72EV5i6B3HGSXuAlr+8lUeSuPiGOXzxAHpGNWr1x+HhoWbH7LIrJdnx7TitKcntZjk4+H6IJ8/TqG8GvTfJhwWBb09szmN/7s4twflhFfihD7/lV0WuBwAABqD5DrXrWjNkX5kY76qYQ92j3Jp7pfvtLv/cF67YtJ4naF4StF4sCm1ROVGeModtWkDNPZpRBzE6Z/ku/xhTjOld4qyJw0T4QgmLJuTpLPe3hpXjyOuzj+t8wEj5rig7LycnlDC+kHav7fatvwNUxErgaNk3357YJVTTiD70Xtsd0XoAAGB4xply95/KJf/YliVfFamUk0kJiq65D4O7MudjuVwePXp0Y2MjVQfG+Tg8+yZx42Zn517jPPTLN03r49g3cNjTffOE5tlxUxHy961PDkFAEGEn9e1Qzum+OF0OAso9Oiif7s1Fz68PW4WXAp3LG/HhIqMkH8oAH3r5W74wvWLjBwDMUh9ffyP9Pi35l0CxiWVBzT34vu+V0m79htJTn/rU3CkUTb55POKmjSBl7jv2FZppLy8wCvZoDKufnsJ3uu/2l8OzhzSx49gXyVbTlfW1oHx87Qo3wehv65Hnt5erbtS4OlilOzDKy1tZK791pXVJBhF8e5xvi/V9WAN86KPY8tn4AQDzVEgRuZA0BOVnaBASHt2yRKDmXlVRP08nv2VgnppnyyPdyOuu4uNdBAA2530trX+3BjGma2IGHVjkmZ2vOtuKiNOlXU0mEeu5debWD8IXnKP9YOTtRJ4ovzTAh17+li/87YvPxg8AGB3jbD3uzF15S6jdVto0WpvrElMZLXpVJP8VITQxQOsFouYOYPR6PV7bX2BxN4/HNT2H7yEAAADA8Pd///enTp3KnQVQhCuvvPKaa67JnUVKvvvPlG+x/6tvyxck1am3EDOikqC50c1eFb6G+lhefRMDtF4aau4AtOzjozDcgXP4Bfu7IS5OpTiUKw/irXke+seaj47fvG/duId9ht9DAAAAgOHNb37zZZdddt555+VOBMjszjvvfOlLXzqxmnulu3lOvuVLuAtNc69Y60v6t0Tcmha9LK3RhHvmlNF8s2neKL93biUOau4AHLofiDU3j3eJI7+kl+om96D4Ed+CAIrl62KTa18uLR9gGGz5wPT84R/+4VVXXZU7CyCzd73rXQ8//HDuLMbK6DzHreQYEjV3AO2MvtglU95fBgCplHZgLC0fYBhs+QAAwOC71V4mVBVm9XuD9dDRsqqqZz7zmX/zN39z44035k4Gc/SiF71oZ2fn2LFjuROBZETH0xGlCgAAAAAA+pNk9Jh5Yj10tKyq6pvf/OZFF1308z//87mTwRz97M/+7HLJ/RboETebAwAAAAAAYDCP1Tovv/zyl73sZXlTwWytr68P3OL+/v5isWAQkpmgtg4AAAAgl1EM0Rmtdbzs+ry740poRp72KgUwDYvcCQBDu/vuu7/97W+fOXMmdyIAAAAAAEyHXXA//KH+WgGAAlFzx+ysutXv7+/nTgQAMEpra2sD3CmVpJWMd3QNs5aAVkNuimzzAAAAWGEcbczOJZdcwgjyADAu3e8gTngP8uHh4QCVNWUr8nJl7AWWJH+UZvjPq3uLw+ywdVvKOdnygQnzDaXSPBbZRwDnq6tjhfDGZlv2GC++toTM9c01p6z+XU00RoARMglaUUZDyhFsWpcIaX3hC1+47bbbPv7xj+dOBBNx9913X3XVVbmziBdceRR+IDaPs6ExW98Y+sOUH7LwoeA+c9FHKiNIriNMkvyBCfCdPjlPPn2nfMYpov2SHT9Jns0zRiF/ZXDfSabQqO+s2Nl00GEn+vzZnu6Mg9IIe1yzzNH64QZtIUIcZarO5J2vdtnyfXu6XIQCMGq+McflQc+F/ypfMi4uRg99rm9u9bez/F2zvxr0kYMail7VSOu66647//zzf/d3fzd3IpiC5z73uU972tNyZ9GJt/joOxLJfaniepFo3hh6WKSbCdBF+ftFdIZ0HQUmwHf6JBSRnTuFUWir/051eiafN9ppCyfPTsL5p31+22zUqL/3sbzNpoPOnzk3HhF5j9N/uKEVloiNpLVUJFdzWjkrSr49vWNbAIpl7NrGQUb5LoOmylyJP2OCjjlBzUUfx3zR4mLKuXGwHdLm5uY555zz5Cc/OXcimIL19fXV0NDjFdDh19cXQ+ijEdQ9xBdK026zIbqZAMkZe1AV0mHNKO5UZ++q+jjNl4Q9V5OPcnmVRySjdFUV3HVUzgcokFG3Xf1xeHjYx9V6471x3QhsQhw5w4Q5OBsVDia+t4Q25LyeodHHgqML357YnMd5TUsO1Zwz9EMPnT9iM071Lcm3LTBnmiOAcO4zH/aVidmuCgCTEVBzd3bfCO2QJXB2P9G3K89PNxOgiy4d1pp7qK8Eo+/41nyvvuNb6JFKODLYR5jmyjHq7xEd8Zx8+fvih64foFjOHwbO/6ZtN2H8sexlveYZuj7HstLmw7cndgnVFLHHJSyId+lcCQBJGJczu/+wGW/BOvmqAIBczJq7phuLj91FJeiXa/TPXH3XGH5JAzL5CKDvsNak3EM1Hd/0XdS75xNqFF1H5XyAkRK2al8RzXdRKjR+ryLa7aloGHRTjvEu/fSKC4Hjl+QT7GkLiXhv3JYfgS0fmLk+DgIjPapwPAQwJWbNPWE3FgCjE3EE6PvO69B+2aUduIrqOtp3PsBg7ItPq91BuFBnvMWe7otj3yq3mq6px/m6I6z9cACoeobWdpWrop5u59lsqDr7ANKx24QvGc36tPNPlQwG4Nvj6o3NmO77cIO2ECGOk7EL2DMn6eTuPDL49nQ5HwBTUkhdpZA0BOVniOSEDz36srfmjaEbGxsnogWMLdPKLvcE7SfR23HCDmjsS0ByXbqOKnfJoD2XrqPAGNnbsFE3F+Zsfcl5n0pEfH2jQsCItlqbECI7l10TXzOzch3KqaIoyg+ry25ozxPahG/OJDtv0Mzy7sx2DkyPcQ0v7ke48mzFbittGq3NdYmpjBa9KjjAFsX3ici/FuIKfZo39vd7gG0PhphnqDbrRBEdsnyR9R21nO3K89PNBOiie4e15gxyl1KjCWcHOruJ0Hxm2HU0YT4AAExDwr47AFBFlRd8p0uhbfmCpPrBL8SM6EukOVuxV4WvIao64yJvSPb0Knwbk8/lhXbtQqIziDFn5a+ZYM68NXd9X4zQbilChKBrX0HT6WaCpoceeujUqVPnnXfe9vZ27lwKpd+XQ/fQyrPLh176Dn1La1vR8Z2R5cNaUBpCK8Lfvvgc7gAAqPG1CCA5TcFB/t0unEp0P00TxDWXallao0VUdSj+lMmoaK/47tuI4LvvQdmuPL/R183o9MYGhqaUY8sMzNf7FWi1s7Pz8MMPb25uUnMfgNENHAAmxndWkOqg13d8YBrYUwDMinF6xdkWSuMcjiLu5g/9GyNmlttN3gRmZcQ1dzZxRFsul1VV7e3t5U5kFthVAUxb30c5jqLI5Z577nnve9/7Z3/2Z7kTUfnJn/xJ5/Qbbrhh2ETQo0ceeeShhx7KnQVQBHsYFs27hHoivzeQlrOnOTArI665A9GouaOiQxwAAKKnPvWpT3jCE66++urciQCPuf/++0+cOJE7C6AUSUaPAQpkn6oHjeceXeVP+JQXrjSgouaOeaLmjopfnAAAtHn1q1/9ute9LncWwGO+/vWvf+Yzn8mdBQCgk7q03aykH1rPBI4oWxsPOK3OPutXtivP3xw71xhH19cuZouaO+aImjsAAAAAAECv9E+yFR6Tqx8IXphf027r9Ihn+WK2qLljjlY198PDw/39/fX19dzpAABSCrr5tMzWfX1kCuw7k2p5k6wxXxBnfHti6MC4wsdUzgfU0Ze//OXNzc3cWUzBV77yld3d3aqqtre3n/3sZ+dOZ6zuueee3CkAAKYm4tEIgAY1d8zR2tracrnc29vb29uj5g4A5QsqYhq3hQ6se+u+hU1SyU1eDk6ytrunFJSGc05jzbSuqOYMUyqyN1133XVf/OIXb7nlltyJTMFXv/rVM2fOnDlzpqqqF7zgBbnTGbEXvehFuVPAQE6dOvXrv/7r5513Xu5EgMy+9rWv/eiP/mjuLKZskr/iUAJq7pipuua+tbWVOxcAQBhjrMagLsnN+X1xhPi+jjChPdCFfOxovunK5TLiyJ3oQ/NXdhU3Bsq0829m2JzHObM+z8pVEDfWahwhAWMZx+s3fuM3cqcwNZ/5zGfe+c53fvKTn8ydCDAC29vbW1tbR48ezZ0IkNlyuXzyk5+cOwsAwbrW3PPevi0QTnWic9a8MfQUaxqnZGPEkO7zlHGPK/ZoCYyR8WCloC7Jzf/64vim++L46sIR+TgXxzdduVzNOMk7yxtPmgpdP0b5u5m5UX8P7Yc+mHIyAYCJec973nPVVVflzgLI7F3vetfDDz+cOwsAwbw1d+X5Q97btwWtnY/iYra+MfSkq0svLXRBzV02/PaWqkU5TsadSHnkYU8Hmox67uoP+eFITvIOGPTcJM0vAeXO3jpPR/39JjHe5fyYurTi/IjL/M3JQRsAAACALaCfu++m4OarrTdfa27WNl4NvY+49WZnO0ho/1NnKE27zuWyg/hucg+9b30srr322r29vcVisVgs1tfXjT/0E4PesrOzc/r06XPOOefcc8/tr5VUbymhyuA8AviGL6j8e65wZJD3rEqx5WviOA9HQSMY9Df8Qqr1AExGc+/osuXbXaS7p9TRVHfk/pYr4YeYCgV3AAAAAE7amrt807T+5mvNzdpGYTr0PmK7Ut+afxAjlNEVq7VdeX75Jvepntf91V/91XK5PDg4ODg42N/fP/ih+m/7D/1E36tra2t7e3unTp0KDdh3YvVE4+NeX1/vr7L/3e9+V/6MhGK0c/gCzfAClWILDz0CCHuK8xpe3yMY+NZb3+sBgKDvWm0JtWAlZxU79PASsbzdD2LDr2RnZ5FU14QAAAAATIxZc3feHWycRdgnFc4pwumQpmrmTCkJO7eg06Tocyr9PdFzO2274oorjh07NnCjjz766D333LOxsXHppZcO3LTSkBcD3vGOd6waTXUEqDx7bsTIAH0XVpwjGMjtxu2hxt0Apa0HYIzkm0KaRVJ7B2xeb9P/7fsJ4Yvvy9wXx0i+dboRR3PTjPPOpFC+5dWsn0r8vOq/7Su1wkp2fuiC1o3EGcR5QVRuCAAAAMA8mTX3VB12nD2n4sytAI1hlD+e+6oH+jBtvfe97139kbDLnq8QH3pkyHUE6LXdEa0HoBDC/SuaiZVVdxYmCn+HxhdEJ98lTnQr8syaZe+yaEGflzOOcdQNTcZ3FdnXIt3eAWBIwlE37hYu5RtDj/Z8OwB98O1Zvl4mfe+JGeOXc8TjcLcSWdELqqGX1p3Tjr/qKhX99r7f2Guo2VrV3A8PD/f393PnMj5JtkAhSKotvKc9JeiI0ZrMAOsBmB6jHzfQN04bACA73/d+6JVpjejL50nm5xcOpqT79ixHEHr7rWjm7zufhEZxxONwt6Idz7315mXh5utDxU3c9vzOdivFJxd0U7ly8Y2Azstlynbl+X3rR2gXcdbW1tbX1/f39/f29tbX13OnU7rWI4Ax3bfnCnuicwuPOALo91BjF/ONYKBsV5NMvbwDrAdg2tgFEKTjBtNfVQUA0IXQj9U5vTr77Du6CU279mm+M4gxZ+U/w8Kc7ezs/OAHP0ge9vzzzx++4unb8qvGZl/p9gjNib8dqmrbc+35u+Qjx3GuB59RHPE43DV5a+7Ka0HNicYMzpeU82um+2jiKJv2RWhdFdHThST1eUJpY2NjVXPf2trKnUtxIo4AypdC98SIzV4ZRz5GRSxa68yav33x2f2B0YnojgcAAPSMivaKr2QWwQhlnCm0tivPb/S8Mbrg8GsBTX/yJ3/yp3/6p2ljnjlzJvlz9XZ3d1/3utfJ8/i2fGOz1+wRvj3LjibM7ztipMpHjuNbfKdRHPE43DVp+7kPwHnlZwKmulwTUP6Q7gCA8eJLHwCA7owq2OoPfbe5LneLRn+V2+0mbwKz8uY3v/n9739/2pj33Xdf2oBVVf3RH/3R97///dXf8p5b5pZvdIwb4CaAtOuh8CNemR96rwqquU917U91uSaAmjsAAAAAlMzZ7xJAR8ePH08e85xzzqn/Hvuea/dPz5gMRqqgmrseN2sjiY2NjYrNZoQ4AgAAAABoZZ84BI1uHF0rTFieG2m9EuhJ33uEM76wRxe1h479iFfUykxilDX3iX0GyOX888+/4IILcmeBYBwBAAAAABgPS2wOELyabgwiHBr5UHweYGu78vz1wwPrmY0xju12gQnwbfnGXuMb5qV1TzQmVmf3uLfn97UrHEmijwx2Ms4jgLzqhPglHPE43DWNsuYOJMHNQQAAAAAwCr4nIspzGvPoB4IX5te02zpdSFKfJ1A+YR/U7576PTE0iHK6JtWER4Be8xQipF0uTYb6JMeImjsAAEA2Qbd8CkFy/VotJH85Dd9twsbE0Ofe+3rlTO/GWACARuj3CACMF0e8VtTcAQBA6covYkZnaNxwGhc/48pR5t8aZMg0nHPaT8pqvb23eXdw4dsnAGAAfBcAmA+OeK2ouQMAgPHxdawwBha0B3D0TW/GsccfNP42elXX4xIK+Qh5KhdWjm8nXy9m6/LaS61MyRdEztP3uXRJXk7VeZttx0sF8iUQqvAAAAAI4vt1yq/KkQquuSe5i7b1/l/hVXvmJHEi4gMoSpJdXt8WRwYgI1+XZF99VjO9+V/fQ4EOz34wkTF/6+glrXn6CDVcu3zcTNIoYYd25fYJXZ/C8hr5D5B8cuVkAgAAgPHiJ+XEeGvuyoEva0Fbhnz/b9Ddwa2djPRZhcY3cMaFKRl+e+7eYpJdXt+Wck6ODEAXRj139cfh4aFmf0/yi6V7BE2efRy76iSFfui+t4Q25PyYurTiTH7Ig7weB3kAAAAANm0/9/okx3cLcyWe1Onvm1bOrGnXec2gY/yIm8qBaXAOC2DsEZXryFC5diLnzEHDMihTdSbvfJUjA1Cg5t4k9HEusBRbK23H7zuf/uIX+KFTcAcAAADgpK2527cG2y81J4be/xt6k7Wm3STDdNp3QAfdVA5Mg2/PMvYI5/zN/8rDOOiHZdCnasfvuLdyZABKI3zd+3bAoB0z4udEUfGDwlbhRfMs+Q9fcLdXjvPrBgAAAAAqu+buu4k7InT06VCqe4ftOKlOhzitmoyDg4Pvfe97Z86cufTSS3PnUgTNEcB34U0I1ZwzdO8OnT9i9+TIAIyOcc9KfdHLOMg0hygJmt58qRm/vnnF+NtOyRm/fsmXv36R6+nGnYh2Ys3IqX4aKde/c3nl/Ou/5eTtK53GSpDzd84vJOmbUkJfewDATMRdGm+N6fxStjtUNf/r64zlCwuMgrDdRu99mjeG7i/sXyNi1twTdthhI0D5FovFI488cnh4uLe3t1wGP1J4evo+Avh+1YXGicunLpNxdAJGRy6A+v6WI8jTmy/Zf7SmFNSu8qCkjO+M7FwEZaqtM2df/5rLFV2S9F1F9rXIFw0A9GHmR9dUfRN95Pu3nBeeqbNDYyzbhvyjNG7v07wxdOXo5x/Lmp+wEouMqb5I7Dh9XBn2Nc2WPRYXX3zxcrlcX1/PnciYJNnCI4aDUIYNfS9HBgCAjKM3AJTGuMHL17OneUdU8yqsUWI25rdb0SRjNGf/txnKyN9+qXJdNnamFBq/niGiB4AG/ZwgM7Zw5x9V2x0VzR3B+bf+NL/1Dg/fzY5B5W87lKZde9GcQezlre989S0CBpDyGarC/blB8x/qbrJOFScofr3VHlr3bgtfZijZeeedlzuFETj03HHvO477jgDCHurcg4Qjia31Z2WSH38cGQBgdDoefvvrfwQAiGacTTiL6fV/mzMb9fck/bWNOL7ifmWdJjhL6s5So/FqdPxWzrdwRjNJd9555+23354w4H/8x39sb2/L89hbuH6PqPwn2r46g2YXsK+NOfOMZoRqHig07crz+5aXS18l8Nbc7VqVcs4k0zWbRUScoK3NObOcJFszJkO5eXc8Mmj2UP1uZXwV6XFkAFAC3695jiEAgDlrfj86++gY89u9dpovOd8lFNSCTkacZT4hn9b4mjOLLvFtziJd92sSKNMnP/nJj3zkI1dffXWqgN/61ree//znr/6W99z6v/o+dkHSbqUd84xORt67kzSBXpU4tgwAJNfx0jQA9I3fygAA2Jz9QwV2r1h9E32IyCdXfOrpM/TSl770D/7gD1JF+/3f//277rpr9XfongtMzyJ3AgAwhMMfyp0IAAAAgCF0L3CvBm1Qztw6nEtEPkFvSVVwd/ZQBpJLtXX1vZU6R3nSNxqdXsLlYkfOouh+7txkDcDGkQEAAACYOd8TlZwjO9dv0Yz90t+oFIfWsPLO0XKa+Rh1cOXyCvEFzvMsXz6+6YDMNw576B7RfMm+3BW35dvjyzcbiuiw30zPzkfZrjy/78ggtIvBFF1zZ5sAYOPIAAAAAMyN8Cwo/UvV2bU83zzC24OSFPIJbTR0eVszbw5AH5GPMJ2xRNCkeSyBb6L+JWGniMjQnh4XX96/Qves0CODPk/0pOiaOwAAAIAS3Hvvvffff3/uLMbt7rvv/r//+7/Pf/7zF154Ye5chnPllVeur6/nzgIAUIpe75Aw+nqPEXeQTAY1dwAAgDwyng80b0oFNN7znvd8/OMfv+CCC3InMmKnT58+ceLEK17xivPOOy93LgO566677r///lldYwBGpKefAfy6gKzXLWQCm98EFgEr1NyBamdn59FHH93c3Dx27FjuXAAADsPXplO1KMfJ+JPaHr7WadS9hJDcb/7mb77tbW/LnQXG5MiRI7lTAADMHc+EQxbBNXffAPxBp2Ry16r+Ol5Nr0tX8iUyPkfh427+1/l8cyNOyav95MmTDzzwwAUXXEDNPdTo9im6lAKTYTxcqPkQIefzgoRvKHu68NixoJs9NXGMRo3Fac2/Cjy8aL7Zk68HAAAAIBd+rCILb83dWZkSylWhDygQulYpO15F6C9yLr0ukXGq3/rICLteP5bj2sbGRlVVu7u7uRMpiPLjK3CfokspMAdCMXptbc3ej3zfUL7pxlPFWuP4+OJUPzwc+ZI36u+pvmF9663v9QAAAIDJ+9znPvcP//APH/nIR3Ingon49re/fdVVV+XOIp62n3t9YiZ0HNN0mNI0oew1Vlnnq87TV00oo3Nca/7KDmUReWo66DlPgO2UQuNX1jlzwvNnoehQAmruGn1sgb4un/aOacSRk6RLKTAZRl149UfrNWDnPuK86BVx4bDvC4118vIdZs63hDZkH3j1SrvgCgAAgLye97zn/ciP/MgHPvCB3IlgCp797GdfeumlubPoRFtzd3YHM15qTgztAOUrdfmSac7vK5lp2vWdcCbpwBWRp6aDnr1+7LCh8WW+Pm71culDlYmae6uetkCh2N1lj6ZLKTAZzT2o42bvK8T7Lm4FxRlAr+2OaD1gYsbyjSbkqVmEgRdzLGsVADAx6+vrm5ub83lOOHq1WCwWi0XuLDoxa+6aDmVK0R2gNJ2tfPXriI5aPkk6lMXl2VpV1ExJ1SFOuNAizDAuy+VytRR7e3vL5awfLJyqS2nHLdyZRk/oUgpMQJJvImEvS/VN19M3ZtDNN8a79NOrSXzjA8mxUwAAAMBmlhf77lDWt4iOWj6ldSjLEn8mZ9dra2vL5XJ3d3d3d3fmNfdUR4Cx7Im52qVLKdCRceHKuKHEvmRoX+hq3lzSnMe470QZR5mqc8dv3mdTeW4AimhXk0y9vAOsBwAAejLVk1bfrcBz0Mfy+k7B5K5XzruWJ9YHMa1bbrnlc5/7XO4sMAXf/e53c6fQVYnlRWV5rjkcRJc4EfMHfQEkz7MKPKwnKbj7/p6MjY2N3d3dvb293ImMQ69bYMJLUHQpBSZDc4eNb6L8UnN66209chNBTctLZN+CE7ForTNr/vbF5+iECJoCh71p+S6w+a692W0p6yz6/O1MhHma1wJb09Asl5y23Zz9lroV30VBIUMgI9/279x6S+gC2DEf46u577pBUeKWV0+ub7RuUeNdsX37xV/8xRe+8IW5s8B0XHbZZblT6CTlM1Sbv+2EDlCt8xsdrIIIcZztNt/i6/Bl5J+EL09lBz1jZRrvFTqs+eL7OL/nfMnIZwiFY0h3WfItsHV+Z7uVYrvynT3aR4BmAtXZv5xSHQF860E4Ujnz7/uIBABA33wFDrmQIfxX+ZLxBSrXWZT5+97rnMcu+gctiDK9mrM5n4j1CRRF+NkvnxHU05unBr7LVEK7levMKGi688e/cMIuxHH+rVwPxkv6NWAUW4z/RiyvfSzSJC8Er2doTkl4TAs66k7ek570pCc96Um5swBK4a25G4cM4Qjie6nLdOUByzmbL45mEULnV9LnGdqokHBo/Mr6tkj4oZf/JUTN3WB/Xsm3QOVBJmLLaU1Vk2GqI4DmiKRZFYXvQQAACOxiR/Nis/JdBuXPzmYJRkijVaofXl1cSwAAIABJREFUJK1pDPmN70ujy4oChmRXeCv/FitcFWt2CWrd4H0XqHxvlKf7XrKXy2ja12VHqF/L+QexD1y+A4iRZ+s1SOdL0cFb+VZRvVxB0QCgqcSxZYDhUXPPTuhtAQAl83VE5VAGCDQ7iFFY6TOdQhlVrSSlMarnGJ3m7t+xGNr6la08NCU8IkX35ulCyF/fhK/OLq+f1l6A8sxdgtuECx7CDACgRM0dZ+npG6X8L6rVo1OpuWdU/kYCAE4cvoD+COMVdAzYB6MYNOqDwzwvcqBMCa8YJdkrnYOfjEuvR6de10/C4NTTAfSt6Jo7HccwmFU/9729vbTdFtAHjgwAAMxBHwWRvn8t9NdBMskPVH0QflZhMnotrQr7lK/dLvm0vjciH2cE/aBb8vwRBy79+klVcOdOIAA9WVZV9cgjj5w4ceLWW2/NnYzpU5/6lHN6gamii4ODg9wpVOvr64vF4uDgYHd3d3NzM3c6kPAzCACAsSukrlFIGoJD3dj3fQcpf0VhnppPa6jOHiLGHoXG7lxVT/ENF+5kj5nuG1rd95Zmzs757eUy/vDF1+TjXA/yIgfxrR/f8jrvEGp+Ls2/Q4MLnCV73+1KU7qNCcBgllVVHTt27NZbb/3CF76QOxnM1M7Ozvb2du4sqo2NjZ2dHWruAAAAaSUZUlzZpdFuK20acob6waBL6FbpS6OcDIEmeehtzUtyBP2o7s53ye/tmHxrbr4ZlOtB85J+/tC1qvxc4oLXMxhHOX0y8nSOkAB8Hhtb5k1vetPNN9+cNxXM09ra2tGjR3NnUVWNmnvuRAAAUxB0d3b3tjjfQ+F83TOVb7H/q2/LFyT5XiN0hNR0wpXDBmVrH3+cQYQ0el1RAAAAk1f0eO7AkFZDulNzB4ACDV9TTvKgtsEeEKJPleo8MtJ085R7aApdFJVdTeWX9G/p3qU0tPOpXlCQtCsKAIrV0zGNQyUAH2ruwGPqx6jmTgQA0M7oxNoc/dPZPVPufOqcWR5itVKfZQnJCKlGB6+s9aBZLmAyjAtLE7jOlGQRJrAegCH5rpqzHwEAlB6rub/73e9+97vfnTcVIC/6uUcYcuSEVgzjAMyHPFizvYf6anC+6b6RHCJqec4xkZvxI0aNaGpebGhObK6HVG0BoyAM8CIQ7krJuMv4ftsEZVvUrzVgLNhlAAAdLauquvnmm9/5znfmzgTzdezYsdwpVBU197MFPQRsgHw0GMYBmJ7mTi0MOmy8y7nTOY8PEceN0PmTjGIRh4MPZivjfpdW6KP8+gsCAACAIMuqqjY2NlbVRmDOlstlVVUHBwf7+/vr6+u50ymOcxgH41XlcA32cAd2/MrVeZNhHIC5sXuIdw/VZPdbj4sTl8+qda7MAQAAAMDEMJ478Ji1tbWnPOUpGxsbFNxtvmEcjFeVwzXI8xsFd4ZxANAq1WDHfcSPeO9gA0FwgAIAAACAPlBzBx5XyCg3GaUaxkEerkEu8RjvZRgHADbfeM2+m0vsg1LzwlhzHuOamTKOk3EHjD1zkstydXD7DqG6H31lXQtsTR4AAAAAEI2aO4DHpRrGIWK4htaUOmIYB2DUlIO2C3u3ZkTj1kuMchO+OUOPOd1HahYWKiIfYOXBBx/84he/+Md//Me5E8GY7O/v7+3t5c4CGJRwupHkVjZOZwBgFKi5AwgW9Duv7+cT2m9nGAcA5SvnAdSA0vnnn/8v//Iv3/nOd3IngjHZ398/ffp07iwwEcP/lo5rUe4B0P0HQNCJGGcfAJALNXcA7VqHcTCGL/AN16Cf39luJf7EZBgHACPCAQFj9Gu/9mtve9vbcmeBMTly5Mj29nbuLDBZ9hmK8cPb99/KOqOpf7S3DlinyceYWQgS1PvHGSdh/gCAhKi5A3CIGMZBGJPBOcCCZgwHYbowJ8M4ABiSr8Ma+z4AAP2xR7Osu/IYD2KpC+72/PU89mwR/XXsyr7RbsdO7s74CfMHACREzR1AEZy9TnqKDwAJcTYLAEB/mj/jhX7rNbnO7mtlmG/zoLt4QyMniQMASIWaO4Ai9P0zkZ+hAAAAwOg0O4kr75RtDQUAQN+ouQMYGYZxAAAAAOBjD27eXZJxWuwTmeR5Ck1zugQAQ6LmDpzl9OnTJ0+e3NzcPP/883PnMpz77rvvrW9964UXXpg7EZUXvehFzuk33njjwJkAPt/+9revvfba3FkAQB5CZSdJdYnKEYAqfJwW3/z1s0brGYwh0TXBV+qZm8c6I0hz7PVQzvgJ8wcAJETNHTjLzs7OD37wg3POOWdWNffjx49fdtllT33qU3MnAkzEqVOnnv70p+fOAgD65SsbCZUdu+YVQV85ojoPTIm9O8tHm4iJQU0o48tNdI+fMH8AQELU3IGzHDly5MILLzx27FjuRIb2xje+8YUvfGHuLICJuPnmm0+ePJk7izka7AbtVDIWBEe3rjAKvg6VQkfLoE3RGaeOYISq+3v6mgYAAAB6Qs0dOMvW1tbW1lbuLAAAZ1HWppN0oU1LzjxjEVC5rugmjCDNgQ5qza2o4x7qjG+M1WAMqsAGDAAAgOFRcwdQVVV12223nThxIncWkJw8efKb3/zmNddckzsRtPv617/+tKc9LXcWE2cMjersVGv3hK3fYswmzG+86owjJyn0zPUlY5QO5Xa7dxP2xdfkr28ak9H89EN7kYeOv6zHdghgAL4LhxyCAAAGau4Aquc973lf+tKXvvSlL+VOBJIHHnjgjjvuYAigsbjiiitypzBlcrdZu2ZtFOWNbrDy/EbB3RnHR+hm66zg18kY9ffQdn18601eP87BQJLkg5FqbkV89ABmhYMeAECJmjuA6kMf+lDuFNDui1/84q/8yq/ceuutuRMBhqPpTqt5XJg8joqmbu5MqQ91MkI/dN9bQhuy+/LrlTaGD8bCeZGsGqSMxRUCAAAADIaaOwAAKFSq7rR2v+zuKQ2s13Yj1g+1SzjVG0+zkm5f4Olyr4Ydvx4EqW7IuFejbjp+wQAAAIAQ1NwBAMC4BdXvMnbo7qmbbVw3Yd9yCctLN2EYNHeZ2NNbb1UJalEOHhofAAAASIKaOwAAGBljLBT7mZ9Gd1dfN1v9/M52K0U5z9fN1u6ua/TPbRa4Uz120rcehG7Izvz7ewwmAAC9Ei5UC5eWQx9XniROr3yZxK0fAICNmjsAACidsu+qsi+tc8x0Zd/biLPN1lQ1GQrtRncT1vzti89ZNwBgYElqvsIjTOSvWv19b6ni9MqXSdz6MVCdB4CKmjvgtLe3d/r06SNHjiyX7CMAMEfOfvQAAKAExj1Yvv9Wui9x34MfQh8IEREntAd98791fXz1h32fXKofM8Ide80cmtN5lgYALHInAJTof//3f++9995HH300dyIAgDwOG3LnAgAAzlIPgGb/tx42zRg8TY7mrIYHBUkYx8lYrrrF+iXn0HlJmnYul7G2jSI7P6IAgD68gMPGxkZVVWfOnMmdCACgdN1vwQYAAD7N79lmYdfXubuP8VtSxbTj6H8tGO9tvtEowfva6gO/dgDAh5o74LC5uVlRcwcAKHC2CQBAf5qDligHirGHQJkGY7nktTHh9QAAo8DYMoDDqp/77u5u7kQAAAAAAA7NAVWcM6QqNPcXZ5V/3zlkLLhT6wcwW/RzBxzo5w4AAAAAo2OMLd4sytfTnY/9NKYLcXxSxWmNXzWGU68aXdp9Y+x0WQ++6c2mjTTs4d0BYIaouQMOGxsbq18Me3t7yyW7CQAAAM5i1KRSxXSOBWG04hsP2jfWc3SBDyiKczNunej7uzWI8r0d4wSN566M7BvePSjPuKZbQwHAfDC2DODGY1QBAAAEMx8xoO+K0qpQXj8o0m69Zs8/zLMTAQAA4EPNHXBjeBkAGB39oKgDGDKZcpYac1Zv8/bGv9Zgz1xPEea3W9EkYzRn/9du1J7ZmKJJKTR+PUNop1olSvAAAAADY9AMwI3HqAJAOZQDIxRVVxoyGX1tjiEm0B97vGB7fOGq0R27nnnth4O01P/tPi6KEaf5X1983zjLzSlCoTw6fivnW+pM2KOBIfm+2dkTAQAGau6AG/3cAaBkzXqTs0ZWWcMZ138b5bNmyc8Xv37VGUefqi+4M6u44MJyGb10KRAgjtF3e/WHc/jgekprlUoer9z5lla+Ort8PUyOrxmzuEt8m7PgzljtQC7sbgAAJWrugNuq5k4/dwAoUE/dTp3zGwX30FKXEarZrv13BPtKgLBcHdsCVuxNWmbvOPom+hCRT6747LAAAAAjRc0dcKvHlilqpAIAmBW5O63zv74pXbq1OtNQihsTI/QtvcYBEur+myroRhDnXSwd8wmqg6cquPv+BgAAQJmouQNu6+vr6+vr+/v7Z86c2drayp0OAMxRqhpTwm6nCQvizqGrgfGqBy+qK93NodtX89Q3YdRv0Yz9knYfcebTzNlo1MjHHqxJs7xCfIHzYOXLxzcdAAAAw6PmDnhtbGzs7+/v7u5ScweAkvXa7bRjt9y45yVWg9TLKPejI+GmE/1L1dlVY988wtuDkhTyCW00dHlbMzcuwkWsBKE7Pzs7AADAkKi5A16bm5unT5/mMaoAUJrk3U5b53e2W4lFMeNBpvbMSTq5N/sL1034lkvOBwAAzFYfl/x9NxoarTh/XPlu3OEiIoCxoOYOePEYVQAohGbQ9qpbt9PWYeLl6cKcSbrlBs2s7FMMoDQ97Z7s9ZiG8out5WcosDsWpCU/l8KuwlNnBzB21NwBr9VjVOnnDgAz1PewyDydGwCAjowb0Yz73uqXqrNvPms+RsI33Rensu5js2+2M+avPP24jWj6JRX+K+Rpv1RZ682XUmj8ega5E0CcJLcJAsAAqLkDXqt+7tTcAWCG+j6X41wRAIAufMVxZxdpe2S5unQrTHd2tW6+xZ5uf7/7xlcJYj/vwXmRQMizdb0Zr0bHb+VbS/WiBUUDgGJRcwe8Vv3cDw4O9vf319fXc6cDACiR7+SZk0YAALoz6umrP5Qjwhl8w775pgv18aCx5oSb50Lj2HVweUwYOb5mALou8W3OgjvDyACYJGrugNfa2trGxsbu7u6ZM2eOHj2aOx0AmIXvfe97T3ziE5/1rGflTkTr6quvdk4f0SJgjL7xjW/81E/9VO4sAKB3wiDggzWdME7ypUjSj36Y+NTTAcwKNXdAcvz48fX19SNHjuROBADm4qKLLrr33nv/8R//MXciQLl+6Zd+6RnPeEbuLACgIKXVc31js9izVSH99OX5IwriQestVcFdfp4qAEwDNXdAsr29nTsFAJiXzc3N5XJ53XXX5U4EKNf29vaxY8dyZ4F+BVXi9DGd/VXl8TSEhzTaMYHB+MZscU6vH3BqD1bunG7HcYYy3u57oGivD2Y3GjWGp7fz8a0333KFxhc4S/bOfOQBeQBgFKi5AwAAAAhWfrG1/AwF8hjK3cn9TIWHLjrnBwagGXxcM6d+VHdnfGeoiCQ1ryrn1yxdXJC4+PUMxjWM6HyaOP4AGAtq7gAAoCwPPvjgz/3cz+XOAo/7xje+cdddd2Vp+sILL0xbdlxbW7v++usTBsziP//zP3On4Gb0hTS6T9YvVY1O3Eb3Ut90XxwjlD29tc+p86XWgo4R1vdfIU/7pcpab76UQuPXM8i1wjjOnAEAAGaOmjsAACjI8ePHP/rRj+bOAme57LLL/v3f/334dj/72c/eeOONW1tbqQLu7u5+7GMfe9nLXpYqYC4ve9nLfA/vzchXHHd2kbYHKKhLt8J0Z1fr5lvs6XYtOMnzAO3+m76xm315tq4349Xo+K18a6letKBoAFDr4wDCQQnAWFBzBwAABdne3n7ta1+bOwsU4ciRIx/84AcvvPDCVAEfeuihv/iLv2AD68iop6/+kEcm8dGP8GA37QulaVQYJjg0jl0Hl8eECR1lwjklyXpYcRbcGUYGAACgI2ruAAAAALSEQcAHazphnORLkaQf/TDxqacDAAD0ZJE7AQAAAABT0+vzPyPU+ciJrYZnUcZsHc4lYiUEvSVVwd157wIAAACi0c8dAAAAQFe+MVuc0+sHnNqDlTun23GcoYy3+x4oKowt053RqDE8vZ2Pb735lis0vsBZXnfmIw/IAwAAAAM1d6DF/v7+yZMnd3d3n/jEJ+bOBQAAoBSawcc1c+pHdXfGd4aKSFLzqnJ+zdLFBYmLX89gXMOIzqeJAWoAAABsjC0DtDg8PDxx4sSDDz7I6QQAAAAATJJvYKW1H1LO33c+WQSNu1WOPtI2AgqbR5NzuhAWwATQzx1osVwut7e3t7a27DuaAQAAgLHoowcJvVIwmO43VcgRnC8Jb+m+8Ufkk8tIz4X7Ttt4MIZwT5JzHu4TAqaNmjvQ7pJLLsmdAgAAAADgMataal1UbX1mg/DMA3mi/arvwQnGsxacjymOzkeO41wPTsb89Vuabw8KJaSqj9Bst7Jq5b6FtV+qrJXvyyc0fj2DPKBZNGfaAEaNmjsAAAAAABiT5jOEK8+zl5v/FWqaRsHXmOh7LIQ9NoizyJ4qHzmOb/GdwZvzG9Ptv32SdNm2nzOx9sOHQmsW1tm6c5iXoI0kYlmcb/EV7gHMBDV3AAAAAABQIqN+vfpD//TgLIyu0AOMypLk+c+hhOXSx29W2I3ad1xw3zUSu9G4+DbhwowwA4DJo+YOAAAAAABKJIyXPQp2l+qMyaTV38fR90pLGH+kmyWAASxyJwAAAAAAADCcvmvfzvhCo0XV4rsnsxqhRTmzPKJLRDJBb0lVcHfekAFgzujnDgAAAAAAxqR+Bmk9Tsjqb9/jNyv/szGNx6Uaw6kLj+tszu9r1x4n3TmCSms+8mNF7fXQut6E9WOPEd+aT5W027tvpfmSD105ofEFzvK6ZmNQxgcwXtTcAQAAAOTRrODYL/nqEcK7+ovTK18mcesHmCT7mZ+al+QgoRPllzTTNakGxReCByVpvKoJG7GK9PM7E+jyyWq2n9a0D62HvgblI0znkA5MD2PLAAAAAAiW5N75uJJNUGEiYVWoP72WtBjlAAAAYGD0cwdUDg8Pz5w5s7+/f+zYsdy5AAAAlMW4E9/330pXKfbd1x90v39cnNAe9M3/GsMy1MvuHO23S7lfGIyimUNzeuiqAwA49XQU5eAMTA/93AGVRx999Dvf+c6JEydyJwIAAFCcenhf+7/14LnGELpyNGc1PChIwjhOxnLVLdYv2QMEh64HH+dyGWvbKLIbeQKYtjWP3HkBwIzQzx1Q2dzcrKpqd3e34zkSAADAqDV/CDULu77O3X38dkoV046jr0of+h+F5xzqd5jfkFTVAVQcCgCgANTcAZXlcrlYLA4ODnZ3d1f1dwAAgBlqDlqiHCjGHgJlGozlktfGhNcD0Ietra1rr702dxZAEd7ylrfkTgFAMGrugNbm5ubp06fPnDlDzR0AAMBmDyZuSFVo7i+Ofjx35SUHZbuD6ZI2MKSdnZ3PfOYzV1xxRe5EgMze//737+3t5c4CQDBq7oBWXXPPnQgAAMBoGGOL16OcV43Ss/Oxn8Z0IY5Pqjit8avGcOpVo67tG2Ony3rwTW82baRhD+8OjMIFF1xw0UUX5c4CyOzo0aMPP/xw7iwABKPmDmhtbW1VVbWzs5M7EQAAgPyc1dvWib6/W4Mo39sxTtB47srIvuHdg/KMa7o1FAAAAPpAzR3QWg0pQz93AAAAAOjbK1/5yiNHjuTOAsjse9/73mtf+9rcWQAIRs0d0FrV3Hd3d5v35wIAAAAA0vrEJz7BHcbAylOe8pTcKQAIRs0d0Foul4vF4uDgYHd3d7aPUf27v/u7v/3bv82dxUx95StfOXHixC/8wi/kTmR2Njc3/9//+3+5swAAOPi6QTCUCjB21157be4UAACIR80dCFA/RnW2Nfevfe1rJ06cePWrX507kTl6whOesL+/f8011+ROZF5OnTr1jne8Y3o19ze96U133HFH7iwwU5dffvmHP/zh3FlgIqitAwAAoEDU3IEAdc09dyI5PetZz/rlX/7l3FkAA7nvvvve8Y535M4iva9+9asvfvGLuYSD4X3ta1+75ZZbcmcBAAAAAD2i5g4E2NraqqqKgQUBTMB1111344035s4Cs3PeeedRcwcAAAAwbYvcCQBjshpSZub93AEAAAAAAAD4UHMHAqxq7ru7uwweihXfo9smYMKLBgCAIOM34NraGt+/AAAAE0DNHQiwXC4Xi8Xh4eHu7m7uXABgILMtAPW04P2FTRt5tp879IbfSFK1KMfJ2LVC2TS7JwAAQOEYzx0IUz9GddXnHQCA7NbW1rgBCyWoa8GHh4f1ZrmauJpSv2rMX51dbnZOX020gwhxhCTlOEajxuK05t98o5yMr10hfqr1AAAAgP5QcwfC1DX33Ikgg6BTYvnV1Rl767l6dfZ5vpxGH/lHtwUAmBuhGL26D8P+ijG+3eyidvO/9heiHMfHF6f64ZedL3mj/h7aro9vvfW9HgAAANAfau5AmK2trYrHqM6ScUrs/Dvov8qXjPvHhQjJ849uC6M20mtLoXuiHdzI1tmuc9/UBBHCRidjRLCrgc33hibga0iz+L63YDKMuvDqD+ODtj933z5lTzSOG6Ep9aFOXjgw+t4S2pBxYAx6O2POAAAAFIKaOxBmNaTMzs5O7kQwKKNs1KwPCifVcrHJ95KzrdY04vLXZ6hvC6M29mtLGvrlUr6xNUjckuoXvLW/bcQnYuOCHGoJP/3Wi1uVro6cayPstd0RrQcAAAAYeIYqEGZVc9/d3eWsZuY0G4BxqlxU7zP7gkFpGWJ4wvWeAa4tadIQ2FennBer5OARFefWINFL2uVbRtmKflXrFx+oJdkwhCCpNryeNuC4b1VhHwx9CwAAADKinzsQZrlcXnzxxVtbW5zhQMM3vEP3gKkkzxBTEnFtqc90spl5V+7oHvczX28z5Ltu1Bz+qDndvmBTXw82xldp3lumj6NM1XkQWzv7ua91As2tOqJdTTL18g6wHgAAANATau5AsPPPPz93ChiHPupN/Q2yAUQr6tqSUZPqvoX3eiFhmKsUXXrIOmeY6sUVhLL3L+ceF3ErjO/ukIgmgpqWl6hZ3W5tNygl3/IOsB4AAADQB2ruABCjkGp1dBqF5I8JKP/aUhfOzq0JDbOk0WVB3+Jr0qYuDwAAAGC2GM8dANoZ92vHVd+UFSi7re5pKN9oZNh9kTF2hZRNM6YhDNrQh9K6vSsX33eY4qABAAAAYJ7o5w4AKhGFJHtk24iyuxAk9L711rFfU7WFkUoyGHfQRm4M99wxDXswmdYpccsYFKSPJU2VbVwCw6QNdOQ7FrG5AgAAYADU3AFASzNwrTzcqjACrGac1taXZJqxX40MqU3MzdivLUW0G/rG5mDxyiC5llTTij4B/eLblzqA4bEFAgAAICNq7gBQFqNWRekKAxv1tSVN8vqJ8hR9ZPmNQXF8ohMTXopYfAAAAABARc0dAEpjd4PVvEvoWUxpDAXi2tKE8WkCAAAAmDlq7gBQnLgBpvvIBOgJ15aCjGXBV3kWlRIAAAAADI+aOxBjb2/voYceOjw8fMITnpA7FwAYJa4t6Y1lwceSJwAAAAD0apE7AWCU9vf377///gcffDB3IgAAANBaW1tTPuc5SVvDNAQAAIDS0M8diLG5ubm9vX3kyBFjeAQAAICZGH7s/u4tDvnLTZ8qT0EAAACYGGruQIy1tbVLLrkkdxYAAAAFqcvZq9L2qo5cD/TffNWYvzq7Qu2cvppoBxHiKFN1Ju98NTp4Za0HzXIBAABgpKi5Awhwxx13PPjggy95yUtyJwIM56abbsqdAgCMQLOztlEEX43oYlSTjSnNGr1zerOOr4mjT9WO72tLqXmxoTmxuR5StQUAAIACUXMHEOCSSy45derUG97whtyJAAN56KGH3vjGN+bOIr1nPvOZb3/729/+9rfnTgRzdOWVV+ZOAZ00S8m+3tl2BdlZU3YO8xIx/Evo/Bmf4UxtHQAAYA6ouQMIcPz48aqqXvnKV+ZOBBjIfffdN8ma+ze/+c3Xv/71P/ZjP5Y7EczO7bff/tGPfjR3FujE7iHePVST3W89Lk5cPqvW6XgOAACALqi5AwAwR1ddddVP/MRP5M4Cs3NwcJA7BQwkSdlaKLh3iR/x3qDx3Lug3A8AADAB1NwBAAAAdGWMCdP6jFB7DJnm+ObNeYyhz5VxnIQHujajdax618Gblfp6PdSty8sFAACA8aLmDgAAACCYctB2oYjse6k5vXWkeLkJ35yhpe2g+VuTVK46AAAAjNQidwIAJku+Hzz0cWf6N/b94DUAADBJ0b9PAAAAgCZq7kC8w8PD06dPnzp1KncimfnOTiP6tbXSvLG/nmuch2OGuHgGYD4Ofyh3IgAAABg3xpYB4u3s7PzP//zPcrnc3t7OnUtZfGOSCmOVhj6azBlK0649sqoziDFn5R+OFpgG3/jF8sWzuEq35o29Xjxj/wUmL6JDAAAAAJAKNXcg3ubmZlVVe3t7+/v76+vrudMpiFHRXmnWuTr2SDVCGWOztrYrz288rs14vhnn6pgPLp4BGC/2bgAAAGTE2DJAvMVisbGxUVXVmTNncueSwdoPGX9rOB8dFvEAtFADNAFMhnOvXF15Wkly8cwOpWy3efHM9zTC+l1GkZ3hIwAAAAAA/aHmDnSytbVVVdXOzk7uRDJoFq0oYAEjxcUzAAAAAADSYmwZoJPV8DLzrLl3YRf1goakiB7jJeFTFhlnBtPgHKYJAAAAAABEo+YOdLLq5z7PsWUEdWm7WUk3hndojpkeGtkeKSKoXXn+usNvPbMxpLvdLjBPXDwDAAAAAMBGzR3ohJp75RlfonVOYx5l2ct4/GlEu63ThST1eQITwMUzAEmEPl05u4xX40a3rgAAAOBEzR3oZGNjY7FYHBwc7O7urp6nigIZj2eYISUPAAAgAElEQVTMmAlQLC6eAQilrE13f+RycnLmGQ8RynXFPToAAACFo+YOdLW5uXn69OmdnR1q7sXivBSYAC6eAeUz7kcxdlW7E7dzvzZuhXHOb7wadHyo732x57cnNpOp2zJedbYbOtaWEMSZkpy/vmkAAAD0YZE7AWD0VsPL8BhVAOjVYUPuXAA4rIrRK87nPRgvNee3B32S5zcK7s44PvUwU/bxxDmlbqIeTas5YpW+XR/fepPXj51/qnwAAADQHf3cga42Nzer2Q/pDgAAZsL5QAVnqbp1ilAXlq+u2eVpMeWu6mSEfui+t4Q25Ht2hQZ1dgAAgEJQcwe6op87AACYj+YgJ13uOzHe3qVenOv2l17bjVg/3AYEAABQCMaWAbpa1dx3d3cPDg5y54KJ4JwZADB2QTX0jB26e+obvhqIJlUyQij6tgMAABSImjvQ1WKxWC6XFcPLIJ3Dw8Nf/dVfve2223InAgCAVj3ieT3u+Wp685mfzX+b89fDpgfN72xX2R/cGap+e/OPqlHXNh5SGtquMhl5/fjyT5UPAAAAuqPmDiTA8DJIa7FYPP/5z7/hhhue+9znUnkHAJTJOUS7/WzP5hTjVfsl/fy+dpX3ijlntuP4MmxtV5+JrxVhuj5/AAAAZEHNHUhg9RhVau6yYrtcyfdrx+WseaM8w6te9apLL730X//1X2+66abrr7/+tttuK3PtAQAwmGYnbmrKAAAAKBY1dyCBVT/32Y4to6wFF3tuLCQWnbPmjfI8i8Xine9855EjR3Z2dv7t3/7thhtuuOGGGx555BFN61TnUY4+Lrb1egGvzItw3ecHpoFO3AAAABiFZe4EgClgbBmDMd6ocWJcj1Jqz9+c3hzM1De/8aozjjJPzXRn8hFNaNpd/f3/2bu7WEmy+yDg1ff7zuzMrPdjduNZZ72xEmAVRBIhwAa0SCjkAfxghCIQCciyH4hQQBEKBskIhTw4SDECFEsIwRMiCQgLJSAesBJbKFEiWeBEREYh2Mhx7J31zux6PDN35n5189DZoqY+Tp+qrupT3f37PYz6Vp865181t29X/evUv/b29vb29i4uLrIs+9znPnflypVqJKWQSpVnZSWINNCk0fxXdOR9FjvvfdyYFdvu/FZ/hcb2d+Dk5OTmzZsxLbf2YjbLa/rQje3jAADARpJzhx7s7+9PJpPpdHpxcTF/nuo2m1Qem1b7bvVFqcHsnUeBBdqXEu61/QRUM/UL42+l1FWxPGvMuPMlf/7P//lPfOITr776aql90/6pvc4BbVWvAGXBi1uli0BZ8yWlzv3E9xwTT3iTY5ZnT/4JirHkRbjSfqt2si4X4Y6Pjz//+c9HNr5x48agwbCpRvLbDgDAdtr25CD0YjKZHBwcnJ6enp6ebk/OvZjnakroVM94a5cEUtvhc+bSuiuYTtvqHH6Z0jSTyeRDH/rQT/7kT7766qtDDAFhxYs3xdeRF8nCHXbop+liWOd4aiPMKn9GxnMRLtx+vS7CTSaTl19+OXUUAAAAQ9mW5CAM7fnnn9/d3Z0/THVLNOXO2qqmzJYPad3NN+TTn/506kDYfAsvnnVIWzeNsnw/+buRF9v6/ZuQ9iLcoEMAAADQIzl36Mfx8XHqEEaqVcKubcJ9uJrOTf23Sh12vhqxs9PbA65HOMWVUenr4tnCUZJUYAcAAIDVk3MHelZKrtXWKC++LhVczssjxLevHTeLyMTl7YuZ9KZ4Wu2EcC3pyHHD7Zv2T2BcSKjHIidDX2yLH3c1F+F63F4X4Uii7Z0ug1plMD5xAABbS84dWFZM0fbSwkDZ91LN4oXtY5Y3iekncuimHhbuis7LA0HGxwkBeZa8VHw8fFGtdnkuz3a17afpYljTxbamfgJchIO2Ij8Og97p0tYqg2l1n5+PJwDAJpFzB9ZPbapuA2zqdrEWApd2Yq489XUFK/Cb39RV235i+o8ZN34UF+HYHqVrRaXfveoc88C1tzw5Xtu+9G6HL9DANcLaK1Vt72upBtO0XR2uEQIAMHJy7sD62dTT0U3dLqADF+FYO8Uke20tpjw/XnpRalC6p6S2fSnhXttPfKjFcauvO6heCQhs15JjAQAwQnLuwCZrun/cmS0wcv5MMVq1xY4W3gVSuyRQ5iX8EWiquRSpx1thUvUDAMCYybkDm8yZLZBzEQ56UZ0h3k11fvryIS2p9jkWAADQlpw7ALAVZNBglVqlrdsm3Jd8DuoyD0NeZtzIgfyxAgBYd3Lu0Ke7d++enp6+8MILu7u7qWMBAFidUr2X6jNC8wbz16VHlea1zuPb146bBTPjpQeZVhv3Msk977z6oNfqdoXjAQBgHcm5Q58ePHhwdnZ2enp65cqV1LEAAAwopmh7aWGg7Hv+OrJ9zPJAy7ap7Vbt2+6HDvEAADBmcu7Qp6effno2mx0cHKQOBABg09TOox+ofwAA6EzOHfp048aN1CEQKoTaSzFWhVYBIImhv399vwMA0As5d2BZY8tBB4Kplnztt/+Sse0Z6KCpxHCHpyP2cjHMRTUgRtPXvQ84AAArIOcO9Kz6uLDSU9RytctLC1s9VSyQHGzqoW2yr9pPKc7qI+Mig4e0anPNgQR029LGgctdrS6GuagGqZycnHzxi1/8T//pP6UOJMov/uIv1i5fl/g3xnQ6vby8TB0FAMCqybkDPStlyfPXpfxUYPn8x/m6rbJaxUR/tcPqW23V9l+KsxS/lBxrqvgJnb+ofo6aLm5V3woPscxFr3A/LqpBj65cufKzP/uzn/vc51IHwjq5uLh4+PDhc889lzoQAICVknMHOirm12IST6UpqLX599q1looyGEOP/cu4sWFK15Bq3youbLp41qTDxTAX1SC5v//3//6P//iPp46CdXJ0dHT9+vXUUQAArJqcO9BRMc8VmXhqSsnJW0EqbS+eRXbVSi81YWr7cVENAACA1ZNzBwZUSuclz1tV83q9PHQxcujkmw9VHS6eLewK2FSz2Ww6naaOAgAAxk7OHehfsfZxqSxDsU2pcemtDuWSSxWoiyUgimN1zi3W9p/HmQ9Uqj4RHz9sp14mudf246Ia9OtjH/vYxz72sdRRAADA2Mm5Q/9OT08fPXp0/fr1nZ2d1LGsQm2mqVo3JlzqPXJhh0hKy0ttWo2yMM6mytewdmKeodp0catt+8iLYS6qQVr/9J/+05/+6Z9OHQXr5/DwMHUIAACrJucO/Xv99dfPz88PDw+Pj49TxwIQJf5yVMzFrbbLY3LWLqpBWnt7e3t7zh0AAGAxx83Qv8PDw/Pz89PTUzl3AACANfXv//2//8pXvpI6Csblz/7ZP/t93/d9qaMAxk7OHfp3cHCQZdnZ2VnqQDZQU91ns00BAIB+/ct/+S8PDw9feeWV1IEwFp/97GePjo7k3IGF5Nyhf/Oylaenp6kD2UBy67DBXFQDAMbmb/yNv/HBD34wdRSMxUc/+tHUIQDrQc4d+jfPuZvnDtCK3DoAAAAbYCd1ALCB9vf3J5PJdDo9Pz9PHQsAAAAAsDpy7jAI5WUAAAAAYAvJucMgPEaV3jWVup6/FXg3oSECK3U4eUft0NV3axdWuwUAgBjrfhgZH/9abGn4pGmVkQBbTj13GMRWzXOfTCYDVWEerud1FNgVs9lsnEeQQwdW/A2p/rZU91ipjV+wGPn/YGlftdp7806a2offXcZwPafS+xZVPxTzF9X/7uKPxc9ddWG1WwCA5ByctPLw4cN/+A//YeooWFf/+B//493d3dRRJCbnDoPYqpx7VTFrk2deiqmiUtqoNpszX1ibAKpmefIOi8OFs0LFVapDNG1UfPx9jZtFZMFqk8sdem76Mavbz7XblT35vxCIp9vOKfXc43FzbdhbpXbzA/uk1b4KX30Z7trMaC9HdTboFrmIBQDA3KNHj/75P//n/+Af/IPUgbBmLi8vf+InfuITn/iEnLucOwxiXlvm/Px8Op3u7GxXEadAsruUlq22zxalbmvbz2azeeP561L+vSkrVFwlZrvaxt/XuFldBjxr3s+tlPZP00WLrG4/xwdT7bPHnVMNoLgw365WvZE9+Zs8f1F7faV2lepb4SF6vzi0sKuFF88WXjTqK86017FcxAKAtrodCDV9TZeupgdm2AROmjoEnz15fBJzXLGwZWQkpa2uPWoKxxwzdGCHV2MI97DNxzP7+/ty7rR1fn7+Ez/xE6mjGAU5dxjE7u7u3t7excXF2dnZ0dFR6nAGUTxGaToiiTlAWXi4E6+YO24KtWmVZQZtin/QcQMxtOq/Kc8emE4b7rz6bu2SHndObWrP9Nsl1V4dKb1VXNh2ynOri0ZtLw4t7Kr6um0/fcU5zutYLmIBQK3SF3Tt61Y/Rr4VOO6K/5YPTKkJHIfEt+wWSXUORIdd12r/LzMQQDw5dxjK4eHhxcXF6enppubcezwKGTo9OvRBUlP8a31w1jSVZmydOwheUszFsw5dtRK+BlNs0+riUFu9XAfqFueormO5iAUAtUrfgMUv/cA3Y/h7s+mt2rEWhtFK5NABnSMptekQSXjoDjHEdw4QSc4dhnJwcPDw4cOzs7PUgSQWni/Z1CCyn1Q6xD+o2mmwWXSiLT+IDxzUto0nfp/0lXA3G6WbgS6erUyP128GjX/Qi1g99u+zAwDx2uZ2ez8AGMJ4Am4ViQMYYGzk3GEoW/sY1VlzrZVibrdY7mBh++Ly2v4n75QXjJleWlqlOu7CTYuJv8dxi7Na8lVmlRIZ/SbLavsvxRP+T8me/H8pvm4Kfpmd0xR8TJykFXk6N8TFoVYtU13EylZ1HctFLAAYQungdvlEdrce4o+E4wMeOinf+65rOy4LbfaBYnVeS2ljW526Rg602bt0q8i5w1Dmj1Hdhpx7TN2D6luRt/7VvhseMXKIbl9jreLva9ymVWq3utsoC0Nd2GHbHsL/ZYFRIu8bjdlpRY5sSgKXWBZeBGrbfpmLRoF+asctrlJsH4i/F22vM6W6juUiFgD0a4iDzM4dhrOH4eX9RhIj4fG5oxpqVRPuQ/yq+PXbGHLuMJSDg4PJZDKdTi8uLvb2fNaAUYu/bNP2ekaHi0athm7qp9XFv8j2keLjXOai3fLXsVzEAoBljOT7biRhZEkjGXTo8exhYI3spA4ANtZkMtmeqe6wMgMd7zqMBgAgoHSDV7c8bNuSetW1OofRrV5KYK1edki3SAYdesXbtV4m72haXvsLU/tufjvmwj6zyu9hYKxA5PHDVVcpLqntcGFvpeWBgSJ7W7hFYbW7t7bPQP+dR98S5t7CgA4ODk5PT8/Ozq5evZo6FqI0fVUMfZiValxgy7mIBQDxSsXc2q5S/TF+rKZOWtWBKXWSv540Fwyszf7XFpobooROIJKVDe2oJjeJe/ZP/I+Rb1VzzU09xMcfszmlW0JLiu9GRtgUQHigzrs6IH73DjH69pBzhwEdHh7ev39/k+a5P3r06Ktf/epnP/vZ1IEM5Zd/+Zdrlw+9yanGZaF79+45dFgZF58AgJGrHpYsXNL0Y9sVI98KWFi5LhxG5OqtYujxx6aF1fg7/CdSyqgW08SBfRXOw0ZWKSxeAgmEsVCr4Tr/AjT11q3PcGzdggzs3mqf8XvGR6ZKzh0GdP369aeeemp/fz91IL35jd/4jc9+9rO/+qu/mjoQWJHpdLqRN8o9fPjwF3/xF3/nd34ndSBP+Jmf+Zna5Z/61KdWHAnD+dKXvnRycpI6CgAYNRNIGb+Y38nq7RRbqHplYmt3xbaRc4cB7e7u7u7upo6iT+9///u/8zu/85/8k3+SOhBYkTt37rz88supo+jf1atX/+t//a+//uu/njoQts6DBw/UWwOAsPDM0yaBRN4qU/YjCYORKFXpWT7dvL4J6953RVrd/kxtFTl3ANhGP/MzP/Pn/tyfSx0FW+dXfuVX/vbf/tupowCAseuQwBpJzmskYTAGQ9yisaa/YBt5t4rbccJ2UgcAAAAAAKyNkUzTHkkYAeOPkIGY5w6088/+2T9rqrkMm2c2mx0cHKSOYhD37t178803U0fB1vnmN7+ZOgQAANopPT+z8xNBu43VbxgLh1umz8jeOu+KIbY30DgwuontC8m5Ay38nb/zd/7m3/ybqaOAldrIiQlHR0cf/vCHU0fBlvqe7/me1CEAANBOsX53ZLK1WvK7Va55YSd95XwDfc6XtxqotreFu6JpoBVsb/gZDE2jq+e+kJw70MLh4eHh4WHqKIBlfeYzn0kdAgDA2H3961//2Mc+9lM/9VOpA2EsvvSlL12/fj11FMnUZoTDS5p+bLti5Fvxq8QM19e2LOyt6XV8b03NmkT2Ge5Wnj1Mzh0AAACg7N3vfvezzz77nd/5nakDYSxOTk428i7YUVHDZFB278rIuQMAAADU+KEf+qEPfvCDqaNgLG7fvv3e9743dRQbrlvRknCBlB7CWhML94OaMCsj5w6De/Dgwb1795566qkbN26kjgUAAABgvHqpHrOdYvZDfDn+pcPZajupA4DNd35+fnJy8ujRo9SBAAAAAADDMs8dBnflypUXXnjh+Pg4dSAAAAAAwLDk3GFwh4eHh4eHqaMAAAAAAAYn5w4AAADQ3WQyaap9PH9cYYfKyDErBsbtpT1b6+HDh3/lr/yVj370o6kDYf185CMfuby83N/fTx1IYnLuAAAAAIs15awDiezZbDbPnrcVs2LbBHp8e9n5Lbe7u/tv/s2/+emf/unUgbBmLi8vf+zHfuxTn/pU6kDSk3MHAAAA6CJPi5cy1E3Ls/Yz32u7ihm3OFCgk1LLfHlgE9h4R0dHe3t7P/qjP5o6ENbM+fn5j/3Yj+3s7KQOJD05dwAAAIAuShntueIk8W6T3Ju6yl9HjhtuP8+252vlL+bLpdoBOpNzBwAAAGhUTFW3nf1dLRHTKpfdOfEdX9NGbh2gd3LuAAAAAI1qZ5oDQBPldQAAAAAGUZ1sPi/n0nn1oVcctCuALWGeO6zI2dnZw4cPDw4Orl69mjoWAAAAepDno4v104t1XUo109v2XOqq7bjh9vmzUvPGpZLu1XGhKvDr3faJwa1WbPuxcp8KqyTnDivy4MGDu3fvXr9+Xc4dAABgHVUTdk0pvOLyUpv4QvCB9jHjLlweCDI+TrZHU8468KsS/1yBDiu2/RWNby87z/Lk3GFFDg8Psyw7PT1NHQgAAACbqZimlDQk7Ktf/eov//Iv17517969mN+fppshAjdJtJ35Hr7PIzBu9ZaO2k5KLbPC/R9NmwAx5NxhRQ4ODrIsOzs763yZFwAAAALkB4l069at27dvf/zjH6999/z8fDqdLuyklNGeK04SXzL7UeqqdPPHwnHD7Ut1n0qFlXyUWJKcO6zI/v7+zs7OdDo9Pz+f598BAAAAVu+Hf/iHf/iHf7jp3Tt37rz88svz17UPBogvkVTNdMcH2TnxHT/ZUW6dgeykDgC2iPIyAAAAwBqZvaP0GgiQc4fVmU9vl3MHAAAANl51svm8nEvn1YdecdCu2Cpqy8DqzOe5n52dpQ4EAAAAYCl5PrpYP71Y16VUM71tz6Wu2o4bbp8/KzVvXCrpXh0X4sm5w+qoLQMAAACso2r2uSkfXVxeahNfCD7QPmbchcsDQcbHCU3UloHVmdeWubi4iHn8NwAAAHQQqIbRqrJHh/4hoUmBpDlpybnD6uzs7Ozt7WXKywAAAKyh4epQ95vFDmQbe0lExnciO88qzQpSx8K2U1sGVurg4ODi4uLs7Ozo6Ch1LAAAACyllFMu1YkuLqy2z5e3bR8TT6lxoDh1scJ1t/5Lpbdjtgtgs5nnDiulpDsAAMBmmNevqM6rzR/DWFpeal9KRse3D6id4VvsZ8mJ57X951caIrcLYOOZ5w4rNS/prrYMAADAuijmqYsJ5VIKe2FauUPKu/faLNUY+sqGy6oD5OTcYaXmOXfz3AEAANZFsVhKKbNcnZYe6KfUIHLeertYARgBtWVgpea1ZS4vLy8vL1PHAgAAQHeRk9BrmwXWHfS5o9XOJ5PJap506nmqwPYwzx1WajKZ7O/vn5+fn52dHR8fpw4H2F5f/vKXf+EXfiF1FGyvv/gX/+LLL7+cOgoAWFZTbZlqWfPqwnmyOy96Hm5fHSIcT/FxpoFx26rtP39Waj5QeLtgHbV62nB8n7X3vjQ9A7n0btPfn84fcHok5w6rdnBwIOcOJPfFL37xk5/85F/4C38hdSBso1/4hV/47u/+bjl3ANZOoLDMwsbVhTG9tU2cNbVvO26r/gOdt+2fMdvyTO7yjyAOK+7ecBmr2jZb/r8zQnLusGqHh4cPHz5U0h1I7g/8gT/wL/7Fv0gdBdvot37rt1KHAADAUvJ539UJ4NX518XG+ZKF87Wz6NnlpRniTT9mlUnitbdilO4LWRhS2/7zBuHrVZ3Vhs2KybnDqs0fo3p2dpY6EAAAAIAuSnWKapPp+Y/FxqX8ey/ztUv9NCX3s0rho9qUeu3FgNK7nftfqHYVNZrWjpw7rNo8535xcZE6EAAAANZMU3ULmTgGUvyVq33qQKl9oAZL01qBmi3xv9hNefZwTZi2FaJabe/C/qtqE+5qyKwjOXdYtYODg1deeWVvz6cPAACAdqTbWLFAkfFaTc8FjRliCB3iSdW/fPom2UkdAGydyWQi4Q6sl0EfFjRmA234cN322/PyvW3tbw4AAFlPx5PxnSws59Ihnlar9JVwr723gPUi8QcAsPZMigEAYJXmueBiifZi6fZ5mzwJnq8SU/ul38Pa2niKMZcGLcVTyoNHbm+g/4Da9HpTPE3LGQk5dwAAAAAgpJTVLf4Y/1b2ZNa4qU1g9VZBBuJpO2jb7V0YefW5r63iCSw3HWcM5NwBgCc0zcUIT6NomgwSnn9RmhJSWwkx8nixunr4x2rnpWhrx6295TOmk0C3nYMp9TD/N9+TpXU7BFDsc2GopQ5LU3sc9AMAANtDzh0A+P9KOeWmJybF/xj5Vuk+ykAPy4vfrsgVF3bSbUvjN7z2isWS/yPhPgMt89fVHgCAzbawjvaSBwYOLdgwA/0++5iMgWeoAgC/r3QaEznPOnzyE3nDYyBfXK3w2DRQqVJktXDkws47JNwXdtJ5S5c5Vo4cJX5XLwy1WNSyc9gAMHIxxyRpe27bT79b1GOFkCU7Ge5/CiCGee4AQKOYE5vami0bRioZAKgqFnbLmg+KSre7Fcu+FV8v86zFhf0E4olvHxNPoJBg7SrxVQSbgqzu/w77k5Kzs7Pz8/Of/MmfTB0Ia2Y6nWY+dFmWybkDAMtrKh2+fIfd1u23tsmgFxJWc5UiMEp8AOGWKskAsIXmX3/5N2D1xVzp4KS4erGfVpO4a/PjTf2E44lvH1B7EBgor9dWbf9N+99hyfIeP348nU5/6Zd+KXUgrJn55+7y8jJ1IOnJuUMaJycnb7311sHBwc2bN1PHArCUIU5pxnOO1HTy3JfVbGkvN3qHW+b1fMbzfwcAfSmmequzp2u/+5pSzLWT4ttqW48uslJfUe/TAqox9HXM4NhjCNevXz88PPzc5z6XOhDWzPn5+cHBwd6ehLOcOyQym80ePXo0v+kGYLRGkkJNGEbnCWjdrGZLw883i7/Fewy/GwCwAk3PdIlZZSCt5qE3zYuP7B+AtuTcIY2jo6MXX3zx6OgodSAA/18prdwtqRo5K6o61vJhVNPiC5d028ZWnQyxpX1FGx9AuKVbuQEgUswtdG1z6K2ahSvODfclXh13+fn+8UM7OOlgNpv93//7f1NHwZq5uLhIHcJYyLlDGru7u9euXUsdBUBZ8bbfVpnuph/jx2rqZIjCNd06LyaUW3WSaktjRgkHUDwZbmq58KpGbc8AsAHyZ3Xm35Lz1011VALlztseEjTVlqntp3ooEj6k6VAHJm8fOHgojttWbf9N+79pu4g3mUyuX7/+/ve/P3UgrJ8XXnghdQijIOcOADyhelqycEnTj21XjHwrICb4+IXhJfE9h1ds1U+TzoEF3uq8MwO/AACw1gJf4m2/3yO/Z2PCiHl3lYciy4zbqv++9idVzz777O3bt1NHAWtsJ3UAAMA2CszzAgAAgPVlnjsAkEC1xErMWoGqNZudst/aDQcAAFg7cu4AQBodksVbm1/e2g0HgK3VdMU91VHB2OIBGDM5dwAAAICyD33oQ5/5zGc+85nPJBn9R3/0R2uX/62/9bdWHMnc2OJJ4sqVK1/60pdSRwGsATl3AAAAgLL/+B//461bt1599dXUgTAWn/70p//Mn/kzqaMA1oCcOwAAAECNv/SX/tIHP/jB1FEwFr/zO7/znve8J3UUwBqQc4eUHj9+fHJycnBw8NRTT6WOBdguX/va1/7H//gfr732WupA2Eb/83/+z9dffz11FAAAAIOQc4eUTk5O7t69e/36dTl3YMVms9mNGzfe//73pw6EbfTlL395Op2mjgIAFvsv/+W/fPWrX00dBWPxv/7X//ojf+SPpI4CWANy7pDSwcFBlmXn5+epAwG2zksvvfS+973vp37qp1IHwjb6lV/5lVu3bqWOAgAW+IEf+IEvfvGLn//851MHwlh813d91x/6Q38odRTAGpBzh5T29/ezLDs7O0sdCAAAAE/48R//8dQhALCWdlIHAFttPs/98vLy8vIydSwAAAAAwLLk3CGlyWSyt7eXKS8DAAAAABtBzh0Sm091V14GAAAAADaAnDskJucOjN9kMgm8FXg33OfCFdv23C0SAAAA6JGcOyQ2f4yq2jLAGDTlrGezWdMqgbfCYlZs23l8e9l5AAAABrKXOgDYdua5A2OW56ZL6eym5flbHdLfxVVixi0OFOik1DJfHtgEAAAA6EzOHRKb59zNcwfGqZTRnptMJqX8dWelrvLXkeOG28+z7fla+Yv5cql2AAAAhqC2DCS2t7c3T/1IuwOpTN5Reh2jmrmezWbx6aKlbXgAACAASURBVOxBS9MsOQQAAAB0IOcO6ZnqDqQ1e0fpNQAAANCWnDukN3+MqpLuwDqqzohvNU2+c2maHh+C6nmqAAAA9Eg9d0jPY1SB0crz0cX66flTSbNKzfS2PZe6ajtuuH1eLSdvXCrpXh0XAAAAliTnDumpLQOMRG1x9oUtS20iU9ilx592GHfh8kCQ8XECAABAK3LukJ7aMgCRinPbJc0BAAAYITl3SG8+z/3i4mI6ne7seMoCQCN5dgAAAEZOdg/S29nZ2d3dzZSXAQAAAIA1J+cOo+AxqgAAAACwAeTcYRTmJd0vLy9TBwIAAAAAdKeeO4zCs88+e/PmzeKzAQEAAACAtSPnDqOwt+fDCAAAAABrT20ZAGBYk8mk9/t4huiz2Hnv48as2LZnd0cBAACMkJw7APD7BsrhzmaztegzpvPO48as2Lbz+Pay8wAAACujnAUAUC9P1M5ms+Lr7Mkcbp75nS+sNq522Lmf+J5j4glvcszy4ijhnsNdxYxbHCjQSallvjx+JwAAALAMOXcAoN48eztP0RZf5y/mSm1K7zZ12KGf0rq1y1vFUxthVpkV3jRuB02bHzluuH1pe2v/70bi8ePH/+pf/atf+qVfWvG4Z2dnKx4RAADYQnLuALDtSvnr+YvaLHaMppZt54OHWxZnr2fBVHi/uebSuG37X6Y0TWS6f1S59SaTyeTg4ODw8HDF4x4eHn784x9f8aAAAMC2kXMHgG3XNPG891GGqyq+FolmcoeHh3/tr/217//+708dCAAAQP88QxUAWJEe0+6pHgpaHXdezqXz6kOvOGhXAAAAVJnnDmNxeXn55ptvXl5e3rp1K3UsAL8vLwVeKj4eeGZp4MGnxR9ns1nbfkpPQ81rlzfVe+nw7NC8cbESTtO4C3ur3erwM1TD44bb59ubNy6VdI/fDwAAAHQm5w4jcv/+/Wzg8gsAAbXZ2DxpG9kyvHyZfgJdte0npv+YceNHKT3+tMO4C5eHd4hUOwAAwGrIucNY7O7uPvvsswcHB6kDAWAsau8DAAAAYMzk3GFEnnnmmdQhADAi8uwAAABrR84dANgiTcW7ZLcBAADohZw7ALBF5NYBAAAY1E7qAAAAAAAAYEPIuQMAAAAAQD/k3AEAAAAAoB9y7gAAAAAA0A85dwBggck7qsvbdtLt3fhxW/XToX8AAAAIk3OHcTk9Pf3Wt751cXGROhBgG9XmmieTyewdpbeqSwLCjfvqqlU/y3ciOw8AAECJnDuMy5tvvvnGG288evQodSAA/3/OeHWee2Dme9NbgSFazXAPjxvYis79l/ZDcXmHTQAAAGCzybnDuOzv72dZZp47MAb53PbqPPfaae/FGfGz2WxhGrrYPjJnvXDcJXPfgen8+Sj5EE07BwAAgG22lzoA4Al7e3tZlp2fn6cOBNgi1bnbWdciLZ1T3suny5v66SsbLqsOAABADDl3GBfz3IHVy7PJ86ncvXQFAAAA20ltGRiX+Tx3OXdg2/RVD72p1HsvnbcdGgAAgC1knjuMi9oywHjkSeRqwZnSW3ll86a6Lgvbz18vnGjfVz+t+s+flZoPlPdfLe8OAADAlpNzh3GZ15aZTqfT6XRnx50owEqVssaBJHLTW8ssj8lZd+inVSq8tnE4SKl2AAAAimT0YFwmk8nu7m5mqjsAAAAArCE5dxgdj1EFAAAAgDWltgyMjseoAtus6UmkSrgAAACwFuTcYXQ8RhXYZnLrAAAArDW1ZWB01JYBAAAAgDUl5w6jo7YMAAAAAKwpOXcYnd3d3SzLLi8vUwcCAAAAALSjnjuMjpw7MDb5c01LxdYnk0l8+fV5J03tw+8uY7ieU+l9i0r/j4H/7uKP+bvF5aV+Nmm3AwAARJJzh9GZ59yn02nqQICtU5skDWROW2VUZ7NZKWkb/+4yhus5lUG3qPjfXf2vX/jrIc8OAAAg5w6js7Ozk2XZbDabTqfz1wBJ5Ind6sTnmKnQMbnXpn4Wtmz6Mb6r4ooLp2xXW/YYZ95zeD9X09nVkNr2n1Wy5D1mzGtjBgAA2Hhy7jA6k8lkZ2dnOp1eXl7KuQMJ5Wniatq0mkGutlyYby1NqV4YTLF98ce245ayz8VLC8tP2e4Q57xNbUo9sH+q3bbtP6zppod8u+K7AgAA2Cpy7jBGu7u785z7/v5+6liAzVfM5y6ZVO1c8ySmXkpT/rrHWivh6jeRnXSLc+F1gpglvcSfBS+0BBoAAACQybnDOO3u7p6fn3uMKrAagfrdnbtapaZHgHYwaPw9xjlo//LpAAAAy5BzhzF65plnZrPZ0dFR6kAAViQyQZxP5W5KCrdNNMe3j6znPtd7nFnLVHgvCffw81QBAACoJecOY3T16tXUIQBEPUO1mFmu1jaJb9+t5nhx3dp+asfNnsyJ5+0D8feiKc75wupOLsVT2pmldUvxx/TfpDZf3xRM03IAAICtJecOAPy+UsI0kD9temuZ5fFTyOP7idmEtu0jxcfZdtBAwG37z+oe+toqmMByU+MBAIDttJM6AAAAAAAA2BBy7gAAW22g2egmuQMAANtJbRkAYESaHv4pgQsAAMBakHMHAEZEbh0AAIC1JucOANvoC1/4whe+8IVnnnkmdSBsqd/8zd/8/u///tRRAAAA9E/OHQC20Xd/93e/+uqr/+7f/bvUgbCNPvShD7366qupowAAABiEnDuM1MOHDy8vL69du9ZU2hhgGfv7+4eHh7du3UodCNvo4OBgf38/dRQAAACDkHOHkXr99ddns9mVK1f29nxOAQAAAGA9yOXBSB0fH5vhDgzqv//3//6BD3wgdRRso9/6rd9KHQIAAMBQJrPZLHUMAMCq3blz5zd/8zdTR8H2+t7v/V6P8AUAADaSnDsAAAAAAPRjJ3UAAAAAAACwIeTcAQAAAACgH3LuAAAAAADQDzl3AAAAAADoh5w7AAAAAAD0Q84dAAAAAAD6IecOAAAAAAD92EsdAFDvwYMH3/jGN46Ojt797nenjgUAAAAAiGKeO4zX5eXldDpNHQUAAAAAEEvOHUZqMplkWTabzVIHAgAAAADEknOHkZJzBwAAAIC1I+cOIyXnDgAAAABrR84dRkrOHQAAAADWzl7qAIB6cu4AwIb5yle+8vnPfz51FKyfP/Wn/tSLL76YOgoAgFhy7jBScu4AwIb5b//tv/3dv/t3v+/7vi91IKyTX//1X//Zn/1ZOXcAYI3IucNIzXPuAACb5E/+yT/5H/7Df0gdBevktddeSx0CAEA76rnDSJnhDgAAAABrR84dAAAAAAD6IecOIzWf567CDAAAAACsETl3AABgw63LPIYVxxk53LrsPQCAkfAMVQBgo3ziE5/4+Z//+dRR0L9//a//9R/9o380dRQAAAALyLnDSKktA9DN17/+9T/9p//0D/3QD6UOhD595CMfefjwYeooAAAAFpNzBwA2zbd/+7f/iT/xJ1JHQZ+uXr2aOgTWST5rYT6Jobq8+lbTu5PJZDabBVYsjjVvvDCMcNjzf4sBNI1bDKw0XaMURrVlIIBSs1ZRAQCQybkDAACbpJj4bnrd6sfIt0q3JwZ6aFKbtQ90Uh29bcxNvRV/bBsVAACeoQojpbYMAEBbpRRw/PzuwLtNb1XHigkj3sJOSoFFbkJtMPGp8142DQBgs8m5AwDbaN2TREPHn/c/6EDr/r/AWoicYJ6/nkwmW/ibaQ8AAPRIbRkYKfPcAQhQzAH61VQYffkOk3fSdqyFe8ABKgBAmJw7jNRkMjk4ONjb8yEFABjWEEXJe+lwZVfXWu0B1/wAAMKk82Ckjo+PX3755dRRAGyIpoLOxdma1SxS7bvzzFRgxeJY1QcPNo3VNv7qMwy7dR7eA5HBtHore3IWbfXBj62CgYVG8pDPXsIYybaUjDMqAICE5NwBgA1XTU9XX7f6MfKtUvmFQA/d4l++8/Amtw2m7b6tvSbRbRdBrvR71e0XKbJ2SnWsfsPopZPqupGf9BVEBQCwqeTcAYBNVsoHFbNFgTxROIvU9FbtWAvD6Bx/U0iRnXfIlAWCiX+rQ+fQSofbPqo3r7RKuy/spMPdJ/mfqV5u/ljYz8I9MERUAACbSs4dANguMRmi2oIwI9FXhmvobcz7H/POZFOFr0vVLmn6se2KkW/Fr9LUSWT84X5KF7oi3wpEBQBAJucOAFCrNItz+WTxCNPNvW/jkgONcBdBQIfqTAAAbAM5dwCAsiFyZ2NLxq0sPxg/0Nh2EYRV67HErBUuld5DWAAApCbnDgBsl5HMRe0cxkjiX2j5ONdlS9lmvVSPGZrPEQDAiu2kDgAAYECliajd0rgdnqZYWqtzGJErrmYbA8HEb2DTQL38TwEAACRnnjsAsOGKydxume7Sj/FjNXXSKpscs+LKtjEwUNNb4YHmr+ftO+8iAACA8ZBzh5H6vd/7vel0+uKLLx4cHKSOBWDtVRO4C5c0/dh2xci3wjrE36HbUqK8w0CBSwK1P/ayFQAAAKMi5w4j9fjx4/hplQCMQakciuooUPLGG298/vOf/+t//a+nDoR18tu//dt37txJHQXb6//8n/9z9+7d1FGQ3pUrV/7wH/7DqaMA1oacO4zUe97znouLi709H1KAtVEtohKzVuDy6vLPIB2oZ+jm3r17s9ns4uIidSCsk9lsdv/+/dRRsL0+/vGP/+qv/uq73vWu1IGQ0snJyVNPPfUbv/EbqQMB1oZ0HozU4eHh4eFh6igAaGf5Ai89Diqxzth813d91x/7Y3/s3/7bf5s6ENbJa6+99sorr6SOgq32j/7RP/rwhz+cOgpS+rVf+7Uf+ZEfSR0FsE52UgcAAAAAAAAbQs4dAAAAAAD6IecOAAAAAAD9kHMHAAAA6Cjw0PJRWXGckcP1EtW6/BcA28MzVAGAjfKud73rU5/61Kc+9anUgdCzL37xi6+99lrqKFidyWTS9BzgeW5lyacEB/oHAIBlyLkDABvl7bff/sEf/MGPfOQjqQOhTz/4gz/4vve9L3UUDKIp9x1IiM9ms+WnNMYn3GXnAQBoRc4dANg0zz///B/8g38wdRT06ejo6PDwMHUUrEieTy9lupuWZy1nvtf2k/dQ6mr+Y2BoYNss/BtVfavp3fklvcCKxbFK1//a/l0q/jUr/YmrHbcY2Pzdpj+e1ZaBAErNWkUVuWnVC6X5koXR+msP9EXOHUZnOp2+9dZbBwcH169fTx0LAMCqlZI7c8UcypKT3Gv7n2dhSnmZrCF9A2yt0t+i2tetfox8K/wnMeZvVG3WPtBJdfS2MTf1lgX/xvayaQEddj5AB56hCqNzdnb29ttv3717N3UgAABDmbyj9DpGNQ8ym816SY7IsAABpTxs/PzucLGsyLFiwoi3sJNSYJGbUBtMt4R4U29Laup/BUMDW8U8dxids7OzLMsODg5SBwIAMBRzCYENEDkLO3+9nWncFe+B0rR33zJAEnLuMDpy7gArEzgNa1Ueuu2KbU//nC5CUe0kymwls9R9GIEOmgqjL99h8k7ajrVwDyS8LLGdV0SAgci5w+jIuQP0rilNFr5RutupV8yKbXN28e0lBNkAxTv9s3d+/0s1HIq113vpP69ykw9UKjecD919w4CtNMRX83pV02q1B/qNqtWxnL/wQI/k3GF05NwBVqApgxbIrLWdSFvbVcy41TxgbSelllkhadi0CTBCtcXZF7aMLzQcM2K487b9A9tjJJe6ewljJNtS0i2qYnmZzhs1zh0CrAvPUIVxmc1m5+fnmZw7wMBqn7g4P7maW/L+4qauIsfN29S2z9Pxpf7zc8vatQCAZZS+07vlZCMPMKpj9RtGL51UY4vpJ7AHeowqZvRi/ysYGtgq5rnDuMwnue/u7u7u7qaOBWDt1Z6sRp5BVdPuy0+k7TZu70MAAN10KDZVvfreIe0e6KTV8UCgZld8J+E4ww2qP/YVVXXWQm3ePNC/SmJAj+TcYVwUlgHoUbHoinMnAGB5MeWnwvWvinnhVitGvhW/Skwtr5io2tbs6r2cV18TIxwuAn1RWwbGRc4dYCSqc9Dmz2zsvPrQKw7aFQCwStWZ4NLBrdhjQFrmucO4PHr0KMuyo6Oj1IEAbLj8VDZwO/M8yd72hK30gNPsyTlTkeOG2+fPSs0bFx8U5rZoAFh31XosMWuFS6X3EFY68ZvW9qH3AEOQc4cRmc1mp6enmZw7QN+63Uwdf393bbOF91l3Xt77HdkAwNgMXWKlFysbMX4gpWOAMZBzhxE5PT2dTqe7u7tqywBsmw5z2QAAABghOXcYkcePH2cmuQNsJXl22E5D1EAoFcVqqjdVKtRQfOh0dWG1WwAAmsi5w4jMc+7Hx8epAwEAWJEtz+SWSjb3rrh7q7u6uuer+fpt/t8BAOhGzh1GxANUAYAtV3oKce187Xx5sXG+ZOF87Sx6dnlphnjTj1llknjt04xLj0peGFLb/vMG4Uc+dFYbNmy8b37zm//5P//n119/PXUgpPS7v/u7Dx8+TB0FsE7k3GEsLi4uLi4uJpOJnDsAsLXmid1qDr12/nWxcSn/3st87VI/Tcn94o+l+GsDqE5sj9zeQP8L1a7SlLgHck8//fQXvvCFN998M3UgpPStb33r6tWrqaNgWdXv36ZL3U2qF92bems1dIzitfn4UCNHDx8PRB4tNNWsW2iIOntjIOcOYzGf5H54eDjo/cUAAGNQPOCpnstVz7sCNVia1gocU8Wf1zXl2cM1YcL9125d7bjd+q+qTbirIQOR/t7f+3sf/vCHU0dBSr/2a7/2Iz/yI6mjYCm136r9fv019baCoQNajd50H16HURxayLnDWHiAKgCwPQJFxms1PRc0ZoghdIgnVf9OegHYcrUztecLi3eSVVcJfIHWtg/krANDtxUf6hCjRwYWeVveBs863UkdAPD75uXhrly5kjoQAIBRW/70bH4eGNl4YTmXDvG0WqWvhHvtvQUAsNnylHT1QeLxpVoWanWL24qvhQ89erfiMK0OxtaRee4wCtPpdHd39+Li4vj4OHUsAKy9hcnBJQ+1TZtlOMW5V8XXpaeGFs/TImu/9PtLWxtPMebSoKV4SnnwyO0N9B9Qe0LbFE/TcgBYR/GlUdLmwauH6INWOa/ttjrJII8hvBuXCXJh5+tLzh1GYWdn5z3vec90Ot3ZcfcJQP+WP4xeryxz+DbY5Y9rWz0TaY32G0kE5l7Fv5U9mTVuahNYvVWQgXjaDtp2exdGPqs897VVPIHlPs4ArKmhj42zRcn9tN+h4/wGH2FI/ZJzhxGRcAdYmdIE0traC9WJqKXlTe2r/efvBvovTWut7SRbdHja1CyweqtJNIGdUNrSLLjfAGDDuMkMtkrTbWTVJTGHxIHJBMvododcX7b8T5acOwCwdQIFjkup5Nk7j1SqPdFtal97S+bC/qtDFMdtiqGkmtkPbG8Htf2X4m8bM9CvVd6HDluo6avNTWaw5cI3kBVr4gUaDxTVikff1HIxrci5AwAbq5RPn78IV29oe4C4sH18n6s58q7G09e4Tu8B2E5uMoMtVDvDJr79iq+NRY4+qzxCpkOQK76oMFpy7gDAxioeXMYc9lXnoccPMZB8qrg5awAwTm4yg23WdMdqoH2WZa1W6dHQo0u45xSPBgC2Xe2ZcOD0uNWZ89jurKzGMz/mTjI0AKyLyTtKr2PUVmruq1jz8p3AxuvrwL7tKCs7zK61+tEl3IvMcwcAtk6pvkp+XFh6VGlxAkjtU0yb6rRU+wmPG74NvNWEtdpajYHtaqu2/+I9qqX7VWv3GwCsnbY3zwFjEFnmcckPdS/PbFh3Eu4lcu4AwOarnV+2sGWg8nurfjp30kFf29Wq/0DnbfsHgM1TO/s1W8lXpCsEkM84yeoeipD1+kksfeIWDj2obqM3rRUm4V4l5w4pXV5ePnjw4Pr1666IAmyY2vnsS/YDAIyQm8xg5Iofk+pb/Q7RJDx0U2a8r/CG2/Cs8jeqdpQtTMrLuUNK3/rWt+7cufPgwYNbt26ljgWAPvV4+N5LP8B2GuIUd9LwuOnSKLWlt5quR5qKyxoZ7ua5+BHDnbftH7ZBbU58oIeIVj+etd+JK5B29C0n5w4p7e/v7+3tXbt2LXUgAKyNphk0jp5ZU+NPto4/woChK8wWd051R1Wz8PLsAKSy/LWu8FsdVgk0iL9Q16HztmOFe4jZscvEv6bk3CGlp5566qmnntrUvy8ADMG3BhuvVI2hdFdy/lZWmMSdNyuWWagub+qn1FV1ee1U7sCsscjZ5aVum34MxFl9K6vst6aQ2vafNwjPru2mNmYAgDUl5w7pqdULADDXlByvnSJdLJFcyrMHltdOtS5VWy4tr+aCm+qrtFLqvOkiQSDOhfut9G7n/hdq2kv5prXqDQBgrcm5AwAAq1bKp89fdKt3XMxZxywP5MfjU8Olmi2dKzU35dnDNWHa3uJdu6SX/TBXm3BXRgYA2Fpy7gAAwKoFioCvbOge++l9K3qZR7+a/uXTAQBKdlIHAACQzLpU9wrEOa8CMVz/kNbYfjnzeMKBtfpgLizn0mEntFqlr4R77b0LAABbyDx3AGDzNSWzVj83s9uE0MAq4QIRy/dfYkIrQ2uq2VK7PH/AabVYee3yaj+1XZVWb3qgaKC2zPJKg5bK01fjadpvTdvVtv+A2j9BtfGEC/IAAGwMOXcAYBtVM0qlBy1mlfxd8WGM1X6alpc6rB26VZzh5cVoF3be1E/T9naIHxaKKT4e0zK+qvvCK3CR9dBrg4x5N7J9zNZ166Rb/3mD0jWMzvEUuZ4H66LVYUZ8n00HUdWhc7U32XiSBDAScu6watPpdGdHWSeAxIpJ8HxJaaZnnloqVX6onTzbtLw6RKvTv2qcgf47qO2/aXs7xA8AG2bLvwp7ucEuoHSQE7hYWNtmy/93gPGQc4dV+73f+729vb2bN2/u7fkAAgyrtrhw5OzUyImuC087hz7xayqU0UvPvfQDbJgh/jj4g8P6anUzXOCmutr21VFigskq19RrpxrUxl99K2u46B5581+g/7xB+E6jzswV2B6lm0pLmqaqBK7u1C5vuj10lb9jkaEyBlJ+sFIPHjw4PT09Pz831R1gBRYeSS+p6UAcANgSrW6GC9xU18t87Wr1p4U355Xirw2geoQTf/NfU/8L1a6iwB1hgYP/hb/k4VpG4cartDDU9bVhVw7k3GGl3nrrrSzLnn76aTl3gA0TONgddEJK7WlwtpJz0Q07LAaAgPDNc61uhmtaK3AsEf+F25RnD9+cF3kXYHhJL/HP1R5jqCFDKtW7MfwGspCcO6zOw4cPT09Pd3Z2nn766dSxAGy7/LSwdMtz03StrOEEu3TbdXEWW75i9Ri9ujw+zsC48Zsf7r+4K0q7pW38ALAZ2k5x7XAz3KBfrEPfnNdj/7KZrEYgjV48DF64btYw5aW2XtOsrg5V9uQpSW19p1ahxg/ddGAfH0+155hRmtbapI+/nDusyGw2u3PnTpZlN27c2N3dTR0OwHaJnJ9VfV27cOFaTY0XvhXfODDW8v2HN2RjjoMBYDWWT3C3uomtKam3TDytEmF9JdzHU82DDTDcxJHaKTsLXzctrHabtf8ARg4d0zImnlL7DqPkk5Y26WMu5w4rcu/evbOzs93d3WeeeSZ1LAC0s3nTLgCAXjTdHFZ7U1q+SjUVVZ2p2u9RR9NNcnnMpUGbbtprtb2B/gNqU/ZN8TQth6rSr3F12kr+S9vvFJaY5cUYYkYMhBo/9MLNjI8nvs8OLdeUnDuswsXFxd27d7Mse+6551RyB1g7G39ECABECtxeFv9W9mTWuKlNYPVWQQbiaTto2+2NTOotsxMC0/kdwlGretFrCH3d4DLoiq2GWEE8m0TOHVbhzp070+n0+Pj4+vXrqWMBYFyajkGdJcLmaVUdosduI8cdKDwASK7fDPvC3mrLoLfVLeD4odsG2XkHbuehhfm2MLiTk5P79+9PJpPnn38+dSwAjM6sQeq4YEWGm/rUV889RjjQRztmGmkv/QAMIdXfRigJVGtpqmy+UC8TyavLY2rgLD/bve3yzgNtJPPcYViz2ezNN9/MsuzGjRuHh4epwwEAGLtSReDaGVjVkqylOdqBCsJ99ZP1NDG8VTxZZf9U14oMKVABuVU/ADB+1dLkbYu2t/pyLH5HL0w01zZuO2KHoZtaDhRPzIqbVBJKzh2G9c1vfvPs7Gxvb+/ZZ59NHQsAwNg1JdlL52D5j7PCk/qqy6unbX3105e28VT3T/HH2tetxm3bDwAkVzszPaZZdXnT65g+m9pXX3TovFuoC4eubRAfT2RIkRuyYYcccu4wII9OBQCoVcqnz1/EnO/VanWSFpjz1fZkb+iTw3D/1VlpKxgUAOjX2K5wjy2eNSXnDkOZzWavv/76bDY7Pj6+du1a6nAAAEYk4Uxqp5EAwHh0LtsykLHFs6ZMvIWh3L179/Hjx7u7uy+++GLqWADoxwgfydi2/3m1iuH6h36N7UNX6qeXD1SPwQzRLQAwtNk7Ugfy+8YWzzoyzx0GcXJy8vbbb2dZ9sILL+zt+aABJNbXRNrhSjf0O9U30FXMc5yW6b/Eram01VQvpWl5/ozTvEGpJHq4n/yttv10kHdSrMPedrtmdU8zq33QWYdxw/0AABBJKhD6d3Fxcfv27SzLnn766atXr6YOB4CyUl6p+kDCar6pKQMVSJbF91PMmjU1jkyBLYyzNt2/sNtwP+H9KXlHWORzz5qWxz+hq/d+AstbNW4bTyC8+O3t0A/Qo8CXb+Bydduv7F76GVRTJN32D8B4qC0D/XvjjTcuLy8PDw+fe+651LEAUCOf0VmdNFpcXsp5NU1Oz3XuJ592Wm1c+29408JxLjnJPRB/0/6sbhewjEmBTxasXi/1lwIf3m5vDdfPoDpc0YwPXqUsICHz3KFnl5eXkJ5FuwAAGSJJREFUZ2dnOzs73/Zt3+Y7HiCt4t/h2hITtWv1dSI6nhPaomrafbO3FzaPzxqMR/Vye+2PWdwnt8PNan310+2mt7y34h1vxSvx1fbL/AVzsx2wRuTcoWe7u7vvfe97Hz9+vL+/nzoWgG1XPO9a03Ot/PR1fTcBADZV6Qu6Kelc/bGpt6zu8ci1yesV9FOrul3ZOxtefARF0wHMMscztdtVHLrYv2MnIC05d+jfZDI5Pj5OHQUA62rQU8TqafbKiro69QVgfTXdPNeUZ1++nltVX30uc9PbrO4JzKXXpYUruP/bAQasQNNnuXiNrbgwq9zmErgZqLTiBpBzBwC2VNMzSwN3LmdPZqibTjvb9pPVHYMWu43PVi+MszQdrK3a/vPtzQcqzTKr3S4AWCNtb56rnQ++GVrNW9/g/QDbpnSyk58ILEy1582qpzl5h4Es/JqScwcANl/t2WB1YYcHdkX2vORb8WLibDrY7dx/oPO2/QPA2qkWEy/pK4s0XD/xN70tc9dawmyam+2gL7VT2pv+qgQW9lLtaszk3AGArVOaiz1mm3oMCgCbLXCTWdNNb33drLaym96ywgzW7MmZqk138nXeD03L3WwHqxT/d6PpAQzVTlZTgWr15NwBgK2zRuddaxQqbIbAyWQvDz9Yi6t9QED8LW5N94G1unkuct0l+2lVzz2y56by7q3i7Db0wq6ADkr1MxfOZC8tqebWiz9uXtpdzh2Wcu/evWvXru3s7KQOBIBtEXh40YojgV5Uc9Bps9LhAlDLnxDGb5rsfO7Tn/70z//8z6eOgo6uXr36vve9L3UU3d2/fz91CACjsLBI5sLrXsuUuFw7cu7Q3cOHD7/xjW/cvXv3lVde2bwrcgCM02Yfm0LTI4hrJ0kVayhXJ6HX1gxdOHS1caA0QauZ74HnKlfjb9oP2+mll1567rnnUkdBFw8ePPjyl7/827/926kD6e78/Dx1CACsHzl36O7w8HB/f//69esS7gAAvZhnn2vnSZVK9BZfV4sIlzqJmTNeW3i0uOKSh3xNhU1r42/aD9vpj//xP/4DP/ADqaNgS/3lv/yXU4dQw01vACMn5w7d7e3tvfTSS3t7PkcAAO3UVvDsnC2qXbH3WRHV2jJ9pbekyYBW/NEAGDm5QliKhDsAQAfFyeORyaN86nfkKnJSAAAk4cGPAADASI2qgl81mHlZmCRDAwAwWqboAgCsq4Tlnls9OhJaKT0ltfpW07NMi+071IHJ2xd/vauPbO38uavtP39Waj5QqaR7ZPAAAIyHnDsAsPlWn5vua8RwPwnTcNWEZi0PgWSh2t+Qtr82w3VSWl69BrBk/4HO2/YPAMBIqC0Di11cXLz++uvT6TR1IAD0ZvKO7MnJp/mSUsmISUFtP9UHQsa3DwS5sJ/Skqwyl3bhuK2KY4Q7GWg/wFzT71725G87AB0k/EPqeADYPOa5wwInJye3b9++vLzc3d29efNm6nAA6MGkMPm6eI7XVDiitCT/sWl5oPxFbfsmgWdFFqtSVIOfvFO5YlL3wMmF4zZp2m9D7weY62UyO8CSVv+11deI4X7cPAfQIzl3CHn77bfv3LmTZdnR0dEzzzyTOhwA2qnOuc4iSkPUns7VngpGniIu7KdHxWLWkeN2O32tFrlutbrpbCTR9IsniQMso/SFWLwuXvtghtIl82o/1ca1hzFN/QSCDPdTGrS0OQvjL64YDqZp3ED/fe0HgNWQc4d60+n0jTfeePDgQZZlN27ceP7552UHANZO8TxtyXOwpkR80ylfq35WYNBx12g/sOX84gG9c/Ocm+cAquTcocbZ2dnrr79+dnY2mUxu3rx5/fr11BEBMKBeTs8CiebV3BK+TLdZ+1xk0/auYD8AwOq5eS5mXDfPAczJuUPZw4cPb9++PZ1O9/b2vu3bvu3o6Ch1RAD0rHQ6t/C25erpX3HKVbFNaTZWZD+RodbOJS/dul47Xa7DuDHB5Nu7gv0AAGm5eW41467RfgAIkHOH/286nd65c+fevXtZll25cuXFF1/c3d1NHRQAPYicd9bhwWLF5Qsnu4WHaDV0eIuqE9M6bNrCxjGvm/p3egzARnLzXObmOQA5d8idnJy88cYbFxcXWZY9/fTTzz//fOqIAAAAGDU3z7l5DqBKzh2emN6+v7//wgsvHB8fpw4KAIBYgZmVgbmQreZj9tXPoJoi6bZ/gFpunnPzHMBCcu5su9L09ueee84DWABYpabvHSeQbIlecr6BZ+6Fc0PxB3599TOopki67Z8S2XkAgEhy7mwv09sBGAM5LMiVigY0/ZjFfXBqSygElvfYT9sZ9MUf8/z4/EW1sEPb/bBw3GqJiWIMxeVtdx0AwHaSc2dLfetb33rzzTen02lmejsAwDgUs8xZc9K5+mNTb1klo92UvF5BP7Wq25U9WcK4lH/vsB+a1G5XqXpyqYyyVDuMnJvnAEZCzp1tNJvN7ty5M51OTW8HAEiimBgqzp5uyrMPUb+lrz6XeYJf09MXi69LC1cwU0R6DtaUDy/ASMi5s40mk8nzzz9/eXn59NNPp44FAGAbFSeJRxaKqc4H3wyt5q1v8H4AANgYcu5sqWvXrqUOAQBCWtWDXn4sM+MYj2ox8ZK+Es3D9RP/+V3m05cw4e6PBgBAgJw7ALD5Vp8eWn7E1VSQyMeKbCnRRirFT0S15vh8ee1jP0vLA/006aufhf3nnecPLA3X2FlmPzQtLw5dCqM0dIctBQDYEnLubLLz8/P9/f3UUQAwRqWkVTHZVJtXaiq4XLs8T1RFto8PtTb42nc7d55V9kPMdkFntb9ICxc2vV7YSeS6S/bTqp57ZM9N5d1bxdlt6IVdASPn5jmAFdtJHQAM5Wtf+9pXvvKVs7Oz1IEAMDrzs8H8aY358uKU0rlq++IqTcvzOaHFTgLt24aa91/6t4NShLX7YeF2AcD2WH1Zp+VHXOW3dvxYnkgBbDDz3NlYOzs7s9ns8ePHBwcHqWMBII3iuVzT7OzIiZy1p4WRefOF/QR0OEnu67xaVh0AYrh5rqnzzM1zwLaSc2djPffccy+88MLOjps5ALZXaaJ6L10VlbqNyaf3mBDPCy47TYUlNX14fbiAhYpfxKUkeO2THqoHD8Xby6rLm77rm9rHh1rtf8njiuLFhuLC0pMnehkLYOTk3NlYKrkDEKmXU75Awn2Z/jusu7KarU6V2Rh+k4GF3Dy3DH9mgW0j584am81mp6enR0dHqQMBYM3M6sq4Z823OVdPg4tTtIptSrO3IvupFbgnvdjbkiexxdr02ZMz1PJ59FllVtrC4AFgw7h5DoB4cu6spcePH9+7d+/Bgwe7u7vvfe97U4cDwNhFzjsLnGc2vVVcvnCyW3iIppZtz35btV8YZOSuAwAyN891Jd0PbBg5d9bJdDp98ODBN7/5zdPT0/mSyWRycXGxt+c3GYDt0vZ2cgBgCG6eK42SuXkOQM6ddXF6enrv3r379+9Pp9MsyyaTybVr127cuKGwDADbyakpjFzCOZsrm5cK28nNc60au3kO2E5y7ozabDZ78ODBvXv3Hj16NF9ycHBw48aNa9eu7e7upo0NAHrRNGPdWShbYvW56b5GDPeT8CMc+SRGlRyAOTfPAfROzp2ROjk5uX///oMHD/KJ7VevXn366aePj49ThwYAfZLzgpJSdYVidYLaQgS1VR2aljdVewj0Ewgy3E9p0NLmLIw/azljvalEw6D7AdgAPukAvZNzZ1wePXo0T7VfXl7Ol+zv79+4ceP69esmtgMAbLxAMrpY3bi2ffHHpuVNNYub2jcJ1D4uXiSoBl/Kv7cdt0nTfht6PwCj4uY5gJGQc2cUTk9P79+/f//+/YuLi/mS3d3dp5566tq1aya2AwBsnlJeeP5iYf3i2rRRbY4psr7Kwn561FRPOTButzRZ9UmMrVZXZQLWl9w6wEjIuTMKb7311oMHD7Is29nZyVPtDvcBADZVcVL2kkmipkR8U72UVv2swKDjrtF+AADYGHLujML169cnk8m1a9euXLki1Q4AwFwvtU0Ch5ereZ7qMt1m7ZPgTdu7gv0AAEAm587KzGaz6XTaVJP96tWrV69eXXFIAFDSLb2VUMI02drtK9ZFqRbKwmd+VmunFOuVF9uUSplH9hMZau1c8tJzX2trzXcYNyaYfHtXsB8AACiRc2cV3nrrrbt37z777LPPPPNM6lgA2EaRuekOhY+HFo48YS4scl+ZPMtCkUXbO3wQissXVooPD9Fq6PAWVau69/UZb9reFewHAACK5NxZhb29vSzLptNp6kAA4PeVJn7WPtKwqQhyaeJtnn2ubV96t7afcJDhibS1wVTn0gbGbTVjvelZl60mJofjAYANsHY3hLl5DqBHcu70I1w6Zv5Y1LHNHARgazUlo0vv1iaviz+WCjUEkt3hfprUXg/I38oqmes8mFL+ve24TZr2W3j/VMfqKx4AWD03z/XOzXPA5pFzp7uLi4tH7zg7O3vuuefe9a531bbc2dlZcWwAkFXywvMXC0sr1C4JnArG5M1rQxpCU7WKzvEH1qrO5Y83tjQE1Gr6RZX0AYrcPBfY2IUhNXVSG5Kb54B1IedOO/M8+8nJyaNHj87Pz4tvXV5epooKAGoVz9OWOQerzstePqQVG3TcDvvHKTFrwS8qsJCb59w8B1Al584Cs9ns8ePHp6enjx8/fvTo0cXFRf7WZDI5PDw8Pj4+Pj4+OjpqKiwDACPX6vQs4YTugU4juxVRbdquwPY6DQZgfbl5LmZcN88BzMm5UzabzU5PT+dJ9tPT07Ozs9JF43me/cqVK0dHR4rGALCOSqdz1duW8wbz19VTwWqbcPvacbOIU9PS6vnyfGHpVvTaaXEdxo0JJt8PTcub4u8rHgBYGTfPrWZcN88Bm0HOnSfcvn37/v37pYV7e3tHR0eHh4cHBwdXr151DRmAtRMz76y0MDBzrXba18KZbuHlAQtDjYkwMG6rkJo2ue2ucHoMwEZy81zm5jkAOXdKptNplmW7u7vzJPvR0ZGiMQDQgcd5AcA2cPOcm+cAquTct8h0On399ddPT0+/4zu+o6nNs88+e/Pmzb09vxgAsBTne7DBuk3k7DyWvycwKm6ec/McwEJSq1tkZ2fn8ePH0+n07Ozs4OCgts3h4eGKowKALdd037QTSLbE6nPKy49YnVY5nFZFKvzdgI3k5jmAtSPnvsZms9n5O87OzuYv9vf3b9261bTKzZs39/f39/f3VxknABDg5BlKSlUF8soG2ZPJ7lIBh9LCpuV5wYTI9vGh1gZf+27nzrPKfojZLmDd+UQDrB059/UwnU7PC+YZ9ouLi2rL8JfxtWvXBosRAACWVZysXUqCF6v61rbPGqoPF38s5vFj+okPtdp/01iRihcbiguL+6GvsYDN4OY5gJGQcx+jx48f51n1eYb98vKytuXOzs7BwcF+QVPRGAAAGI9iYqhpdnZk0eTaHFOH8i9t2/dVSbkD6TOglj8OACMh557GvAhM07vf+MY3Tk9PSwt3d3fnKfVihn13d3fgSAEAoH/VGeLLd1VUnbferZ9u8cxHN/EcAGA7ybmv2unp6e/+7u/u7e298sorTW2Ojo729vb29/fn/85T7St7TBMAAIxEL2nrwIH0Mv13WLdVPfdlSPcDACQk597FbDabTqcXFxeXl5eXl5fzF8Ufb9y48eyzz9auu7e3l2VZbSn23M2bNweJGwAIWlk6LMYqg5GeYzxKNWEWPiO0WkOmWN+82KZU+jyyn1qBB7oWe1vyY5V3XvxrkO+HfPTwdgEAsHpy7vWm0+mjR48uLy+n0+k8kz6dTud59nluPbx6IKW+u7v7Hd/xHWrCAMAqRSa/OhSAHs4qg4lPz8nO07vIou2BX7ymt4rLF1aKDw/R1LLtx6FV+4VBRu46AABWbEtz7icnJycnJ8fHx1evXq1tcHFx8fWvfz3Qw2Qy2X3H3t5e6UWgVnuWZRLuAJBcaQJsKVFVnWMemHibJ8dr25fere0nPtSmzmuj6tZ5YLuaJhoDReO5dAck5OY5gG029pz7rGK6SN7m27/925uy2ycnJ2+//XaWZU05993d3aOjo93d3Z2dnXkaPX+RJ9YH3GwAYEjFs8Fqdix/t/qi1KBUsKK2fSnhXttPfKjFcauvO6heCQhsl2dCQgyfEdhsbp5bOFZkSwcVwAbrnnMv5cGryfHZbLa/v390dFS7+nQ6feONN2az2bvf/e6mIW7fvn3//v3OEU6n06bM+PHxcZZlV65caVp3d3f3Pe95T+ehAYAxKJ5eBsoul9aqXRI4Uw2fLpbWbXvG2+FctK/TV6fB0PSB9ekAitw819R5YLvcPAdstgU597Ozs9u3b9fm02N6v3HjRlPOPcuyBw8eZMGT2NIJ6txOhHmz+dNKa129erVphjsAsDGqM8S7qc5PXz6kJeVn9eaIwXB8uICF3DyXc/McQG7xPPfT09PAu5Ogg4ODwIo3b94Mn7I+//zzzz///LyrhXECAHTT6pSv7WHJkocxHU5HW01JW4ZTZQC2h5vnluGAAdg2C3Lue3t7t27dakqp7+zsdB54MpncuHEj3GaZ/gEAmpROWau3OecN5q9Ld1vn07Xi29eOmwVPQSdP3otdbdzLBLG889LUudrtCscDABvMzXMAxFuQc9/Z2QkUPQcAWAsx885KCwMz1/LXke1jlgdatj37bdW+7X7oEA8AbA83z3Uj3Q9smO7PUAUAoEntPPqB+gcAUnHzXGmUzM1zAHLuAABDGPrU0akp22Zlcy37knDO5trtK1gvbp5r1djNc8B2knMHAEipaca6s1C2RGRuOvzUwSTCkSf8CEfuK5UcYF24eQ5g7ci5AwAb5datWz/3cz/3cz/3c6kDifU93/M9tcu/93u/d8WRjNz//t//+7XXXksdBatQqpxQSjBVJ3EHqjrk2efa9qV3W2W18goJ1fbVhcVg8rFK79aO22rGelOJhnDVi0D88UMDg3LzHMDakXMHADbK1772tQ984AN/9a/+1dSB0KePfvSjL730UuooWIWmZHTp3drkdfHHYpXkpvalhHttP00CtY9rM/ilks356m3HbdK038L7pzpWX/EASbh5DmAk5NwBgE3z8ssvf+ADH0gdBX166qmnrly5kjoK+lTKC89fLCxhXLskUBUhJm9eG9IQmuopd44/sFbgKYsLqTIBRS+99NInP/nJT37yk/+vvTtWaR0KwABs5S6OLt2dHBQEwaFDcXISF0dfwbcRfAUnR918AwdBN0VwcBIFB0WEQu9QyC1JmnuStjlN+n1T7ulp8qfjf4/nxA4SZGtrK3d8e3u75iTts7m5GTsC0CQ6dwAAoG7ji7KnWYCZXZc9faSazfW5FX4f62Fh3Ovr6/Hx8dHRUewgxPTw8HB2dhY7BdAkOncAoG0uLi7u7u5ip2CWnp+fY0cgjlKNfMQF3XPag6XUfu6pb4WPr9hDBgptbGzs7e3FTkFMg8EgdgSgYXTuAECrnJycOH20fQ4ODvxN95JI7YWSPfMzmTC6zu6jkp1TPD/3uSsBTXfq68l4Mpg6xzV3T/kKzw0Jk/wOk8Yn5Z9VHgCAZaZzBwBapdfr9Xq92CmAUCGbtqcGC7Z9z90z/b/bxBePF/hv1JCEBc8tFWnSK5f9KZTskHJ+fn59fR07BTF9fHzEjgA0jM4dAABYIrnr6AFynZ6evry8xE5BfOvr67EjAE2icwcAAJaInh0I1+/3+/1+7BQANIzOHQAAIMekQ0e19gAAFNC5AwAA5NCtAwBQwWrsAAAAAAAA0BI6dwAAAAAAmA2dOwAAAAAAzIbOHQAAWHSdTmfSiab1qzPM4rw1AACBdO4AAEA0gZ3yQh1nWmeY8Gdp5wEAFsSf2AEAAAD+Sbrj4XDY6XRSpfPo0/HB8a45GU+mFcxPfZp7n/Cok26em6razQvea/TP3K8AAFAznTsAALAoxkv27MLt5NPsRWrCqJUunp8q3HPvEx51/LnZ6wqy/xNQ8F5TPgsAgBnSuQMAAHUbr5Inrc7ONsi5IwV7qhR30Knvlt2bpULBPatOXLcOALDIdO4AAEDdsivEq8muT58+0pSSJecWngMALCdnqAIAAAuqVIdetnCf8tDRCl8fbQszzUPDH1TDUwAAyGWdOwAAsChS+71kzwhNJoyuU0eVJnudh8/Pfe5K4bL31EGm2ckzWeSe3Dx70Gv2vYrzAABQJ507AAAQTcim7anBgm3fk+vA+SHjBTPLVtul5pf9HSrkAQBgHnTuAADAEsldRz+n+wMAsIR07gAAwBKZ92Jwi80BAJaczh0AACDHpBXrWnUAAAro3AEAgDoMBoOvr6+np6fYQUI9Pj7mjjfoFVrg5+dnMBjETgEAUILOHQAAqMPt7e3Nzc3Ozk7sIDTJ7+/v/f394eFh7CAAAKF07gAAQB16vd7b29vl5WXsIDTJ/v7+7u5u7BQAACWsxg4AAAAAAAAtoXMHAAAAAIDZsLcMAABQk6urq263GzsFTfL5+Rk7AgBAOZ3hcBg7AwAA0H7f39/v7++xU9A83W53bW0tdgoAgFB/Acb60bC/V6ELAAAAAElFTkSuQmCC
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNQ2hhbmdlTWFuYWdlbWVudC54bWwsdiAxLjIyMCAyMDEwLzA3LzAzIDE3OjUyOjE3IHViIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlIEtvbmZpZ3VyYXRpb24gaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluIG9mIHRoZSBDSVAgbWF0cml4PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5DYXRlZ29yeSAmbHQ7LSZndDsgSW1wYWN0ICZsdDstJmd0OyBQcmlvcml0eTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5DYXRlZ29yeSAmbHQ7LSZndDsgSW1wYWN0ICZsdDstJmd0OyBQcmlvcml0eTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2szPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MzE8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JVFNNQ2hhbmdlTm90aWZpY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJpZXJ1bmcgZGVyIEFkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbiBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbiBvZiBub3RpZmljYXRpb24gcnVsZXM8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPklUU00gQ2hhbmdlIG5vdGlmaWNhdGlvbiBydWxlczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5Ob3RpZmljYXRpb24gKElUU00gQ2hhbmdlIE1hbmFnZW1lbnQpPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQwNjwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbklUU01TdGF0ZU1hY2hpbmUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5JVFNNU3RhdGVNYWNoaW5lIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlciBBZG1pbklUU01TdGF0ZU1hY2hpbmUgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW4gb2YgdGhlIHN0YXRlIG1hY2hpbmU8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlN0YXRlIE1hY2hpbmU8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U3RhdGUgTWFjaGluZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2szPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MzM8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ0FCTWVtYmVyU2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNBQk1lbWJlclNlYXJjaCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNBQk1lbWJlclNlYXJjaC1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TG9va3VwIG9mIENBQiBtZW1iZXJzIGZvciBhdXRvY29tcGxldGlvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Q0FCIE1lbWJlciBTZWFyY2g8L1RpdGxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ2hhbmdlIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlLU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5PdmVydmlldyBvdmVyIGFsbCBDaGFuZ2VzPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPklUU00gQ2hhbmdlPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNoYW5nZS1BcmVhPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5JVFNNIENoYW5nZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8VHlwZT5NZW51PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPml0c21fY2hhbmdlLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNoYW5nZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPklUU00gQ2hhbmdlPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4zNDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5DaGFuZ2UgT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5vdmVydmlldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudElUU01DaGFuZ2U8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+SVRTTSBDaGFuZ2U8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ2hhbmdlQWRkIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlQWRkLU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZS1idWlsZGVyPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZGQgYSBjaGFuZ2U8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkFkZDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk5ldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TmV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5uZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlQWRkPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPklUU00gQ2hhbmdlPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz42MDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlIEtvbmZpZ3VyYXRpb24gaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIENoYW5nZSBDQUIgVGVtcGxhdGVzPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5DaGFuZ2UgQ0FCIFRlbXBsYXRlczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbiBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbi1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+SVRTTSBDaGFuZ2UgQ29uZGl0aW9uIE92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Q29uZGl0aW9uIE92ZXJ2aWV3PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIENoYW5nZSBDb25kaXRpb24gRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkNvbmRpdGlvbiBFZGl0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VFZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZUVkaXQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01DaGFuZ2VFZGl0LU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5FZGl0IGEgY2hhbmdlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5FZGl0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VIaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZUhpc3Rvcnkgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01DaGFuZ2VIaXN0b3J5LU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5DaGFuZ2UgSGlzdG9yeTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+SGlzdG9yeTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01DaGFuZ2VIaXN0b3J5Wm9vbS1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RGV0YWlscyBvZiBhIGNoYW5nZSBoaXN0b3J5IGVudHJ5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5IaXN0b3J5Wm9vbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucyBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucy1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q2hhbmdlIEludm9sdmVkIFBlcnNvbnM8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkludm9sdmVkIFBlcnNvbnM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZU1hbmFnZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ2hhbmdlTWFuYWdlciBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNoYW5nZU1hbmFnZXItT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlLW1hbmFnZXI8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+SVRTTSBDaGFuZ2UgTWFuYWdlciBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5JVFNNIENoYW5nZTwvVGl0bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZU15Q0FCIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZU15Q0FCIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlTXlDQUItT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPklUU00gTXlDQUIgT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+SVRTTSBDaGFuZ2U8L1RpdGxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VNeUNoYW5nZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzLU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZS1idWlsZGVyPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIE15Q2hhbmdlcyBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5JVFNNIENoYW5nZTwvVGl0bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPklUU00gTXlXb3Jrb3JkZXJzIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPklUU00gQ2hhbmdlPC9UaXRsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlUElSIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZVBJUiBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTUNoYW5nZVBJUi1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+SVRTTSBDaGFuZ2UgUElSIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPklUU00gQ2hhbmdlPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlBJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5QSVI8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm92ZXJ2aWV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVBJUjwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5JVFNNIENoYW5nZTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MzAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZVByaW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlUHJpbnQtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNoYW5nZSBQcmludDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+UHJpbnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZVBTQSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01DaGFuZ2VQU0Egb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01DaGFuZ2VQU0EtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlBTQSAoUHJvamVjdGVkIFNlcnZpY2UgQXZhaWxhYmlsaXR5KSBvZiBjaGFuZ2VzLiBPdmVydmlldyBvdmVyIGFwcHJvdmVkIGNoYW5nZXMgYW5kIHRoZWlyIHNlcnZpY2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5QU0E8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+UFNBIChQcm9qZWN0ZWQgU2VydmljZSBBdmFpbGFiaWxpdHkpPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5QU0E8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPm92ZXJ2aWV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVBTQTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5JVFNNIENoYW5nZTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjUwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZVNjaGVkdWxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZVNjaGVkdWxlIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkZvcndhcmQgc2NoZWR1bGUgb2YgY2hhbmdlcy4gT3ZlcnZpZXcgb3ZlciBhcHByb3ZlZCBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5DaGFuZ2UgU2NoZWR1bGU8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q2hhbmdlIFNjaGVkdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5TY2hlZHVsZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGU8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+SVRTTSBDaGFuZ2U8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01DaGFuZ2VTZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ2hhbmdlU2VhcmNoIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlU2VhcmNoLU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggQ2hhbmdlczwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+U2VhcmNoPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+U2VhcmNoIENoYW5nZXM8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNlYXJjaDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+c2VhcmNoLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVNlYXJjaDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPklUU00gQ2hhbmdlPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTUNoYW5nZVRlbXBsYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTUNoYW5nZVRlbXBsYXRlIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRlbXBsYXRlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5UZW1wbGF0ZTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlVGltZVNsb3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNQ2hhbmdlVGltZVNsb3Qgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01DaGFuZ2VUaW1lU2xvdC1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TW92ZSBUaW1lIFNsb3Q8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlRpbWUgU2xvdDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNQ2hhbmdlWm9vbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01DaGFuZ2Vab29tIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNQ2hhbmdlWm9vbS1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q2hhbmdlIFpvb208L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlpvb208L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVRlbXBsYXRlRGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVRlbXBsYXRlRGVsZXRlIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNVGVtcGxhdGVEZWxldGUtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPklUU00gVGVtcGxhdGUgRGVsZXRlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5JVFNNIENoYW5nZTwvVGl0bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVRlbXBsYXRlRWRpdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01UZW1wbGF0ZUVkaXQgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01UZW1wbGF0ZUVkaXQtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPklUU00gVGVtcGxhdGUgRWRpdDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+SVRTTSBDaGFuZ2U8L1RpdGxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3LU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZS1idWlsZGVyPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2UtbWFuYWdlcjwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JVFNNIFRlbXBsYXRlIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPklUU00gQ2hhbmdlPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRlbXBsYXRlIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5UZW1wbGF0ZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+aXRzbV9jaGFuZ2VfdGVtcGxhdGUucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldzwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5JVFNNIENoYW5nZTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVVzZXJTZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNVXNlclNlYXJjaCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVVzZXJTZWFyY2gtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkxvb2t1cCBvZiBhZ2VudHMsIHVzZWQgZm9yIGF1dG9jb21wbGV0aW9uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5Vc2VyU2VhcmNoPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNV29ya09yZGVyQWRkIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNV29ya09yZGVyQWRkLU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Xb3Jrb3JkZXIgQWRkPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5BZGQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVdvcmtPcmRlckFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVdvcmtPcmRlckFnZW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNV29ya09yZGVyQWdlbnQtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPldvcmtvcmRlciBBZ2VudDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+QWdlbnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVdvcmtPcmRlckRlbGV0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPldvcmtvcmRlciBEZWxldGU8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkRlbGV0ZTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVyRWRpdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Xb3JrT3JkZXJFZGl0IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNV29ya09yZGVyRWRpdC1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+V29ya29yZGVyIEVkaXQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkVkaXQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVdvcmtPcmRlckhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVdvcmtPcmRlckhpc3RvcnktT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPldvcmtvcmRlciBIaXN0b3J5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5IaXN0b3J5PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5Wm9vbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5Wm9vbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tLU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Xb3Jrb3JkZXIgSGlzdG9yeSBab29tPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5IaXN0b3J5Wm9vbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVdvcmtPcmRlclJlcG9ydCBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVdvcmtPcmRlclJlcG9ydC1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+V29ya29yZGVyIFJlcG9ydDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+UmVwb3J0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Xb3JrT3JkZXJUYWtlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVdvcmtPcmRlclRha2Ugb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Xb3JrT3JkZXJUYWtlLU9iamVrdHMgaW0gQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWNoYW5nZTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UYWtlIFdvcmtvcmRlcjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+VGFrZSBXb3Jrb3JkZXI8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUtT2JqZWt0cyBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tY2hhbmdlPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRlbXBsYXRlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5UZW1wbGF0ZTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5JVFNNIENoYW5nZTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNV29ya09yZGVyWm9vbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Xb3JrT3JkZXJab29tIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNV29ya09yZGVyWm9vbS1PYmpla3RzIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwUm8+aXRzbS1jaGFuZ2U8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+V29ya29yZGVyIFpvb208L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPlpvb208L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+SVRTTSBDaGFuZ2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlIyMjQ3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQ3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUgb2JqZWN0IGluIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBDdXN0b21lcklUU01DaGFuZ2VTY2hlZHVsZS1PYmpla3RzIGltIEN1c3RvbWVyLUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q2hhbmdlIFNjaGVkdWxlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPklUU00gQ2hhbmdlPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPkNoYW5nZSBTY2hlZHVsZTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5DaGFuZ2UgU2NoZWR1bGU8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNoYW5nZSBTY2hlZHVsZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj48L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGU8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40NTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TmF2QmFyTW9kdWxlIyMjMTAxLUlUU01DaGFuZ2VNYW5hZ2VtZW50OjpNeUNoYW5nZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BZ2VudCBpbnRlcmZhY2UgbW9kdWxlIHRvIHNob3cgdGhlIE15Q2hhbmdlcyBvdmVydmlldyBpY29uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCB6dW0gQW56ZWlnZW4gZGVzIE15Q2hhbmdlcy3cYmVyc2ljaHRzLUljb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok5hdkJhck1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNeUNoYW5nZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TmF2QmFyTW9kdWxlIyMjMTAyLUlUU01DaGFuZ2VNYW5hZ2VtZW50OjpNeVdvcmtPcmRlcnMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BZ2VudCBpbnRlcmZhY2UgbW9kdWxlIHRvIHNob3cgdGhlIE15V29ya09yZGVycyBvdmVydmlldyBpY29uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCB6dW0gQW56ZWlnZW4gZGVzIE15V29ya09yZGVycy3cYmVyc2ljaHRzLUljb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok5hdkJhck1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNeVdvcmtPcmRlcnM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TmF2QmFyTW9kdWxlIyMjMTAzLUlUU01DaGFuZ2VNYW5hZ2VtZW50OjpNeUNBQiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkFnZW50IGludGVyZmFjZSBtb2R1bGUgdG8gc2hvdyB0aGUgTXlDQUIgb3ZlcnZpZXcgaWNvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwgenVtIEFuemVpZ2VuIGRlcyBNeUNBQi3cYmVyc2ljaHRzLUljb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok5hdkJhck1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNeUNBQjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpOYXZCYXJNb2R1bGUjIyMxMDQtSVRTTUNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZU1hbmFnZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BZ2VudCBpbnRlcmZhY2UgbW9kdWxlIHRvIHNob3cgdGhlIENoYW5nZU1hbmFnZXIgb3ZlcnZpZXcgaWNvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwgenVtIEFuemVpZ2VuIGRlcyBDaGFuZ2VNYW5hZ2VyLdxiZXJzaWNodHMtSWNvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TmF2QmFyTW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhckNoYW5nZU1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6T3ZlcnZpZXcjIyNTbWFsbCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgYW4gb3ZlcnZpZXcgbW9kdWxlIHRvIHNob3cgdGhlIHNtYWxsIHZpZXcgb2YgYSBjaGFuZ2UgbGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRhcyDcYmVyc2ljaHRzbW9kdWwgdW0gZGllIFNtYWxsLUFuc2ljaHQgZWluZXIgQ2hhbmdlLUxpc3RlIGFuenV6ZWlnZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2VPdmVydmlld1NtYWxsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5TbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGFnZVNob3duIj4yNTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1hZ2UiPm92ZXJ2aWV3c21hbGwucG5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbWFnZVNlbGVjdGVkIj5vdmVydmlld3NtYWxsLXNlbGVjdGVkLnBuZzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpUZW1wbGF0ZU92ZXJ2aWV3IyMjU21hbGwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIGFuIG92ZXJ2aWV3IG1vZHVsZSB0byBzaG93IHRoZSBzbWFsbCB2aWV3IG9mIGEgdGVtcGxhdGUgbGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRhcyDcYmVyc2ljaHRzbW9kdWwgdW0gZGllIFNtYWxsLUFuc2ljaHQgZWluZXIgVGVtcGxhdGUtTGlzdGUgYW56dXplaWdlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNVGVtcGxhdGVPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNVGVtcGxhdGVPdmVydmlld1NtYWxsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5TbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGFnZVNob3duIj4yNTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1hZ2UiPm92ZXJ2aWV3c21hbGwucG5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbWFnZVNlbGVjdGVkIj5vdmVydmlld3NtYWxsLXNlbGVjdGVkLnBuZzwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMTctSVRTTUNoYW5nZUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGEgbGluayB0byBjcmVhdGUgYSBjaGFuZ2UgZnJvbSB0aGlzIHRpY2tldC4gVGhlIHRpY2tldCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbGlua2VkIHdpdGggdGhlIG5ldyBjaGFuZ2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBlaW4gTGluayBpbSBNZW78IGRlciBUaWNrZXRhbnNpY2h0IGFuZ2V6ZWlndCwgbWl0IGRlbSBlaW4gQ2hhbmdlIGVyc3RlbGx0IHdlcmRlbiBrYW5uLiBEYXMgVGlja2V0IHdpcmQgYXV0b21hdGlzY2ggbWl0IGRlbSBuZXUgZXJzdGVsbHRlbiBDaGFuZ2UgdmVybGlua3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudUlUU01DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkNyZWF0ZSBDaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5DcmVhdGUgYSBjaGFuZ2UgZnJvbSB0aGlzIHRpY2tldCE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlQWRkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlQWRkJmFtcDtUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAwMC1CYWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdCYWNrJyBsaW5rIGluIGNoYW5nZSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyICdadXL8Y2snLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENoYW5nZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2VNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj4kRW52eyJMYXN0U2NyZWVuQ2hhbmdlcyJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMTAtSGlzdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHRoZSAnSGlzdG9yeScgbGluayBpbiBjaGFuZ2UgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciAnSGlzdG9yeSctTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ2hhbmdlLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5IaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+SGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01DaGFuZ2VIaXN0b3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeSZhbXA7Q2hhbmdlSUQ9JFFEYXRheyJDaGFuZ2VJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMjAtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB0aGUgJ1ByaW50JyBsaW5rIGluIGNoYW5nZSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyICdEcnVja2VuJy1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDaGFuZ2UtQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+UHJpbnQgdGhlIGNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01DaGFuZ2VQcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZVByaW50O0NoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua1BhcmFtIj50YXJnZXQ9InByaW50X2NoYW5nZSI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAzMC1FZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdFZGl0JyBsaW5rIGluIGNoYW5nZSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyICdCZWFyYmVpdGVuJy1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDaGFuZ2UtQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkVkaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5FZGl0IHRoZSBjaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlRWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTUNoYW5nZUVkaXQmYW1wO0NoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDQwLUludm9sdmVkUGVyc29ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHRoZSAnaW52b2x2ZWQgcGVyc29ucycgbGluayBpbiBjaGFuZ2UgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciAnSW52b2x2aWVydGUgUGVyc29uZW4nLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENoYW5nZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2VNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+SW52b2x2ZWQgUGVyc29uczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkNoYW5nZSBpbnZvbHZlZCBwZXJzb25zIG9mIHRoZSBjaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zJmFtcDtDaGFuZ2VJRD0kUURhdGF7IkNoYW5nZUlEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA1MC1Xb3JrT3JkZXJBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBhZGQgJ0FkZCBXb3Jrb3JkZXInIGxpbmsgaW4gY2hhbmdlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgJ1dvcmtvcmRlciBoaW56dWb8Z2VuJy1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBDaGFuZ2UtQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUNoYW5nZTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkFkZCBXb3Jrb3JkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5BZGQgYSB3b3Jrb3JkZXIgdG8gdGhlIGNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJBZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJBZGQmYW1wO0NoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDYwLUNvbmRpdGlvbnMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB0aGUgJ0NvbmRpdGlvbnMnIGxpbmsgaW4gY2hhbmdlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgJ0NvbmRpdGlvbnMnLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENoYW5nZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2VNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+Q29uZGl0aW9uczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkVkaXQgdGhlIGNvbmRpdGlvbnMgb2YgdGhlIGNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01DaGFuZ2VDb25kaXRpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb24mYW1wO0NoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDcwLUxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB0aGUgJ0xpbmsnIGxpbmsgaW4gY2hhbmdlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgJ1Zlcmtu/HBmZW4nLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIENoYW5nZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNQ2hhbmdlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2VNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkxpbmsgYW5vdGhlciBvYmplY3QgdG8gdGhlIGNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudExpbmtPYmplY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudExpbmtPYmplY3QmYW1wO1NvdXJjZU9iamVjdD1JVFNNQ2hhbmdlJmFtcDtTb3VyY2VLZXk9JFFEYXRheyJDaGFuZ2VJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwODAtTW92ZVRpbWVTbG90IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdNb3ZlIFRpbWVzbG90JyBsaW5rIGluIGNoYW5nZSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyICdWZXJzY2hpZWJlbictTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ2hhbmdlLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZU1lbnVUaW1lU2xvdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TW92ZSBUaW1lIFNsb3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5Nb3ZlIGFsbCB3b3Jrb3JkZXJzIGluIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlVGltZVNsb3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VUaW1lU2xvdCZhbXA7Q2hhbmdlSUQ9JFFEYXRheyJDaGFuZ2VJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwOTAtVGVtcGxhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB0aGUgJ1RlbXBsYXRlJyBsaW5rIGluIGNoYW5nZSBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyICdUZW1wbGF0ZSctTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgQ2hhbmdlLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01DaGFuZ2U6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPlNhdmUgY2hhbmdlIGFzIGEgdGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VUZW1wbGF0ZTtDaGFuZ2VJRD0kUURhdGF7IkNoYW5nZUlEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAwMC1CYWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdCYWNrJyBsaW5rIGluIHdvcmtvcmRlciBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyICdadXL8Y2snLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFdvcmtvcmRlci1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXJNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj4kRW52eyJMYXN0U2NyZWVuV29ya09yZGVycyJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMTAtSGlzdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHRoZSAnSGlzdG9yeScgbGluayBpbiB3b3Jrb3JkZXIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciAnSGlzdG9yaWUnLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFdvcmtvcmRlci1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXJNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+SGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkhpc3Rvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckhpc3RvcnkmYW1wO1dvcmtPcmRlcklEPSRRRGF0YXsiV29ya09yZGVySUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDIwLVByaW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdQcmludCcgbGluayBpbiB3b3Jrb3JkZXIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciAnRHJ1Y2tlbictTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgV29ya29yZGVyLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Xb3JrT3JkZXI6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlck1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPlByaW50IHRoZSB3b3Jrb3JkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNQ2hhbmdlUHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01DaGFuZ2VQcmludDtXb3JrT3JkZXJJRD0kUURhdGF7IldvcmtPcmRlcklEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzAzMC1FZGl0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdFZGl0JyBsaW5rIGluIHdvcmtvcmRlciBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaXQgZGllc2VtIE1vZHVsIHdpcmQgZGVyICdCZWFyYmVpdGVuJy1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBXb3Jrb3JkZXItQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVdvcmtPcmRlcjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyTWVudVdpdGhQZXJtaXNzaW9uRnJvbUNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+RWRpdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkVkaXQgdGhlIHdvcmtvcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJFZGl0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyRWRpdCZhbXA7V29ya09yZGVySUQ9JFFEYXRheyJXb3JrT3JkZXJJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMzUtVGFrZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IHRoZSAnVGFrZScgbGluayBpbiB3b3Jrb3JkZXIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciAnVGFrZSctTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgV29ya29yZGVyLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Xb3JrT3JkZXI6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlck1lbnVXaXRoVGFrZVBlcm1pc3Npb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlRha2UgV29ya29yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+VGFrZSB0aGUgd29ya29yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTVdvcmtPcmRlclRha2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJUYWtlO1dvcmtPcmRlcklEPSRRRGF0YXsiV29ya09yZGVySUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDQwLVdvcmtPcmRlckFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdXb3Jrb3JkZXIgQWdlbnQnIGxpbmsgaW4gd29ya29yZGVyIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgJ1dvcmtvcmRlciBBZ2VudCctTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgV29ya29yZGVyLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Xb3JrT3JkZXI6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlck1lbnVXaXRoUGVybWlzc2lvbkZyb21DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPldvcmtPcmRlckFnZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+U2V0IHRoZSBhZ2VudCBmb3IgdGhlIHdvcmtvcmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJBZ2VudDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckFnZW50JmFtcDtXb3JrT3JkZXJJRD0kUURhdGF7IldvcmtPcmRlcklEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA1MC1SZXBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB0aGUgJ1JlcG9ydCcgbGluayBpbiB3b3Jrb3JkZXIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciAnUmVwb3J0Jy1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBXb3Jrb3JkZXItQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVdvcmtPcmRlcjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPlJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPlJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQmYW1wO1dvcmtPcmRlcklEPSRRRGF0YXsiV29ya09yZGVySUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDYwLUxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBsaW5rIGxpbmsgaW4gd29ya29yZGVyIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgTGluay1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBXb3Jrb3JkZXItQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVdvcmtPcmRlcjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNV29ya09yZGVyTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5MaW5rIGFub3RoZXIgb2JqZWN0IHRvIHRoZSB3b3Jrb3JkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRMaW5rT2JqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRMaW5rT2JqZWN0JmFtcDtTb3VyY2VPYmplY3Q9SVRTTVdvcmtPcmRlciZhbXA7U291cmNlS2V5PSRRRGF0YXsiV29ya09yZGVySUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDgwLVRlbXBsYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlICdUZW1wbGF0ZScgbGluayBpbiB3b3Jrb3JkZXIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWl0IGRpZXNlbSBNb2R1bCB3aXJkIGRlciAnVGVtcGxhdGUnLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFdvcmtvcmRlci1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXJNZW51V2l0aFBlcm1pc3Npb25Gcm9tQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5UZW1wbGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPlNhdmUgd29ya29yZGVyIGFzIGEgdGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZTtXb3JrT3JkZXJJRD0kUURhdGF7IldvcmtPcmRlcklEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzA5MC1Xb3JrT3JkZXJEZWxldGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyB0aGUgJ0RlbGV0ZScgbGluayBpbiB0aGUgd29ya29yZGVyIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1pdCBkaWVzZW0gTW9kdWwgd2lyZCBkZXIgJ0z2c2NoZW4nLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFdvcmtvcmRlci1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNV29ya09yZGVyOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXJNZW51V2l0aFBlcm1pc3Npb25Gcm9tQ2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5EZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5EZWxldGUgV29ya29yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZSZhbXA7V29ya09yZGVySUQ9JFFEYXRheyJXb3JrT3JkZXJJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlIyMjQWN0aXZlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9jb21wbGV0ZSBmZWF0dXJlIGZvciB0aGUgY3VzdG9tZXIgc2VhcmNoIGluIHRoZSBJVFNNIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QWt0aXZpZXJlbiBvZGVyIGRlYWt0aXZpZXJlbiBkZXIgQXV0b2NvbXBsZXRlLUZ1bmt0aW9uYWxpdOR0IGb8ciBkaWUgS3VuZGVuLVN1Y2hlIGltIElUU00tQWdlbnRlbmludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDdXN0b21lclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZTo6RHluYW1pY1dpZHRoIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QWRhcHQgd2lkdGggb2YgYXV0b2NvbXBsZXRlIGRyb3AgZG93biB0byBsZW5ndGggb2YgdGhlIGxvbmdlc3Qgb3B0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5QYXNzZSBkaWUgQnJlaXRlIGRlcyBBdXRvY29tcGxldGUtRHJvcERvd25zIGFuIGRpZSBs5G5nc3RlIE9wdGlvbiBhbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDdXN0b21lclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZSMjI01heFJlc3VsdHNEaXNwbGF5ZWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZXQgbWF4aW1hbCBudW1iZXIgb2Ygc2VhcmNoIHJlc3VsdHMgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWF4aW1hbGUgWmFobCBkZXIgU3VjaGVyZ2Vibmlzc2UgaW4gZGVyIEF1dG9jb21wbGV0ZS1GdW5rdGlvbmFsaXTkdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDdXN0b21lclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6Q3VzdG9tZXJTZWFyY2hBdXRvQ29tcGxldGUjIyNNaW5RdWVyeUxlbmd0aCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNldCBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJlZm9yZSBhdXRvY29tcGxldGUgcXVlcnkgaXMgc2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWluZGVzdGFuemFobCB2b24gWmVpY2hlbiB6dW0gQXVzZvxocmVuIGRlciBBdXRvY29tcGxldGUtRnVua3Rpb25hbGl05HQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Q3VzdG9tZXJTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeWzEtOV0kIj4yPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlIyMjUXVlcnlEZWxheSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlbGF5IHRpbWUgYmV0d2VlbiBhdXRvY29tcGxldGUgcXVlcmllcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2FydGV6ZWl0IHp3aXNjaGVuIHp3ZWkgQXV0b2NvbXBsZXRlLUFuZnJhZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkN1c3RvbWVyU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXigwXC5bMS05XSspfChbMS05XShcLlswLTldKyk/KSQiPjAuMTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZSMjI1R5cGVBaGVhZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkVuYWJsZSBvciBkaXNhYmxlIFR5cGVBaGVhZCBmb3IgdGhlIGF1dG9jb21wbGV0ZSBmZWF0dXJlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Ba3RpdmllcmVuIG9kZXIgZGVha3RpdmllcmVuIHZvbiBUeXBlQWhlYWQgaW4gZGVyIEF1dG9jb21wbGV0ZS1GdW5rdGlvbmFsaXTkdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDdXN0b21lclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iZmFsc2UiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJmYWxzZSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InRydWUiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlVzZXJTZWFyY2hBdXRvQ29tcGxldGUjIyNBY3RpdmUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5FbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b2NvbXBsZXRlIGZlYXR1cmUgZm9yIHRoZSB1c2VyIHNlYXJjaCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Ba3RpdmllcmVuIG9kZXIgZGVha3RpdmllcmVuIGRlciBBdXRvY29tcGxldGUtRnVua3Rpb25hbGl05HQgZvxyIGRpZSBVc2VyLVN1Y2hlIGltIEFnZW50ZW5pbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VXNlclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlOjpEeW5hbWljV2lkdGgiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BZGFwdCB3aWR0aCBvZiBhdXRvY29tcGxldGUgZHJvcCBkb3duIHRvIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBvcHRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBhc3NlIGRpZSBCcmVpdGUgZGVzIEF1dG9jb21wbGV0ZS1Ecm9wRG93bnMgYW4gZGllIGzkbmdzdGUgT3B0aW9uIGFuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlVzZXJTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6VXNlclNlYXJjaEF1dG9Db21wbGV0ZSMjI01pblF1ZXJ5TGVuZ3RoIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0IG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYmVmb3JlIGF1dG9jb21wbGV0ZSBxdWVyeSBpcyBzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaW5kZXN0YW56YWhsIHZvbiBaZWljaGVuIHp1bSBBdXNm/GhyZW4gZGVyIEF1dG9jb21wbGV0ZS1GdW5rdGlvbmFsaXTkdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpVc2VyU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXlsxLTldJCI+MjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlIyMjTWF4UmVzdWx0c0Rpc3BsYXllZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNldCBtYXhpbWFsIG51bWJlciBvZiBzZWFyY2ggcmVzdWx0cyBmb3IgdGhlIGF1dG9jb21wbGV0ZSBmZWF0dXJlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NYXhpbWFsZSBaYWhsIGRlciBTdWNoZXJnZWJuaXNzZSBpbiBkZXIgQXV0b2NvbXBsZXRlLUZ1bmt0aW9uYWxpdOR0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlVzZXJTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPjIwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlVzZXJTZWFyY2hBdXRvQ29tcGxldGUjIyNRdWVyeURlbGF5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVsYXkgdGltZSBiZXR3ZWVuIGF1dG9jb21wbGV0ZSBxdWVyaWVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XYXJ0ZXplaXQgendpc2NoZW4gendlaSBBdXRvY29tcGxldGUtQW5mcmFnZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VXNlclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4oMFwuWzEtOV0rKXwoWzEtOV0oXC5bMC05XSspPykkIj4wLjE8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6VXNlclNlYXJjaEF1dG9Db21wbGV0ZSMjI1R5cGVBaGVhZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkVuYWJsZSBvciBkaXNhYmxlIFR5cGVBaGVhZCBmb3IgdGhlIGF1dG9jb21wbGV0ZSBmZWF0dXJlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Ba3RpdmllcmVuIG9kZXIgZGVha3RpdmllcmVuIHZvbiBUeXBlQWhlYWQgZvxyIGRpZSBBdXRvY29tcGxldGUtRnVua3Rpb25hbGl05HQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VXNlclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iZmFsc2UiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJmYWxzZSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InRydWUiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZSMjI0FjdGl2ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkVuYWJsZSBvciBkaXNhYmxlIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZSBmb3IgdGhlIENBQiBtZW1iZXIgc2VhcmNoIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFrdGl2aWVyZW4gb2RlciBkZWFrdGl2aWVyZW4gZGVyIEF1dG9jb21wbGV0ZS1GdW5rdGlvbmFsaXTkdCBm/HIgZGllIENBQk1lbWJlci1TdWNoZSBpbSBBZ2VudGVuaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkNBQk1lbWJlclNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpDQUJNZW1iZXJTZWFyY2hBdXRvQ29tcGxldGU6OkR5bmFtaWNXaWR0aCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkFkYXB0IHdpZHRoIG9mIGF1dG9jb21wbGV0ZSBkcm9wIGRvd24gdG8gbGVuZ3RoIG9mIHRoZSBsb25nZXN0IG9wdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+UGFzc2UgZGllIEJyZWl0ZSBkZXMgQXV0b2NvbXBsZXRlLURyb3BEb3ducyBhbiBkaWUgbORuZ3N0ZSBPcHRpb24gYW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Q0FCTWVtYmVyU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZSMjI01heFJlc3VsdHNEaXNwbGF5ZWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZXQgbWF4aW1hbCBudW1iZXIgb2Ygc2VhcmNoIHJlc3VsdHMgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TWF4aW1hbGUgWmFobCBkZXIgU3VjaGVyZ2Vibmlzc2UgaW4gZGVyIEF1dG9jb21wbGV0ZS1GdW5rdGlvbmFsaXTkdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDQUJNZW1iZXJTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPjIwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZSMjI01pblF1ZXJ5TGVuZ3RoIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2V0IG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYmVmb3JlIGF1dG9jb21wbGV0ZSBxdWVyeSBpcyBzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NaW5kZXN0YW56YWhsIHZvbiBaZWljaGVuIHp1bSBBdXNm/GhyZW4gZGVyIEF1dG9jb21wbGV0ZS1GdW5rdGlvbmFsaXTkdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDQUJNZW1iZXJTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeWzEtOV0kIj4yPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZSMjI1F1ZXJ5RGVsYXkiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWxheSB0aW1lIGJldHdlZW4gYXV0b2NvbXBsZXRlIHF1ZXJpZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldhcnRlemVpdCB6d2lzY2hlbiB6d2VpIEF1dG9jb21wbGV0ZS1BbmZyYWdlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDQUJNZW1iZXJTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKDBcLlsxLTldKyl8KFsxLTldKFwuWzAtOV0rKT8pJCI+MC4xPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZSMjI1R5cGVBaGVhZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkVuYWJsZSBvciBkaXNhYmxlIFR5cGVBaGVhZCBmb3IgdGhlIGF1dG9jb21wbGV0ZSBmZWF0dXJlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Ba3RpdmllcmVuIG9kZXIgZGVha3RpdmllcmVuIHZvbiBUeXBlQWhlYWQgaW4gZGVyIEF1dG9jb21wbGV0ZS1GdW5rdGlvbmFsaXTkdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpDQUJNZW1iZXJTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9ImZhbHNlIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZmFsc2UiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJ0cnVlIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkV2ZW50TW9kdWxlIyMjMDEtTm90aWZpY2F0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SVRTTSBldmVudCBtb2R1bGUgdGhhdCBzZW5kcyBub3RpZmljYXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JVFNNIEV2ZW50IE1vZHVsIHp1bSBTZW5kZW4gdm9uIEJlbmFjaHJpY2h0aWd1bmdlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VBZGRQb3N0fENoYW5nZVVwZGF0ZVBvc3R8Q2hhbmdlQ0FCVXBkYXRlUG9zdHxDaGFuZ2VDQUJEZWxldGVQb3N0fENoYW5nZURlbGV0ZVBvc3R8Q2hhbmdlTGlua0FkZFBvc3R8Q2hhbmdlTGlua0RlbGV0ZVBvc3R8Q2hhbmdlQXR0YWNobWVudEFkZFBvc3R8Q2hhbmdlQXR0YWNobWVudERlbGV0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkV2ZW50TW9kdWxlIyMjMDItQ29uZGl0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SVRTTSBldmVudCBtb2R1bGUgdGhhdCBtYXRjaGVzIGNvbmRpdGlvbnMgYW5kIGV4ZWN1dGVzIGFjdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklUU00gRXZlbnQgTW9kdWwgenVtINxiZXJwcvxmZW4gdm9uIENvbmRpdGlvbnMgdW5kIHp1bSBBdXNm/GhyZW4gdm9uIEFjdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpDb25kaXRpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlQWRkUG9zdHxDaGFuZ2VVcGRhdGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpFdmVudE1vZHVsZSMjIzAzLUhpc3RvcnlBZGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB1cGRhdGVzIHRoZSBoaXN0b3J5IG9mIGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklUU00gRXZlbnQgTW9kdWwgYWt0dWFsaXNpZXJ0IGRpZSBIaXN0b3JpZSB2b24gQ2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlBZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlQWRkUG9zdHxDaGFuZ2VVcGRhdGVQb3N0fENoYW5nZUNBQlVwZGF0ZVBvc3R8Q2hhbmdlQ0FCRGVsZXRlUG9zdHxDaGFuZ2VMaW5rQWRkUG9zdHxDaGFuZ2VMaW5rRGVsZXRlUG9zdHxDaGFuZ2VBdHRhY2htZW50QWRkUG9zdHxDaGFuZ2VBdHRhY2htZW50RGVsZXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RXZlbnRNb2R1bGUjIyM5MC1Db25kaXRpb25EZWxldGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IGNsZWFucyB1cCBjb25kaXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JVFNNIEV2ZW50IE1vZHVsIHp1bSBBdWZy5HVtZW4gdm9uIENvbmRpdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpDb25kaXRpb25EZWxldGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlRGVsZXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RXZlbnRNb2R1bGUjIyM5MS1IaXN0b3J5RGVsZXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SVRTTSBldmVudCBtb2R1bGUgZGVsZXRlcyB0aGUgaGlzdG9yeSBvZiBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JVFNNIEV2ZW50IE1vZHVsIGz2c2NodCBkaWUgSGlzdG9yaWUgdm9uIENoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5RGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KENoYW5nZURlbGV0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkV2ZW50TW9kdWxlIyMjMDEtV29ya09yZGVyTnVtYmVyQ2FsYyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklUU00gZXZlbnQgbW9kdWxlIHRvIHJlY2FsY3VsYXRlIHRoZSB3b3Jrb3JkZXIgbnVtYmVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SVRTTSBFdmVudCBNb2R1bCwgZGFzIGRpZSBXb3Jrb3JkZXIgTnVtbWVybiBuZXUgYmVyZWNobmV0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpFdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6V29ya09yZGVyTnVtYmVyQ2FsYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihXb3JrT3JkZXJVcGRhdGVQb3N0fFdvcmtPcmRlckRlbGV0ZVBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkV2ZW50TW9kdWxlIyMjMDItV29ya09yZGVyQWN0dWFsVGltZXNTZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB0byBzZXQgdGhlIGFjdHVhbCBzdGFydCBhbmQgZW5kIHRpbWVzIG9mIHdvcmtvcmRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklUU00gRXZlbnQgTW9kdWwsIGRhcyBkaWUgQWN0dWFsU3RhcnQgdW5kIEFjdHVhbEVuZCBaZWl0ZW4gdm9uIFdvcmtvcmRlcnMgc2V0enQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OkV2ZW50OjpXb3JrT3JkZXJBY3R1YWxUaW1lc1NldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPldvcmtPcmRlclVwZGF0ZVBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RXZlbnRNb2R1bGUjIyMwMy1Ob3RpZmljYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHNlbmRzIG5vdGlmaWNhdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklUU00gRXZlbnQgTW9kdWwgenVtIFNlbmRlciB2b24gQmVuYWNocmljaHRpZ3VuZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpFdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Tm90aWZpY2F0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFdvcmtPcmRlckFkZFBvc3R8V29ya09yZGVyVXBkYXRlUG9zdHxXb3JrT3JkZXJEZWxldGVQb3N0fFdvcmtPcmRlckxpbmtBZGRQb3N0fFdvcmtPcmRlckxpbmtEZWxldGVQb3N0fFdvcmtPcmRlckF0dGFjaG1lbnRBZGRQb3N0fFdvcmtPcmRlckF0dGFjaG1lbnREZWxldGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpFdmVudE1vZHVsZSMjIzA0LUNvbmRpdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgbWF0Y2hlcyBjb25kaXRpb25zIGFuZCBleGVjdXRlcyBhY3Rpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JVFNNIEV2ZW50IE1vZHVsIHp1bSDcYmVycHL8ZmVuIHZvbiBDb25kaXRpb25zIHVuZCB6dW0gQXVzZvxocmVuIHZvbiBBY3Rpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpFdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFdvcmtPcmRlckFkZFBvc3R8V29ya09yZGVyVXBkYXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RXZlbnRNb2R1bGUjIyMwNS1IaXN0b3J5QWRkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SVRTTSBldmVudCBtb2R1bGUgdXBkYXRlcyB0aGUgaGlzdG9yeSBvZiB3b3Jrb3JkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JVFNNIEV2ZW50IE1vZHVsIGFrdHVhbGlzaWVydCBkaWUgSGlzdG9yaWUgdm9uIFdvcmtvcmRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFdvcmtPcmRlckFkZFBvc3R8V29ya09yZGVyVXBkYXRlUG9zdHxXb3JrT3JkZXJEZWxldGVQb3N0fFdvcmtPcmRlckxpbmtBZGRQb3N0fFdvcmtPcmRlckxpbmtEZWxldGVQb3N0fFdvcmtPcmRlckF0dGFjaG1lbnRBZGRQb3N0fFdvcmtPcmRlckF0dGFjaG1lbnREZWxldGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlQ3JvbmpvYjo6RXZlbnRNb2R1bGUjIyMwMS1Ob3RpZmljYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHNlbmRzIG5vdGlmaWNhdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklUU00gRXZlbnQgTW9kdWwgenVtIFNlbmRlbiB2b24gQmVuYWNocmljaHRpZ3VuZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlQ3JvbmpvYjo6RXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUmVxdWVzdGVkVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkUG9zdHxXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbEVuZFRpbWVSZWFjaGVkUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZUNyb25qb2I6OkV2ZW50TW9kdWxlIyMjMDItSGlzdG9yeUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklUU00gZXZlbnQgbW9kdWxlIHVwZGF0ZXMgdGhlIGhpc3Rvcnkgb2YgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SVRTTSBFdmVudCBNb2R1bCBha3R1YWxpc2llcnQgZGllIEhpc3RvcmllIHZvbiBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlQ3JvbmpvYjo6RXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlBZGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij4oQ2hhbmdlUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWRQb3N0fENoYW5nZVBsYW5uZWRFbmRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlQWN0dWFsU3RhcnRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlQWN0dWFsRW5kVGltZVJlYWNoZWRQb3N0fENoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkUG9zdHxXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFBvc3R8V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkUG9zdHxXb3JrT3JkZXJBY3R1YWxTdGFydFRpbWVSZWFjaGVkUG9zdHxXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZFBvc3QpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2VDcm9uam9iOjpFdmVudE1vZHVsZSMjIzAzLUNvbmRpdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklUU00gZXZlbnQgbW9kdWxlIHRoYXQgbWF0Y2hlcyBjb25kaXRpb25zIGFuZCBleGVjdXRlcyBhY3Rpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JVFNNIEV2ZW50IE1vZHVsIHp1bSDcYmVycHL8ZmVuIHZvbiBDb25kaXRpb25zIHVuZCB6dW0gQXVzZvxocmVuIHZvbiBBY3Rpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlQ3JvbmpvYjo6RXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6OkNvbmRpdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkUG9zdHxDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZFBvc3R8Q2hhbmdlUmVxdWVzdGVkVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkUG9zdHxXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWRQb3N0fFdvcmtPcmRlckFjdHVhbEVuZFRpbWVSZWFjaGVkUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZU1hbmFnZW1lbnROb3RpZmljYXRpb246OkV2ZW50TW9kdWxlIyMjMDEtSGlzdG9yeUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklUU00gZXZlbnQgbW9kdWxlIHVwZGF0ZXMgdGhlIGhpc3Rvcnkgb2YgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SVRTTSBFdmVudCBNb2R1bCBha3R1YWxpc2llcnQgZGllIEhpc3RvcmllIHZvbiBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpFdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6SGlzdG9yeUFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGFuZ2VOb3RpZmljYXRpb25TZW50UG9zdHxXb3JrT3JkZXJOb3RpZmljYXRpb25TZW50UG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmRpdGlvbjo6RXZlbnRNb2R1bGUjIyMwMS1IaXN0b3J5QWRkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SVRTTSBldmVudCBtb2R1bGUgdXBkYXRlcyB0aGUgaGlzdG9yeSBvZiBjb25kaXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JVFNNIEV2ZW50IE1vZHVsIGFrdHVhbGlzaWVydCBkaWUgSGlzdG9yaWUgdm9uIENvbmRpdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KENvbmRpdGlvbkFkZFBvc3R8Q29uZGl0aW9uVXBkYXRlUG9zdHxDb25kaXRpb25EZWxldGVQb3N0fENvbmRpdGlvbkRlbGV0ZUFsbFBvc3R8RXhwcmVzc2lvbkFkZFBvc3R8RXhwcmVzc2lvblVwZGF0ZVBvc3R8RXhwcmVzc2lvbkRlbGV0ZVBvc3R8RXhwcmVzc2lvbkRlbGV0ZUFsbFBvc3R8QWN0aW9uQWRkUG9zdHxBY3Rpb25VcGRhdGVQb3N0fEFjdGlvbkRlbGV0ZVBvc3R8QWN0aW9uRGVsZXRlQWxsUG9zdHxBY3Rpb25FeGVjdXRlUG9zdCk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNvbmRpdGlvbjo6RXZlbnRNb2R1bGUjIyMwMi1Ob3RpZmljYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JVFNNIGV2ZW50IG1vZHVsZSB0aGF0IHNlbmRzIG5vdGlmaWNhdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklUU00gRXZlbnQgTW9kdWwgenVtIFNlbmRlbiB2b24gQmVuYWNocmljaHRpZ3VuZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFdmVudDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Tm90aWZpY2F0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KEFjdGlvbkV4ZWN1dGVQb3N0KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHJhbnNhY3Rpb24iPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJlZVRleHQ6Ok1heE51bWJlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgbWF4aW1hbGVuIEFuemFobCB2b24gRnJlaVRleHRGZWxkZXJuIGb8ciBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMSBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDEgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDEgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDE6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxIGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxIExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDIgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDIgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyIGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMiBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMiBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDIifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzIGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMyBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMyBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0Mzo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDMgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDMgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQzIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNCBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQ6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0NCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDUgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDUgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA1IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA1IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ1OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNSBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNSBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDUifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA2IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA2IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNiBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNiBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0Njo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDYgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDYgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQ2In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNyBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNyBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDcgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDcgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDc6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA3IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA3IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0NyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDggZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDggZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0OCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA4IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA4IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ4OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgOCBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgOCBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDgifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA5IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA5IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgOSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgOSBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0OTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDkgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDkgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQ5In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDEwIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxMCBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxMCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTAgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDEwOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTAgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDEwIExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MTAifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkxMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTEgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDExIGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkxMTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDExIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxMSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDExIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDExIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxMSBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxMTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDExIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxMSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTE6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxMSBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMTEgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQxMSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTEyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxMiBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMTIgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTEyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTIgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDEyIGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDEyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxMjo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDEyIGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxMiBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDEyIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDEzIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxMyBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxMyBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTMgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDEzOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTMgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDEzIExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MTMifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkxNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTQgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDE0IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkxNDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDE0IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxNDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTQ6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxNCBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMTQgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQxNCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTE1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxNSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMTUgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTE1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTUgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDE1IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDE1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxNTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDE1IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxNSBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDE1In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDE2IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxNiBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxNiBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTYgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDE2OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTYgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDE2IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MTYifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkxNyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTcgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDE3IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkxNzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDE3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDE3IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxNyBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxNzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTc6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxNyBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMTcgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQxNyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTE4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxOCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMTggZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTE4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTggZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDE4IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDE4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxODo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDE4IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxOCBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDE4In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDE5IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxOSBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MTk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQxOSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxOSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTkgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MTk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDE5OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTkgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDE5IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MTkifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjAgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDIwIGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyMDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDIwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDIwIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyMCBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyMDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjA6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyMCBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjAgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQyMCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTIxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAyMSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMjEgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTIxOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDIxIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMjEgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDIxIGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDIxOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDIxIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyMTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDIxIGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAyMSBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDIxIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MjIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDIyIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAyMiBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MjI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyMiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjIgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyMiBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMjIgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyMiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjIgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDIyOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMjIgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDIyIExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MjIifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjMgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDIzIGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyMzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIzIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDIzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDIzIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyMyBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyMzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIzIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjM6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyMyBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjMgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQyMyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTI0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAyNCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMjQgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTI0OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI0IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMjQgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDI0IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDI0OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI0IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyNDo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDI0IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAyNCBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDI0In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MjUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDI1IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAyNSBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MjU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyNSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjUgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyNSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMjUgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyNSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjUgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDI1OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMjUgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDI1IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MjUifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjYgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDI2IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyNjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI2IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDI2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDI2IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyNiBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyNjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI2IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjY6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyNiBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjYgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQyNiJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTI3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAyNyBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMjcgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTI3OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI3IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MjciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMjcgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDI3IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDI3OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI3IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyNzo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDI3IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAyNyBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDI3In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MjgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDI4IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAyOCBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5Mjg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyOCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjggd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyOCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyOCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMjggZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0Mjg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyOCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjggd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDI4OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMjggbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDI4IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MjgifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyOSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjkgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDI5IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkyOTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI5IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDI5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDI5IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyOSBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQyOTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI5IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0Mjk6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyOSBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjkgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQyOSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTMwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzMCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzAgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTMwOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzAgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMwIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzAgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDMwIGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDMwOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzAgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMwIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzMDo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDMwIGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzMCBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDMwIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MzEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDMxIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzMSBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MzE6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzMSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAzMSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMzEgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzE6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzMSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDMxOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMzEgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDMxIExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MzEifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMzIgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDMyIGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzMjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDMyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzMiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDMyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDMyIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAzMiBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzMjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDMyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzMiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzI6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAzMiBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMzIgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQzMiJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTMzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzMyBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzMgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTMzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzMgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMzIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzMgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDMzIGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDMzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzMgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMzIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzMzo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDMzIGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzMyBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDMzIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MzQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDM0IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzNCBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MzQ6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAzNCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMzQgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzQ6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDM0OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMzQgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDM0IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MzQifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMzUgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDM1IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzNTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzNSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDM1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDM1IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAzNSBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzNTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzNSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzU6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAzNSBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMzUgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQzNSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTM2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzNiBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzYgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTM2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzYgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM2IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzYgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDM2IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDM2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzYgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM2IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzNjo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDM2IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzNiBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDM2In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5MzciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDM3IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzNyBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5Mzc6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzNyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAzNyBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMzcgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0Mzc6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDM3OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMzcgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDM3IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0MzcifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzOCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMzggZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDM4IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXkzODo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzOCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDM4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDM4IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAzOCBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzODo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzOCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0Mzg6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAzOCBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMzggTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQzOCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTM5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzOSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzkgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTM5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzkgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM5IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0MzkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzkgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDM5IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDM5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzkgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM5IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQzOTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDM5IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzOSBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDM5In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQwIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0MCBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0MCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDAgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQwOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDAgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQwIExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0NDAifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk0MSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNDEgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDQxIGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk0MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQxIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0MSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQxIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA0MSBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQxIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0MSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDE6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0MSBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNDEgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQ0MSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTQyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA0MiBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNDIgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTQyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNDIgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQyIGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0Mjo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDQyIGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0MiBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDQyIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQzIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0MyBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0MyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0MyBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDMgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQzOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDMgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQzIExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0NDMifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk0NCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNDQgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDQ0IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk0NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQ0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQ0IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA0NCBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDQ6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0NCBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNDQgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQ0NCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTQ1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA0NSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNDUgZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTQ1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNDUgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQ1IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQ1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0NTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDQ1IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0NSBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDQ1In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQ2IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0NiBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0NiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0NiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0NiBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDYgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0NiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQ2OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDYgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQ2IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0NDYifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk0NyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNDcgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDQ3IGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk0Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQ3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQ3IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA0NyBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDc6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0NyBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNDcgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQ0NyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTQ4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA0OCBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNDggZvxyIENoYW5nZXMuIERhbWl0IGthbm4gZWluZSBuZXVlIENoYW5nZS1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZUtleTQ4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNDggZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQ4IGb8ciBDaGFuZ2VzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgQ2hhbmdlLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQ4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0ODo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDQ4IGxpbmsgZm9yIGNoYW5nZXMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgY2hhbmdlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0OCBMaW5rIGb8ciBjaGFuZ2VzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgQ2hhbmdlLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJDaGFuZ2VGcmVlVGV4dDQ4In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQ5IGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0OSBm/HIgQ2hhbmdlcy4gRGFtaXQga2FubiBlaW5lIG5ldWUgQ2hhbmdlLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlS2V5NDk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0OSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ0OSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0OSBmb3IgY2hhbmdlcy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgY2hhbmdlIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDkgZvxyIENoYW5nZXMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBDaGFuZ2UtQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NDk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0OSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDQ5OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDkgbGluayBmb3IgY2hhbmdlcy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSBjaGFuZ2Ugdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQ5IExpbmsgZvxyIGNoYW5nZXMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBDaGFuZ2UtQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IkNoYW5nZUZyZWVUZXh0NDkifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk1MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNTAgZm9yIGNoYW5nZXMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IGNoYW5nZSBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDUwIGb8ciBDaGFuZ2VzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBDaGFuZ2UtRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVLZXk1MDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDUwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1MCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJDaGFuZ2VGcmVlVGV4dDUwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDUwIGZvciBjaGFuZ2VzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyBjaGFuZ2UgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA1MCBm/HIgQ2hhbmdlcy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIENoYW5nZS1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQ2hhbmdlRnJlZVRleHQ1MDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDUwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1MCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkNoYW5nZUZyZWVUZXh0NTA6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA1MCBsaW5rIGZvciBjaGFuZ2VzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IGNoYW5nZSB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNTAgTGluayBm/HIgY2hhbmdlcy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIENoYW5nZS1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiQ2hhbmdlRnJlZVRleHQ1MCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkNhY2hlVFRMIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q2FjaGUgdGltZSBpbiBtaW51dGVzIGZvciB0aGUgY2hhbmdlIG1hbmFnZW1lbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkNhY2hlLVplaXQgaW4gTWludXRlbiBm/HIgZGFzIENoYW5nZSBNYW5hZ2VtZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpDYWNoZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTgwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHlwZXMgb2YgdGlja2V0cywgd2hlcmUgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgYSBsaW5rIHRvIGFkZCBhIGNoYW5nZSB3aWxsIGJlIGRpc3BsYXllZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VHlwZW4gZGVyIFRpY2tldHMsIGluIGRlbmVuIGltIFRpY2tldC1ab29tIGVpbiBMaW5rIGFuZ2V6ZWlndCB3aXJkLCB1bSBlaW5lbiBDaGFuZ2UgenUgZXJzdGVsbGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+UmZDPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OlJlc3RyaWN0VGlja2V0VHlwZXM6Okdyb3VwcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9ubHkgdXNlcnMgb2YgdGhlc2UgZ3JvdXBzIGhhdmUgdGhlIHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0aWNrZXQgdHlwZXMgYXMgZGVmaW5lZCBpbiAiSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIiBpZiB0aGUgZmVhdHVyZSAiVGlja2V0OjpBY2w6Ok1vZHVsZSMjIzIwMC1UaWNrZXQ6OkFjbDo6TW9kdWxlIiBpcyBlbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OdXIgZGllIE1pdGdsaWVkZXIgZGllc2VyIEdydXBwZW4gaGFiZW4gZGllIEVybGF1Ym5pcyBkaWUgVGlja2V0LVR5cGVuIHp1IHZlcndlbmRlbiwgZGllIGluICJJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMiIGRlZmluaWVydCBzaW5kLCB3ZW5uIGRhcyBGZWF0dXJlICJUaWNrZXQ6OkFjbDo6TW9kdWxlIyMjMjAwLVRpY2tldDo6QWNsOjpNb2R1bGUiIGFrdGl2aWVydCBpc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPml0c20tY2hhbmdlLWJ1aWxkZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5pdHNtLWNoYW5nZS1tYW5hZ2VyPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkNvdW50ZXJMb2ciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Mb2dmaWxlIGZvciB0aGUgaXRzbSBjaGFuZ2UgY291bnRlci4gVGhpcyBmaWxlIGlzIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBjaGFuZ2UgbnVtYmVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+UGZhZCB1bmQgVmVyemVpY2huaXMgenVyIExvZ2RhdGVpIGb8ciBkZW4gSVRTTSBDaGFuZ2UtQ291bnRlci4gRGllc2UgRGF0ZWkgaGlsZnQgYmVpIGRlciBFcnpldWd1bmcgdm9uIENoYW5nZS1OdW1tZXJuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4mbHQ7T1RSU19DT05GSUdfSG9tZSZndDsvdmFyL2xvZy9JVFNNQ2hhbmdlQ291bnRlci5sb2c8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpIb29rIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGlkZW50aWZpZXIgZm9yIGEgY2hhbmdlLCBlLmcuIENoYW5nZSMsIE15Q2hhbmdlIy4gVGhlIGRlZmF1bHQgaXMgQ2hhbmdlIy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+Q2hhbmdlLUlkZW50aWZpa2F0b3IsIHouIEIuIENoYW5nZSMsIE1laW5DaGFuZ2UjLiBBbHMgU3RhbmRhcmQgd2lyZCBDaGFuZ2UjIHZlcndlbmRldC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Q2hhbmdlIzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OlN0YXRlOjpTaWduYWwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIHNpZ25hbCBmb3IgZWFjaCBJVFNNQ2hhbmdlIHN0YXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcmVuIGVpbmVzIFNpZ25hbHMgZvxyIGVpbmVuIElUU01DaGFuZ2UtU3RhdHVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InJlcXVlc3RlZCI+Z3JheWxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icGVuZGluZyBhcHByb3ZhbCI+eWVsbG93bGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJyZWplY3RlZCI+cmVkbGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJhcHByb3ZlZCI+Z3JlZW5sZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImluIHByb2dyZXNzIj55ZWxsb3dsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InBlbmRpbmcgcGlyIj55ZWxsb3dsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InN1Y2Nlc3NmdWwiPmdyZWVubGVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJmYWlsZWQiPnJlZGxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY2FuY2VsZWQiPnJlZGxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icmV0cmFjdGVkIj5ncmF5bGVkPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6Q2F0ZWdvcnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNhdGVnb3J5IG9mIGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXIgU3RhbmRhcmQtV2VydCBm/HIgZGllIEthdGVnb3JpZSBlaW5lcyBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkltcGFjdDo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW1wYWN0IG9mIGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZXIgU3RhbmRhcmQtV2VydCBm/HIgZGllIEF1c3dpcmt1bmcgZWluZXMgQ2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MyBub3JtYWw8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpBdHRyaWJ1dGU6OkNvbXBhcmVWYWx1ZTo6RmllbGRUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgZmllbGQgdHlwZSBvZiBDb21wYXJlVmFsdWUgZmllbGRzIGZvciBjaGFuZ2UgYXR0cmlidXRlcyB1c2VkIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuIFZhbGlkIHZhbHVlcyBhcmUgU2VsZWN0aW9uLCBUZXh0IGFuZCBEYXRlLiBJZiBhIHR5cGUgaXMgbm90IGRlZmluZWQsIHRoZSBmaWVsZCB3aWxsIG5vdCBiZSBzaG93bi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRlbiBGZWxkLVR5cCBm/HIgQ29tcGFyZVZhbHVlIEZlbGRlciBm/HIgQ2hhbmdlLUF0dHJpYnV0ZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LiBH/Gx0aWdlIFdlcnRlIHNpbmQgU2VsZWN0aW9uLCBUZXh0IHVuZCBEYXRlLiBXZW5uIGtlaW4gVHlwIGRlZmluaWVydCBpc3QsIGRhbm4gd2lyZCBkYXMgZmVsZCBuaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+U2VsZWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSI+VGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnlJRCI+U2VsZWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+U2VsZWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj5TZWxlY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXJJRCI+U2VsZWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVySUQiPlNlbGVjdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPkRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+RGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+VGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+VGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlRnJlZUtleSI+VGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlRnJlZVRleHQiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpFeHByZXNzaW9uOjpPYmplY3Q6OkF0dHJpYnV0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIGNoYW5nZSBvYmplY3RzIGluIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT2JqZWt0LUF0dHJpYnV0ZSBkaWUgZvxyIENoYW5nZS1PYmpla3RlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlSUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeUlEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHlJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTWFuYWdlcklEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVySUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFZmZvcnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY291bnRlZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUZyZWVLZXkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUZyZWVUZXh0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZVN0YXRlSUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VTdGF0ZUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBDaGFuZ2VTdGF0ZUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZVRpdGxlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQ2hhbmdlVGl0bGUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IENoYW5nZVRpdGxlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NhdGVnb3J5SUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDYXRlZ29yeUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBDYXRlZ29yeUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0ltcGFjdElEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgSW1wYWN0SUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IEltcGFjdElEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1ByaW9yaXR5SUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQcmlvcml0eUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQcmlvcml0eUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZU1hbmFnZXJJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENoYW5nZU1hbmFnZXJJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgQ2hhbmdlTWFuYWdlcklEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZUJ1aWxkZXJJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENoYW5nZUJ1aWxkZXJJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgQ2hhbmdlQnVpbGRlcklEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1JlcXVlc3RlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBSZXF1ZXN0ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBSZXF1ZXN0ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRTdGFydFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQbGFubmVkU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFbmRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZEVuZFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFBsYW5uZWRFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjdHVhbFN0YXJ0VGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgQWN0dWFsU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbEVuZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY3R1YWxFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBBY3R1YWxFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFZmZvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkRWZmb3J0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQbGFubmVkRWZmb3J0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjY291bnRlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY2NvdW50ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBBY2NvdW50ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZUZyZWVLZXkiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VGcmVlS2V5IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBDaGFuZ2VGcmVlS2V5IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZUZyZWVUZXh0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQ2hhbmdlRnJlZVRleHQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IENoYW5nZUZyZWVUZXh0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpPYmplY3Q6OkF0dHJpYnV0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIGNoYW5nZSBvYmplY3RzIGluIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT2JqZWt0LUF0dHJpYnV0ZSBkaWUgZvxyIENoYW5nZS1PYmpla3RlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5SUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdElEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VySUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXJJRCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVmZm9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWNjb3VudGVkVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlRnJlZUtleSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlRnJlZVRleHQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNDaGFuZ2VTdGF0ZUlEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQ2hhbmdlU3RhdGVJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgQ2hhbmdlU3RhdGVJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibG9jayI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0NoYW5nZVRpdGxlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQ2hhbmdlVGl0bGUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IENoYW5nZVRpdGxlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQ2F0ZWdvcnlJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENhdGVnb3J5SUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IENhdGVnb3J5SUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNJbXBhY3RJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEltcGFjdElEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBJbXBhY3RJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1ByaW9yaXR5SUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQcmlvcml0eUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQcmlvcml0eUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQ2hhbmdlTWFuYWdlcklEIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQ2hhbmdlTWFuYWdlcklEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBDaGFuZ2VNYW5hZ2VySUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNDaGFuZ2VCdWlsZGVySUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBDaGFuZ2VCdWlsZGVySUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IENoYW5nZUJ1aWxkZXJJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1JlcXVlc3RlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBSZXF1ZXN0ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBSZXF1ZXN0ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjUGxhbm5lZFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFBsYW5uZWRTdGFydFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFBsYW5uZWRTdGFydFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQbGFubmVkRW5kVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFBsYW5uZWRFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQbGFubmVkRW5kVGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjdHVhbFN0YXJ0VGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgQWN0dWFsU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQWN0dWFsRW5kVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjdHVhbEVuZFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IEFjdHVhbEVuZFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZEVmZm9ydCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgUGxhbm5lZEVmZm9ydCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjY291bnRlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY2NvdW50ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBBY2NvdW50ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQ2hhbmdlRnJlZUtleSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENoYW5nZUZyZWVLZXkgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IENoYW5nZUZyZWVLZXkgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNDaGFuZ2VGcmVlVGV4dCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIENoYW5nZUZyZWVUZXh0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBDaGFuZ2VGcmVlVGV4dCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkF0dHJpYnV0ZTo6Q29tcGFyZVZhbHVlOjpGaWVsZFR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBmaWVsZCB0eXBlcyBmb3IgQ29tcGFyZVZhbHVlIGZpZWxkcyBvZiB3b3Jrb3JkZXIgYXR0cmlidXRlcyB1c2VkIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuIElmIGEgdHlwZSBpcyBub3QgZGVmaW5lZCwgdGhlIGZpZWxkIHdpbGwgbm90IGJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGVuIEZlbGQtVHlwIGb8ciBDb21wYXJlVmFsdWUgRmVsZGVyIGb8ciBXb3Jrb3JkZXItQXR0cmlidXRlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuIFdlbm4ga2VpbiBUeXAgZGVmaW5pZXJ0IGlzdCwgZGFubiB3aXJkIGRhcyBmZWxkIG5pY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6SVRTTVdvcmtPcmRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJOdW1iZXIiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclN0YXRlSUQiPlNlbGVjdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVHlwZUlEIj5TZWxlY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclRpdGxlIj5UZXh0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJBZ2VudElEIj5TZWxlY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPkRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj5EYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPkRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPkRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFZmZvcnQiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY291bnRlZFRpbWUiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckZyZWVLZXkiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckZyZWVUZXh0Ij5UZXh0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6T2JqZWN0OjpBdHRyaWJ1dGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvYmplY3QgYXR0cmlidXRlcyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB3b3Jrb3JkZXIgb2JqZWN0cyBpbiBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9iamVrdC1BdHRyaWJ1dGUgZGllIGb8ciBXb3Jrb3JkZXItT2JqZWt0ZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjo6SVRTTVdvcmtPcmRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJOdW1iZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclN0YXRlSUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclR5cGVJRCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckFnZW50SUQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFZmZvcnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjY291bnRlZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckZyZWVLZXkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckZyZWVUZXh0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlck51bWJlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlck51bWJlciBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgV29ya09yZGVyTnVtYmVyIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlclN0YXRlSUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJTdGF0ZUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBXb3JrT3JkZXJTdGF0ZUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlclR5cGVJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlclR5cGVJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgV29ya09yZGVyVHlwZUlEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlclRpdGxlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyVGl0bGUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFdvcmtPcmRlclRpdGxlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlckFnZW50SUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJBZ2VudElEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBXb3JrT3JkZXJBZ2VudElEIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRTdGFydFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQbGFubmVkU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFbmRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZEVuZFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFBsYW5uZWRFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbFN0YXJ0VGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjdHVhbFN0YXJ0VGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgQWN0dWFsU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjdHVhbEVuZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY3R1YWxFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBBY3R1YWxFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFZmZvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkRWZmb3J0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQbGFubmVkRWZmb3J0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI0FjY291bnRlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBBY2NvdW50ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBBY2NvdW50ZWRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlckZyZWVLZXkiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJGcmVlS2V5IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBXb3JrT3JkZXJGcmVlS2V5IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6RXhwcmVzc2lvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlckZyZWVUZXh0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyRnJlZVRleHQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFdvcmtPcmRlckZyZWVUZXh0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGVtcHR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBub3QgZW1wdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGdyZWF0ZXIgdGhhbiI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iaXMgbGVzcyB0aGFuIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpcyBiZWZvcmUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImlzIGFmdGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJjb250YWlucyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90IGNvbnRhaW5zIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiZWdpbnMgd2l0aCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZW5kcyB3aXRoIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpPYmplY3Q6OkF0dHJpYnV0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHdvcmtvcmRlciBvYmplY3RzIGluIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT2JqZWt0LUF0dHJpYnV0ZSBkaWUgZvxyIFdvcmtvcmRlci1PYmpla3RlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyTnVtYmVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJTdGF0ZUlEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJUeXBlSUQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclRpdGxlIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJBZ2VudElEIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRWZmb3J0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2NvdW50ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJGcmVlS2V5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJGcmVlVGV4dCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlck51bWJlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlck51bWJlciBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgV29ya09yZGVyTnVtYmVyIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjV29ya09yZGVyU3RhdGVJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlclN0YXRlSUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFdvcmtPcmRlclN0YXRlSUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImxvY2siPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNXb3JrT3JkZXJUeXBlSUQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBXb3JrT3JkZXJUeXBlSUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFdvcmtPcmRlclR5cGVJRCBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlclRpdGxlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyVGl0bGUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFdvcmtPcmRlclRpdGxlIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjV29ya09yZGVyQWdlbnRJRCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIFdvcmtPcmRlckFnZW50SUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFdvcmtPcmRlckFnZW50SUQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNQbGFubmVkU3RhcnRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZFN0YXJ0VGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgUGxhbm5lZFN0YXJ0VGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFbmRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgUGxhbm5lZEVuZFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFBsYW5uZWRFbmRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQWN0dWFsU3RhcnRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQWN0dWFsU3RhcnRUaW1lIGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBBY3R1YWxTdGFydFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNBY3R1YWxFbmRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgQWN0dWFsRW5kVGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgQWN0dWFsRW5kVGltZSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1BsYW5uZWRFZmZvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgc2VsZWN0YWJsZSBmb3IgdGhlIGF0dHJpYnV0ZSBQbGFubmVkRWZmb3J0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgT3BlcmF0b3JlbiBkaWUgZvxyIGRhcyBBdHRyaWJ1dCBQbGFubmVkRWZmb3J0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yIyMjQWNjb3VudGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBzZWxlY3RhYmxlIGZvciB0aGUgYXR0cmlidXRlIEFjY291bnRlZFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IEFjY291bnRlZFRpbWUgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Db25kaXRpb246OkFjdGlvbjo6SVRTTVdvcmtPcmRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJzZXQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpNYXBwaW5nOjpBY3Rpb246OkF0dHJpYnV0ZTo6T3BlcmF0b3IjIyNXb3JrT3JkZXJGcmVlS2V5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyRnJlZUtleSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIE9wZXJhdG9yZW4gZGllIGb8ciBkYXMgQXR0cmlidXQgV29ya09yZGVyRnJlZUtleSBpbiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0IGF1c2dld+RobHQgd2VyZGVuIGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InNldCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6Ok1hcHBpbmc6OkFjdGlvbjo6QXR0cmlidXRlOjpPcGVyYXRvciMjI1dvcmtPcmRlckZyZWVUZXh0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIHNlbGVjdGFibGUgZm9yIHRoZSBhdHRyaWJ1dGUgV29ya09yZGVyRnJlZVRleHQgaW4gQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBPcGVyYXRvcmVuIGRpZSBm/HIgZGFzIEF0dHJpYnV0IFdvcmtPcmRlckZyZWVUZXh0IGluIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQgYXVzZ2V35GhsdCB3ZXJkZW4ga/ZubmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb246OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ic2V0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ6Ok1heE51bWJlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgbWF4aW1hbGVuIEFuemFobCB2b24gRnJlaVRleHRGZWxkZXJuIGb8ciBXb3Jrb3JkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+NTA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMSBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDEgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDEgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDE6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxIGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxIExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDIgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDIgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyIGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMiBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMiBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDIifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzIGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMyBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMyBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0Mzo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDMgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDMgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQzIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNCBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQ6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0NCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDUgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDUgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA1IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA1IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ1OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNSBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNSBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDUifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA2IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA2IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNiBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNiBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0Njo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDYgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDYgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQ2In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNyBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNyBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDcgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDcgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDc6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA3IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA3IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0NyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDggZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDggZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0OCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA4IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA4IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ4OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgOCBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgOCBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDgifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA5IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA5IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgOSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgOSBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0OTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDkgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDkgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQ5In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDEwIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxMCBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxMCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTAgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDEwOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTAgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDEwIExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MTAifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkxMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTEgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDExIGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkxMTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDExIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxMSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDExIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDExIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxMSBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxMTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDExIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxMSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTE6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxMSBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMTEgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQxMSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTEyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxMiBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMTIgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTEyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTIgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDEyIGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDEyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDEyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxMjo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDEyIGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxMiBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDEyIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDEzIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxMyBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxMyBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTMgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxMyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDEzOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTMgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDEzIExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MTMifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkxNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTQgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDE0IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkxNDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDE0IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxNDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTQ6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxNCBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMTQgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQxNCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTE1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxNSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMTUgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTE1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTUgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDE1IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDE1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxNTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDE1IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxNSBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDE1In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDE2IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxNiBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxNiBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTYgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxNiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDE2OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTYgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDE2IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MTYifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkxNyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMTcgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDE3IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkxNzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDE3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDE3IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAxNyBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxNzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTc6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAxNyBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMTcgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQxNyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTE4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxOCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMTggZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTE4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTggZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDE4IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDE4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMTggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDE4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxODo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDE4IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAxOCBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDE4In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDE5IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAxOSBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MTk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQxOSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxOSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTkgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MTk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAxOSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMTkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDE5OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMTkgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDE5IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MTkifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjAgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDIwIGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyMDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDIwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDIwIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyMCBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyMDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjA6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyMCBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjAgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQyMCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTIxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAyMSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMjEgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTIxOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDIxIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMjEgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDIxIGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDIxOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjEgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDIxIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyMTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDIxIGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAyMSBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDIxIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MjIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDIyIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAyMiBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MjI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyMiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjIgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyMiBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMjIgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjI6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyMiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjIgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDIyOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMjIgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDIyIExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MjIifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjMgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDIzIGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyMzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIzIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDIzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDIzIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyMyBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyMzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDIzIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyMyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjM6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyMyBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjMgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQyMyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTI0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAyNCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMjQgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTI0OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI0IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMjQgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDI0IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDI0OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjQgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI0IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyNDo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDI0IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAyNCBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDI0In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MjUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDI1IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAyNSBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MjU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyNSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjUgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyNSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMjUgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjU6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyNSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjUgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDI1OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMjUgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDI1IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MjUifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjYgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDI2IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyNjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI2IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDI2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDI2IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyNiBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyNjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI2IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjY6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyNiBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjYgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQyNiJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTI3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAyNyBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMjcgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTI3OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI3IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MjciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMjcgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDI3IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDI3OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMjcgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDI3IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyNzo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDI3IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAyNyBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDI3In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MjgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDI4IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAyOCBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5Mjg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyOCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjggd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyOCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAyOCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMjggZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0Mjg6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAyOCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMjggd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDI4OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMjggbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDI4IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MjgifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyOSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMjkgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDI5IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkyOTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI5IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDI5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDI5IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAyOSBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQyOTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDI5IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAyOSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0Mjk6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAyOSBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMjkgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQyOSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTMwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzMCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzAgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTMwOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzAgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMwIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzAgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDMwIGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDMwOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzAgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMwIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzMDo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDMwIGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzMCBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDMwIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MzEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDMxIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzMSBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MzE6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzMSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAzMSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMzEgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzE6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzMSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzEgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDMxOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMzEgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDMxIExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MzEifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMzIgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDMyIGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzMjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDMyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzMiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDMyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDMyIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAzMiBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzMjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDMyIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzMiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzI6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAzMiBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMzIgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQzMiJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTMzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzMyBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzMgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTMzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzMgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMzIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzMgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDMzIGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDMzOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzMgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDMzIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzMzo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDMzIGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzMyBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDMzIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MzQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDM0IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzNCBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MzQ6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAzNCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMzQgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzQ6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzQgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDM0OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMzQgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDM0IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MzQifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMzUgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDM1IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzNTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzNSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDM1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDM1IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAzNSBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzNTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzNSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzU6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAzNSBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMzUgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQzNSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTM2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzNiBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzYgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTM2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzYgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM2IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzYgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDM2IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDM2OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzYgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM2IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzNjo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDM2IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzNiBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDM2In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5MzciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDM3IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyAzNyBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5Mzc6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzNyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAzNyBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMzcgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0Mzc6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCAzNyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgMzcgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDM3OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgMzcgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDM3IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MzcifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzOCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgMzggZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDM4IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXkzODo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzOCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDM4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDM4IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyAzOCBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzODo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDM4IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAzOCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0Mzg6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCAzOCBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgMzggTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQzOCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTM5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAzOSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgMzkgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTM5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzkgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM5IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0MzkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMzkgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDM5IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDM5OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgMzkgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDM5IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQzOTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDM5IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyAzOSBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDM5In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQwIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0MCBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0MCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDAgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDA6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MCBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDAgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQwOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDAgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQwIExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0NDAifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk0MSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNDEgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDQxIGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk0MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQxIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0MSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQxIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA0MSBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0MTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQxIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0MSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDE6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0MSBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNDEgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQ0MSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTQyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA0MiBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNDIgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTQyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNDIgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQyIGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQyOjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDIgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQyIHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0Mjo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDQyIGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0MiBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDQyIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQzIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0MyBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0MyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0MyBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDMgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDM6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0MyBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDMgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQzOjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDMgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQzIExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0NDMifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk0NCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNDQgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDQ0IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk0NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQ0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQ0IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA0NCBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0NDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDQ6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0NCBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNDQgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQ0NCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTQ1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA0NSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNDUgZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTQ1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNDUgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQ1IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQ1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDUgaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ1IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0NTo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDQ1IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0NSBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDQ1In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQ2IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0NiBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0NiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0NiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0NiBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDYgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0NiBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDYgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQ2OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDYgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQ2IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0NDYifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk0NyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNDcgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDQ3IGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk0Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQ3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDQ3IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA0NyBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0Nzo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDQ3IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA0NyB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDc6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA0NyBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNDcgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQ0NyJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTQ4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCA0OCBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVNjaGz8c3NlbC1GZWxkZXMgNDggZvxyIFdvcmtvcmRlcnMuIERhbWl0IGthbm4gZWluZSBuZXVlIFdvcmtPcmRlci1FaWdlbnNjaGFmdCBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcm9kdWN0Ij5Qcm9kdWN0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZUtleTQ4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDgiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgNDggZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDQ4IGb8ciBXb3Jrb3JkZXJzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgV29ya29yZGVyLUF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBDIj5QQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90ZWJvb2siPk5vdGVib29rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQaG9uZSI+UGhvbmU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQ4OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIEZyZWVUZXh0RmllbGQgNDggaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgZGVmaW5lZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIFN0YW5kYXJkLUF1c3dhaGwgZGVzIEZyZWlUZXh0RmVsZGVzIDQ4IHdlbm4gbWVocmVyZSBPcHRpb25lbiBkZWZpbmllcnQgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vdGVib29rPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0ODo6TGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSB0ZXh0IGZpZWxkIDQ4IGxpbmsgZm9yIHdvcmtvcmRlcnMuIFNvIHRoaXMgaHR0cCBsaW5rIHdpbGwgYmUgdXNlZCBpbiBhbnkgd29ya29yZGVyIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1UZXh0LUZlbGRlcyA0OCBMaW5rIGb8ciBXb3Jrb3JkZXJzLiBEaWVzZXIgaHR0cC1MaW5rIHdpcmQgaW4gamVkZXIgV29ya29yZGVyLUFuc2ljaHQgZXJzY2hlaW5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9zb21lLmV4YW1wbGUuY29tL2hhbmRsZT9xdWVyeT0kTFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDQ4In08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDQ5IGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tU2NobPxzc2VsLUZlbGRlcyA0OSBm/HIgV29ya29yZGVycy4gRGFtaXQga2FubiBlaW5lIG5ldWUgV29ya09yZGVyLUVpZ2Vuc2NoYWZ0IGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByb2R1Y3QiPlByb2R1Y3Q8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlS2V5NDk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0OSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ0OSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCA0OSBmb3Igd29ya29yZGVycy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgd29ya29yZGVyIGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgNDkgZvxyIFdvcmtvcmRlcnMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBXb3Jrb3JkZXItQXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUEMiPlBDPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3RlYm9vayI+Tm90ZWJvb2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBob25lIj5QaG9uZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NDk6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgRnJlZVRleHRGaWVsZCA0OSBpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBkZWZpbmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgU3RhbmRhcmQtQXVzd2FobCBkZXMgRnJlaVRleHRGZWxkZXMgNDkgd2VubiBtZWhyZXJlIE9wdGlvbmVuIGRlZmluaWVydCBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+Tm90ZWJvb2s8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDQ5OjpMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIHRleHQgZmllbGQgNDkgbGluayBmb3Igd29ya29yZGVycy4gU28gdGhpcyBodHRwIGxpbmsgd2lsbCBiZSB1c2VkIGluIGFueSB3b3Jrb3JkZXIgdmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaWVuLVRleHQtRmVsZGVzIDQ5IExpbmsgZvxyIFdvcmtvcmRlcnMuIERpZXNlciBodHRwLUxpbmsgd2lyZCBpbiBqZWRlciBXb3Jrb3JkZXItQW5zaWNodCBlcnNjaGVpbmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyOjpGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+aHR0cDovL3NvbWUuZXhhbXBsZS5jb20vaGFuZGxlP3F1ZXJ5PSRMUURhdGF7IldvcmtPcmRlckZyZWVUZXh0NDkifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk1MCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgZnJlZSBrZXkgZmllbGQgNTAgZm9yIHdvcmtvcmRlcnMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHdvcmtvcmRlciBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWllbi1TY2hs/HNzZWwtRmVsZGVzIDUwIGb8ciBXb3Jrb3JkZXJzLiBEYW1pdCBrYW5uIGVpbmUgbmV1ZSBXb3JrT3JkZXItRWlnZW5zY2hhZnQgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJvZHVjdCI+UHJvZHVjdDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVLZXk1MDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDUwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1MCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXb3JrT3JkZXJGcmVlVGV4dDUwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBGcmVlVGV4dEZpZWxkIDUwIGZvciB3b3Jrb3JkZXJzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB3b3Jrb3JkZXIgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpVGV4dEZlbGRlcyA1MCBm/HIgV29ya29yZGVycy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFdvcmtvcmRlci1BdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQQyI+UEM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGVib29rIj5Ob3RlYm9vazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGhvbmUiPlBob25lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV29ya09yZGVyRnJlZVRleHQ1MDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDUwIGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyA1MCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Ob3RlYm9vazwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldvcmtPcmRlckZyZWVUZXh0NTA6OkxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUgdGV4dCBmaWVsZCA1MCBsaW5rIGZvciB3b3Jrb3JkZXJzLiBTbyB0aGlzIGh0dHAgbGluayB3aWxsIGJlIHVzZWQgaW4gYW55IHdvcmtvcmRlciB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpZW4tVGV4dC1GZWxkZXMgNTAgTGluayBm/HIgV29ya29yZGVycy4gRGllc2VyIGh0dHAtTGluayB3aXJkIGluIGplZGVyIFdvcmtvcmRlci1BbnNpY2h0IGVyc2NoZWluZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI6OkZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5odHRwOi8vc29tZS5leGFtcGxlLmNvbS9oYW5kbGU/cXVlcnk9JExRRGF0YXsiV29ya09yZGVyRnJlZVRleHQ1MCJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6SG9vayIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBpZGVudGlmaWVyIGZvciBhIGNoYW5nZSwgZS5nLiBXb3Jrb3JkZXIjLCBNeVdvcmtvcmRlciMuIFRoZSBkZWZhdWx0IGlzIFdvcmtvcmRlciMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldvcmtvcmRlci1JZGVudGlmaWthdG9yLCB6LiBCLiBXb3Jrb3JkZXIjLCBNZWluZVdvcmtvcmRlciMuIEFscyBTdGFuZGFyZCB3aXJkIFdvcmtvcmRlciMgdmVyd2VuZGV0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5Xb3Jrb3JkZXIjPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6U3RhdGU6OlNpZ25hbCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgc2lnbmFsIGZvciB3b3Jrb3JkZXIgc3RhdGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcmVuIGVpbmVzIFNpZ25hbHMgZvxyIGVpbmVuIFdvcmtvcmRlci1TdGF0dXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iY3JlYXRlZCI+Z3JheWxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYWNjZXB0ZWQiPmdyYXlsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InJlYWR5Ij55ZWxsb3dsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImluIHByb2dyZXNzIj55ZWxsb3dsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNsb3NlZCI+Z3JlZW5sZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImNhbmNlbGVkIj5yZWRsZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpUeXBlOjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCB0eXBlIGZvciBhIHdvcmtvcmRlci4gVGhpcyBlbnRyeSBtdXN0IGV4aXN0IGluIGdlbmVyYWwgY2F0YWxvZyBjbGFzcyAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpUeXBlJy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQtVHlwIGb8ciBlaW5lIFdvcmtvcmRlci4gRGllc2VyIEVpbnRyYWcgbXVzcyBpbiBkZXIgR2VuZXJhbCBDYXRhbG9nIEtsYXNzZSAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpUeXBlJyBleGlzdGllcmVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj53b3Jrb3JkZXI8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpBY3R1YWxTdGFydFRpbWVTZXQ6OlN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkEgbGlzdCBvZiB3b3Jrb3JkZXIgc3RhdGVzLCBhdCB3aGljaCB0aGUgQWN0dWFsU3RhcnRUaW1lIG9mIGEgd29ya29yZGVyIHdpbGwgYmUgc2V0IGlmIGl0IHdhcyBlbXB0eSBhdCB0aGlzIHBvaW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5lIExpc3RlIHZvbiBXb3Jrb3JkZXItU3RhdGVzIGJlaSBkZW5lbiBkaWUgQWN0dWFsU3RhcnRUaW1lIGVpbmVyIFdvcmtvcmRlciBnZXNldHp0IHdpcmQsIHdlbm4gZGllc2Ugdm9yaGVyIG5pY2h0IGdlc2V0enQgd2FyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+aW4gcHJvZ3Jlc3M8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6VGFrZVBlcm1pc3Npb246Okxpc3QiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BIGxpc3Qgb2YgYWdlbnRzLiBBZ2VudHMgY2FuIHRha2UgYSB3b3Jrb3JkZXIsIHdoZW4gdGhlIGN1cnJlbnQgd29ya29yZGVyIGFnZW50IGlzIGluIHRoYXQgbGlzdC4gS2V5IGlzIGEgbG9naW4gbmFtZS4gQ29udGVudCBpcyAwIG9yIDEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxpc3RlIHZvbiBBZ2VudGVuLiBBZ2VudGVuIGv2bm5lbiBlaW5lIFdvcmtvcmRlciD8YmVybmVobWVuLCB3ZW5uIGRlciBha3R1ZWxsZSBXb3Jrb3JkZXIgQWdlbnQgaW4gZGllc2VyIExpc3RlIGVudGhhbHRlbiBpc3QuIERlciBTY2hs/HNzZWwgaXN0IGRlciBMb2dpbm5hbWUuIEluaGFsdCBpc3QgMCBvZGVyIDEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgcGVyaW9kIGluIHllYXJzLCBpbiB3aGljaCBzdGFydCBhbmQgZW5kIHRpbWVzIGNhbiBiZSBzZWxlY3RlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgWmVpdHNwYW5uZSBpbiBKYWhyZW4sIGluIGRlciBTdGFydC0gdW5kIEVuZHplaXRlbiBhdXNnZXfkaGx0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZFBhc3QiPjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RGdXR1cmUiPjU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6SGlzdG9yeU9yZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBoaXN0b3J5IG9yZGVyIG5vcm1hbCBvciByZXZlcnNlIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgdW5kZXIgY2hhbmdlIGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlplaWdlIGRpZSBIaXN0b3JpZSBub3JtYWwgb2RlciBy/GNrd+RydHMgc29ydGllcnQgaW0gQWdlbnRlbmludGVyZmFjZSB1bnRlciBkZXIgQ2hhbmdlLUhpc3RvcmllLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdIaXN0b3J5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJub3JtYWwiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJyZXZlcnNlIj5yZXZlcnNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3JtYWwiPm5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZSMjI0ZpbHRlcjo6Q2hhbmdlU3RhdGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBjaGFuZ2Ugb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgQ2hhbmdlLVN0YXRlcyBkaWUgYWxzIEZpbHRlciBpbiBkZXIgQ2hhbmdlLdxiZXJzaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPnJlcXVlc3RlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXBwcm92YWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5yZWplY3RlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmFwcHJvdmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+aW4gcHJvZ3Jlc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIHBpcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnN1Y2Nlc3NmdWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5mYWlsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5jYW5jZWxlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnJldHJhY3RlZDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlIyMjT3JkZXI6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5PcmRlciBkZWZhdWx0IGluIHRoZSBjaGFuZ2Ugb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIFJlaWhlbmZvbGdlIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2Ut3GJlcnNpY2h0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iVXAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEb3duIj5Eb3duPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVcCI+VXA8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2UjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHZpZXcgb3ZlcnZpZXcgb3ZlciBhbGwgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIExpc3RlIHZvbiBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjaGFuZ2Ugb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBDaGFuZ2Ut3GJlcnNpY2h0LiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZSMjI1NvcnRCeTo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNoYW5nZSBzb3J0IGJ5IGRlZmF1bHQgaW4gdGhlIGNoYW5nZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgU29ydGllcnVuZyBkZXIgQ2hhbmdlcyBpbiBkZXIgQ2hhbmdlLdxiZXJzaWNodC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IkNoYW5nZU51bWJlciI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+Q2hhbmdlTnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSI+Q2hhbmdlVGl0bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlSUQiPkNoYW5nZVN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeUlEIj5DYXRlZ29yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0SUQiPkltcGFjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHlJRCI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiPlJldWVzdGVkVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+UGxhbm5lZFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPlBsYW5uZWRFbmRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPkFjdHVhbFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+QWN0dWFsRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj5DcmVhdGVUaW1lPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlQWRkIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBjcmVhdGUgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gRXJzdGVsbGVuIHZvbiBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VBZGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUFkZCMjI1JlcXVlc3RlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHJlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIGRhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIFd1bnNjaHRlcm1pbiBkZXMgS3VuZGVuIGdlc2V0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZUFkZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VBZGQjIyNDaGFuZ2VGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIGNoYW5nZSBmcmVlIHRleHQgb3B0aW9ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW5nZXplaWd0ZSBDaGFuZ2UtRnJlaS1UZXh0LUZlbGRlci4gTfZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gQWt0aXZpZXJ0LCAyID0gQWt0aXZpZXJ0IHVuZCBQZmxpY2h0ZmVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlQWRkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VDQUJUZW1wbGF0ZSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZnJvbSBhIGNoYW5nZXMnIENBQi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB1bSBlaW5lIFZvcmxhZ2UgYXVzIGVpbmVtIENBQiBlaW5lcyBDaGFuZ2UgenUgZXJzdGVsbGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VDQUJUZW1wbGF0ZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byB2aWV3IHRoZSBjb25kaXRpb25zIG9mIGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZXMgUmVjaHQgenVtIEJldHJhY2h0ZW4gZGVyIENvbmRpdGlvbnMgdm9uIENoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZUNvbmRpdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gZWRpdCB0aGUgY29uZGl0aW9ucyBvZiBjaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSBCZWFyYmVpdGVuIGRlciBDb25kaXRpb24gdm9uIENoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZUNvbmRpdGlvbkVkaXQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUVkaXQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIGVkaXQgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gQmVhcmJlaXRlbiB2b24gQ2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlRWRpdDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlRWRpdCMjI1JlcXVlc3RlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHJlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIGRhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlNvbGwgZGVyIFd1bnNjaHRlcm1pbiBkZXMgS3VuZGVuIGdlc2V0enQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VFZGl0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUVkaXQjIyNDaGFuZ2VTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgaWYgdGhlIGNoYW5nZSBzdGF0ZSBjYW4gYmUgc2V0IGluIEFnZW50SVRTTUNoYW5nZUVkaXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBvYiBkZXIgQ2hhbmdlLVN0YXR1cyBpbiBBZ2VudElUU01DaGFuZ2VFZGl0IGdlc2V0enQgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZUVkaXQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlRWRpdCMjI0NoYW5nZUZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gY2hhbmdlIGZyZWUgdGV4dCBvcHRpb25zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmdlemVpZ3RlIENoYW5nZS1GcmVpLVRleHQtRmVsZGVyLiBN9mdsaWNoZSBFaW5zdGVsbHVuZ2VuOiAwID0gRGVha3RpdmllcnQsIDEgPSBBa3RpdmllcnQsIDIgPSBBa3RpdmllcnQgdW5kIFBmbGljaHRmZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VFZGl0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQU0EjIyNGaWx0ZXI6OkNoYW5nZVN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgQ2hhbmdlIFBTQSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBDaGFuZ2UtU3RhdGVzIGRpZSBhbHMgRmlsdGVyIGluIGRlciBDaGFuZ2UgUFNBLdxiZXJzaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VQU0FPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPmFwcHJvdmVkPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQU0EjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9yZGVyIGRlZmF1bHQgaW4gdGhlIENoYW5nZSBQU0Egb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIFJlaWhlbmZvbGdlIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UgUFNBLdxiZXJzaWNodC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlUFNBT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRG93biI+RG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVXAiPlVwPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUFNBIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byB2aWV3IGxpc3Qgb2YgQ2hhbmdlIFBTQS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIENoYW5nZSBQU0Et3GJlcnNpY2h0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VQU0FPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUFNBIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBDaGFuZ2UgUFNBIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIGFuZ2V6ZWlndGVuIFRhYmVsbGVuc3BhbHRlbiBpbiBkZXIgQ2hhbmdlIFBTQS3cYmVyc2ljaHQuIERpZXNlIE9wdGlvbiBoYXQga2VpbmVuIEVmZmVrdCBhdWYgZGllIFBvc2l0aW9uIGRlciBTcGFsdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VQU0FPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZVNpZ25hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlQnVpbGRlciI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTWFuYWdlciI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQ291bnQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUFNBIyMjU29ydEJ5OjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q2hhbmdlIHNvcnQgYnkgZGVmYXVsdCBpbiB0aGUgQ2hhbmdlIFBTQSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgU29ydGllcnVuZyBkZXIgQ2hhbmdlcyBpbiBkZXIgQ2hhbmdlIFBTQS3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVBTQU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJQbGFubmVkU3RhcnRUaW1lIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIj5DaGFuZ2VOdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj5DaGFuZ2VUaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+Q2hhbmdlU3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5SUQiPkNhdGVnb3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+UmVxdWVzdGVkVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+UGxhbm5lZFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPlBsYW5uZWRFbmRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPkFjdHVhbFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+QWN0dWFsRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj5DcmVhdGVUaW1lPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVNjaGVkdWxlIyMjRmlsdGVyOjpDaGFuZ2VTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBjaGFuZ2Ugc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIENoYW5nZSBTY2hlZHVsZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBDaGFuZ2UtU3RhdGVzIGRpZSBhbHMgRmlsdGVyIGluIGRlciBDaGFuZ2UgU2NoZWR1bGUt3GJlcnNpY2h0IHZlcndlbmRldCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5hcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9yZGVyIGRlZmF1bHQgaW4gdGhlIENoYW5nZSBTY2hlZHVsZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIENoYW5nZXMgaW4gZGVyIENoYW5nZSBTY2hlZHVsZS3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRG93biI+RG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVXAiPlVwPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHZpZXcgbGlzdCBvZiBDaGFuZ2UgU2NoZWR1bGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZXMgUmVjaHQgenVtIEVpbnNlaGVuIGRlciBDaGFuZ2UgU2NoZWR1bGUt3GJlcnNpY2h0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VTY2hlZHVsZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ybzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTY2hlZHVsZSMjI1Nob3dDb2x1bW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgQ2hhbmdlIFNjaGVkdWxlIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIGFuZ2V6ZWlndGVuIFRhYmVsbGVuc3BhbHRlbiBpbiBkZXIgQ2hhbmdlIFNjaGVkdWxlLdxiZXJzaWNodC4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVNjaGVkdWxlIyMjU29ydEJ5OjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q2hhbmdlIHNvcnQgYnkgZGVmYXVsdCBpbiB0aGUgQ2hhbmdlIFNjaGVkdWxlIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UgU2NoZWR1bGUt3GJlcnNpY2h0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VTY2hlZHVsZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJQbGFubmVkU3RhcnRUaW1lIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIj5DaGFuZ2VOdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj5DaGFuZ2VUaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+Q2hhbmdlU3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5SUQiPkNhdGVnb3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+UmVxdWVzdGVkVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+UGxhbm5lZFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPlBsYW5uZWRFbmRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPkFjdHVhbFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+QWN0dWFsRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj5DcmVhdGVUaW1lPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gdmlldyB0aGUgaGlzdG9yeSBvZiBhIGNoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIEhpc3RvcmllIGVpbmVzIENoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlSGlzdG9yeTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHZpZXcgdGhlIGhpc3Rvcnkgem9vbSBvZiBhIGNoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIEhpc3RvcmllbmRldGFpbHMgZWluZXMgQ2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlSGlzdG9yeVpvb208L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucyMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gZWRpdCB0aGUgaW52b2x2ZWQgcGVyc29ucyBvZiBhIGNoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gxG5kZXJuIGRlciBiZXRlaWxpZ3RlbiBQZXJzb25lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlSW52b2x2ZWRQZXJzb25zPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIyMjRmlsdGVyOjpDaGFuZ2VTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBjaGFuZ2Ugc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIGNoYW5nZSBtYW5hZ2VyIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIENoYW5nZS1TdGF0ZXMgZGllIGFscyBGaWx0ZXIgaW4gZGVyIENoYW5nZS1NYW5hZ2VyLdxiZXJzaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VNYW5hZ2VyT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5yZXF1ZXN0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGFwcHJvdmFsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+YXBwcm92ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5pbiBwcm9ncmVzczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgcGlyPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIyMjT3JkZXI6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5PcmRlciBkZWZhdWx0IGluIHRoZSBjaGFuZ2UgbWFuYWdlciBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIENoYW5nZXMgaW4gZGVyIENoYW5nZS1NYW5hZ2VyLdxiZXJzaWNodC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlTWFuYWdlck92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJVcCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRvd24iPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVwIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU1hbmFnZXIjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHZpZXcgbGlzdCBvZiBjaGFuZ2VzIHdoZXJlIHVzZXIgaXMgY2hhbmdlIG1hbmFnZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZXMgUmVjaHQgenVtIEVpbnNlaGVuIGRlciBMaXN0ZSBkZXIgQ2hhbmdlcyBiZWkgZGVuZW4gZGVyIEJlbnV0emVyIGNoYW5nZSBtYW5hZ2VyIGlzdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlTWFuYWdlck92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ybzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNYW5hZ2VyIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjaGFuZ2UgbWFuYWdlciBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBhbmdlemVpZ3RlbiBUYWJlbGxlbnNwYWx0ZW4gaW4gZGVyIENoYW5nZS1NYW5hZ2VyLdxiZXJzaWNodC4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZU1hbmFnZXJPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZVNpZ25hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlQnVpbGRlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTWFuYWdlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQ291bnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZXMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTWFuYWdlciMjI1NvcnRCeTo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNoYW5nZSBzb3J0IGJ5IGRlZmF1bHQgaW4gdGhlIGNoYW5nZSBtYW5hZ2VyIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBDaGFuZ2UtTWFuYWdlci3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZU1hbmFnZXJPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iQ2hhbmdlTnVtYmVyIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIj5DaGFuZ2VOdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj5DaGFuZ2VUaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+Q2hhbmdlU3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5SUQiPkNhdGVnb3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+UmVxdWVzdGVkVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+UGxhbm5lZFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPlBsYW5uZWRFbmRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPkFjdHVhbFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+QWN0dWFsRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj5DcmVhdGVUaW1lPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDQUIjIyNGaWx0ZXI6OkNoYW5nZVN0YXRlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIGNoYW5nZSBzdGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgZmlsdGVycyBpbiB0aGUgTXlDQUIgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgQ2hhbmdlLVN0YXRlcyBkaWUgYWxzIEZpbHRlciBpbiBkZXIgTXlDQUIt3GJlcnNpY2h0IHZlcndlbmRldCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld015Q0FCT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5yZXF1ZXN0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGFwcHJvdmFsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+YXBwcm92ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5pbiBwcm9ncmVzczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgcGlyPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeUNBQiMjI09yZGVyOjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+T3JkZXIgZGVmYXVsdCBpbiB0aGUgTXlDQUIgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIFJlaWhlbmZvbGdlIGRlciBDaGFuZ2VzIGluIGRlciBNeUNBQi3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld015Q0FCT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRG93biI+RG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVXAiPlVwPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDQUIjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHZpZXcgbGlzdCBvZiBjaGFuZ2VzIHdoZXJlIHVzZXIgaXMgQ0FCIG1lbWJlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gRWluc2VoZW4gZGVyIExpc3RlIGRlciBDaGFuZ2VzIGJlaSBkZW5lbiBkZXIgQmVudXR6ZXIgTWl0Z2xpZWQgZGVzIENBQnMgaXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdNeUNBQk92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ybzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeUNBQiMjI1Nob3dDb2x1bW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgTXlDQUIgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBNeUNBQi3cYmVyc2ljaHQuIERpZXNlIE9wdGlvbiBoYXQga2VpbmVuIEVmZmVrdCBhdWYgZGllIFBvc2l0aW9uIGRlciBTcGFsdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdNeUNBQk92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlU2lnbmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJDb3VudCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3QiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlcyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeUNBQiMjI1NvcnRCeTo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNoYW5nZSBzb3J0IGJ5IGRlZmF1bHQgaW4gdGhlIE15Q0FCIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBNeUNBQi3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld015Q0FCT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IkNoYW5nZU51bWJlciI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+Q2hhbmdlTnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSI+Q2hhbmdlVGl0bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlSUQiPkNoYW5nZVN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeUlEIj5DYXRlZ29yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0SUQiPkltcGFjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHlJRCI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiPlJlcXVlc3RlZFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPlBsYW5uZWRTdGFydFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj5QbGFubmVkRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj5BY3R1YWxTdGFydFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPkFjdHVhbEVuZFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSI+Q3JlYXRlVGltZTwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcyMjI0ZpbHRlcjo6Q2hhbmdlU3RhdGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgY2hhbmdlIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBNeUNoYW5nZXMgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgQ2hhbmdlLVN0YXRlcyBkaWUgYWxzIEZpbHRlciBpbiBkZXIgTXlDaGFuZ2VzLdxiZXJzaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdNeUNoYW5nZXNPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPnJlcXVlc3RlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXBwcm92YWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5hcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBwaXI8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyMjI0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgd29ya29yZGVyIHN0YXRlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSBNeVdvcmtvcmRlcnMgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgV29ya29yZGVyLVN0YXRlcyBkaWUgYWxzIEZpbHRlciBpbiBkZXIgTXlXb3Jrb3JkZXJzLdxiZXJzaWNodCB2ZXJ3ZW5kZXQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdNeVdvcmtPcmRlcnNPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPmNyZWF0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5hY2NlcHRlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnJlYWR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+aW4gcHJvZ3Jlc3M8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcyMjI09yZGVyOjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+T3JkZXIgZGVmYXVsdCBpbiB0aGUgTXlDaGFuZ2VzIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBSZWloZW5mb2xnZSBkZXIgQ2hhbmdlcyBpbiBkZXIgTXlDaGFuZ2VzLdxiZXJzaWNodC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3TXlDaGFuZ2VzT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRG93biI+RG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVXAiPlVwPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byB2aWV3IGxpc3Qgb2Ygb3duIGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZXMgUmVjaHQgenVtIEVpbnNlaGVuIGRlciBMaXN0ZSBkZXIgZWlnZW5lbiBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdNeUNoYW5nZXNPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBNeUNoYW5nZXMgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBNeUNoYW5nZXMt3GJlcnNpY2h0LiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3TXlDaGFuZ2VzT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcyMjI1NvcnRCeTo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNoYW5nZSBzb3J0IGJ5IGRlZmF1bHQgaW4gdGhlIE15Q2hhbmdlcyBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgU29ydGllcnVuZyBkZXIgQ2hhbmdlcyBpbiBkZXIgTXlDaGFuZ2VzLdxiZXJzaWNodC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3TXlDaGFuZ2VzT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlBsYW5uZWRTdGFydFRpbWUiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiPkNoYW5nZU51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPkNoYW5nZVRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZUlEIj5DaGFuZ2VTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnlJRCI+Q2F0ZWdvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdElEIj5JbXBhY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5SUQiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj5SZXF1ZXN0ZWRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj5QbGFubmVkU3RhcnRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+UGxhbm5lZEVuZFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+QWN0dWFsU3RhcnRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj5BY3R1YWxFbmRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiPkNyZWF0ZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9yZGVyIGRlZmF1bHQgaW4gdGhlIE15V29ya29yZGVycyBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIFdvcmtvcmRlcnMgaW4gZGVyIE15V29ya29yZGVycy3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld015V29ya09yZGVyc092ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJVcCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRvd24iPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVwIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gdmlldyBsaXN0IG9mIG93biB3b3Jrb3JkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSBFaW5zZWhlbiBkZXIgTGlzdGUgdm9uIGVpZ2VuZW4gV29ya29yZGVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3TXlXb3JrT3JkZXJzT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyMjI1Nob3dDb2x1bW5zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB0aGUgc2hvd24gY29sdW1ucyBpbiB0aGUgTXlXb3Jrb3JkZXJzIG92ZXJ2aWV3LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGllIGFuZ2V6ZWlndGVuIFRhYmVsbGVuc3BhbHRlbiBpbiBkZXIgTXlXb3Jrb3JkZXJzLdxiZXJzaWNodC4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld015V29ya09yZGVyc092ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlU2lnbmFsIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VCdWlsZGVyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VNYW5hZ2VyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJDb3VudCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3QiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlcyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyU3RhdGVTaWduYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlck51bWJlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckFnZW50Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyVHlwZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VNeVdvcmtPcmRlcnMjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5DaGFuZ2Ugc29ydCBieSBkZWZhdWx0IGluIHRoZSBNeVdvcmtvcmRlcnMgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIFNvcnRpZXJ1bmcgZGVyIENoYW5nZXMgaW4gZGVyIE15V29ya29yZGVycy3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld015V29ya09yZGVyc092ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJQbGFubmVkU3RhcnRUaW1lIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlTnVtYmVyIj5DaGFuZ2VOdW1iZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpdGxlIj5DaGFuZ2VUaXRsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVJRCI+Q2hhbmdlU3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhdGVnb3J5SUQiPkNhdGVnb3J5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+SW1wYWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eUlEIj5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWVzdGVkVGltZSI+UmVxdWVzdGVkVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZFN0YXJ0VGltZSI+UGxhbm5lZFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGxhbm5lZEVuZFRpbWUiPlBsYW5uZWRFbmRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxTdGFydFRpbWUiPkFjdHVhbFN0YXJ0VGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsRW5kVGltZSI+QWN0dWFsRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj5DcmVhdGVUaW1lPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUElSIyMjRmlsdGVyOjpXb3JrT3JkZXJTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSB3b3Jrb3JkZXIgc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIFBJUiBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBXb3Jrb3JkZXItU3RhdGVzIGRpZSBhbHMgRmlsdGVyIGluIGRlciBQSVIt3GJlcnNpY2h0IHZlcndlbmRldCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1BJUk92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+YWNjZXB0ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5yZWFkeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmluIHByb2dyZXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2FuY2VsZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVBJUiMjI09yZGVyOjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+T3JkZXIgZGVmYXVsdCBpbiB0aGUgUElSIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBSZWloZW5mb2xnZSBkZXIgQ2hhbmdlcyBpbiBkZXIgUElSLdxiZXJzaWNodC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3UElST3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlVwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRG93biI+RG93bjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVXAiPlVwPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUElSIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byB2aWV3IGxpc3Qgb2YgY2hhbmdlcyB3aXRoIGFuIHVwY29taW5nIFBJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSBFaW5zZWhlbiBkZXIgTGlzdGUgdm9uIENoYW5nZXMgbWl0IGVpbmVtIGFuc3RlaGVuZGVuIFBJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdQSVJPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUElSIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBQSVIgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBQSVIt3GJlcnNpY2h0LiBEaWVzZSBPcHRpb24gaGF0IGtlaW5lbiBFZmZla3QgYXVmIGRpZSBQb3NpdGlvbiBkZXIgU3BhbHRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3UElST3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJTdGF0ZVNpZ25hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyTnVtYmVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJUaXRsZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV29ya09yZGVyQWdlbnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlclN0YXRlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXb3JrT3JkZXJUeXBlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVBJUiMjI1NvcnRCeTo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNoYW5nZSBzb3J0IGJ5IGRlZmF1bHQgaW4gdGhlIFBJUiBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgU29ydGllcnVuZyBkZXIgQ2hhbmdlcyBpbiBkZXIgUElSLdxiZXJzaWNodC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3UElST3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlBsYW5uZWRTdGFydFRpbWUiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VOdW1iZXIiPkNoYW5nZU51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPkNoYW5nZVRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZUlEIj5DaGFuZ2VTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnlJRCI+Q2F0ZWdvcnk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdElEIj5JbXBhY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5SUQiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj5SZXF1ZXN0ZWRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj5QbGFubmVkU3RhcnRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+UGxhbm5lZEVuZFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbFN0YXJ0VGltZSI+QWN0dWFsU3RhcnRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj5BY3R1YWxFbmRUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiPkNyZWF0ZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VQSVIjIyNXb3JrT3JkZXJUeXBlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIHdvcmtvcmRlciB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBzaG93IHRoZSBQSVIgb3ZlcnZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgV29ya29yZGVyLVR5cGVuIGRpZSBm/HIgZGllIFBJUi3cYmVyc2ljaHQgdmVyd2VuZGV0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3UElST3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5waXI8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVByaW50IyMjQWNjb3VudGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHByaW50IHRoZSBhY2NvdW50ZWQgdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U29sbCBkaWUgZ2VidWNodGUgWmVpdCBnZWRydWNrdCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVByaW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVByaW50IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBwcmludCBhIGNoYW5nZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gRHJ1Y2tlbiBlaW5lcyBDaGFuZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VQcmludDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUHJpbnQjIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gcHJpbnQgdGhlIHBsYW5uZWQgZWZmb3J0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Tb2xsIGRlciBnZXBsYW50ZSBBdWZ3YW5kIGdlZHJ1Y2t0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlUHJpbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlUHJpbnQjIyNSZXF1ZXN0ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gcHJpbnQgdGhlIHJlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIGRhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIFd1bnNjaHRlcm1pbiBkZXMgS3VuZGVuIGdlZHJ1Y2t0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VQcmludDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTZWFyY2gjIyNDaGFuZ2VGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIGNoYW5nZSBmcmVlIHRleHQgb3B0aW9ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZ2V6ZWlndGUgQ2hhbmdlLUZyZWktVGV4dC1GZWxkZXIuIE32Z2xpY2hlIEVpbnN0ZWxsdW5nZW46IDAgPSBEZWFrdGl2aWVydCwgMSA9IEFrdGl2aWVydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTZWFyY2gjIyNXb3JrT3JkZXJGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHdvcmtvcmRlciBmcmVlIHRleHQgb3B0aW9ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZ2V6ZWlndGUgV29ya29yZGVyLUZyZWktVGV4dC1GZWxkZXIuIE32Z2xpY2hlIEVpbnN0ZWxsdW5nZW46IDAgPSBEZWFrdGl2aWVydCwgMSA9IEFrdGl2aWVydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTZWFyY2gjIyNSZXF1ZXN0ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2VhcmNoIHRoZSByZXF1ZXN0ZWQgKGJ5IGN1c3RvbWVyKSBkYXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Tb2xsIGRlciBXdW5zY2h0ZXJtaW4gZGVzIEt1bmRlbiBnZXN1Y2h0IHdlcmRlbiBr9m5uZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2VTZWFyY2gjIyNTaG93Q29sdW1ucyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhlIHNob3duIGNvbHVtbnMgaW4gdGhlIGNoYW5nZSBzZWFyY2guIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGltIFN1Y2hlcmdlYm5pc3MuIERpZXNlIE9wdGlvbiBoYXQga2VpbmVuIEVmZmVrdCBhdWYgZGllIFBvc2l0aW9uIGRlciBTcGFsdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2VTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVRlbXBsYXRlIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBjcmVhdGUgYSB0ZW1wbGF0ZSBmcm9tIGEgY2hhbmdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHVtIGVpbmUgVm9ybGFnZSBhdXMgZWluZW0gQ2hhbmdlIHp1IGVyc3RlbGxlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlVGVtcGxhdGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVRpbWVTbG90IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBtb3ZlIGNoYW5nZXMgaW4gdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gemVpdGxpY2hlbiBWZXJzY2hpZWJlbiB2b24gQ2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlVGltZVNsb3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNBY2NvdW50ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2hvdyB0aGUgYWNjb3VudGVkIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlNvbGwgZGllIGdlYnVjaHRlIFplaXQgYW5nZXplaWd0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlWm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byB2aWV3IGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZXMgUmVjaHQgenVtIEFuc2VoZW4gdm9uIENoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVpvb208L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNQbGFubmVkRWZmb3J0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2hvdyB0aGUgcGxhbm5lZCBlZmZvcnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlNvbGwgZGVyIGdlcGxhbnRlIEF1ZndhbmQgYW5nZXplaWd0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3Q2hhbmdlWm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjUmVxdWVzdGVkVGltZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNob3cgdGhlIHJlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIGRhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlNvbGwgZGVyIFd1bnNjaHRlcm1pbiBkZXMgS3VuZGVuIGFuZ2V6ZWlndCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVpvb208L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlWm9vbSMjI1dvcmtPcmRlclN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2hvdyB0aGUgd29ya29yZGVyIHN0YXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Tb2xsIGRlciBTdGF0dXMgZGVyIFdvcmtvcmRlciBhbmdlemVpZ3Qgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2Vab29tPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNXb3JrT3JkZXJUaXRsZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNob3cgdGhlIHdvcmtvcmRlciB0aXRsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U29sbCBkZXIgVGl0ZWwgZGVyIFdvcmtvcmRlciBhbmdlemVpZ3Qgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdDaGFuZ2Vab29tPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNXb3JrT3JkZXJHcmFwaCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgc2hvd24gZ3JhcGggYXR0cmlidXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IEF0dHJpYnV0ZSBm/HIgZGllIEFuemVpZ2UgZGVzIEdyYXBoZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld0NoYW5nZVpvb208L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGltZUxpbmVDb2xvciI+I0RDMTQzQzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGltZUxpbmVXaWR0aCI+MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0idW5kZWZpbmVkX3BsYW5uZWRfY29sb3IiPiNCMjIyMjI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InVuZGVmaW5lZF9hY3R1YWxfY29sb3IiPiNGMDgwODA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImFwcHJvdmFsX3BsYW5uZWRfY29sb3IiPiNGRjQ1MDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImFwcHJvdmFsX2FjdHVhbF9jb2xvciI+I0ZGN0Y1MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iYmFja291dF9wbGFubmVkX2NvbG9yIj4jNjk2OTY5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJiYWNrb3V0X2FjdHVhbF9jb2xvciI+I0MwQzBDMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icGlyX3BsYW5uZWRfY29sb3IiPiM0NjgyQjQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InBpcl9hY3R1YWxfY29sb3IiPiM4N0NFRUI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IndvcmtvcmRlcl9wbGFubmVkX2NvbG9yIj4jMDA2NDAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJ3b3Jrb3JkZXJfYWN0dWFsX2NvbG9yIj4jM0NCMzcxPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlRGVsZXRlIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBkZWxldGUgYSB0ZW1wbGF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gTPZzY2hlbiBlaW5lciBWb3JsYWdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdUZW1wbGF0ZURlbGV0ZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNVGVtcGxhdGVFZGl0IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBlZGl0IGEgdGVtcGxhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZXMgUmVjaHQgenVtIMRuZGVybiBlaW5lciBWb3JsYWdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdUZW1wbGF0ZUVkaXQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcjIyNGaWx0ZXI6OlRlbXBsYXRlVHlwZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSB0ZW1wbGF0ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBmaWx0ZXJzIGluIHRoZSB0ZW1wbGF0ZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBUZW1wbGF0ZVR5cGVuIGRpZSBhbHMgRmlsdGVyIGluIGRlciBUZW1wbGF0ZS3cYmVyc2ljaHQgdmVyd2VuZGV0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3VGVtcGxhdGVPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPklUU01DaGFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5JVFNNV29ya09yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q0FCPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IyMjT3JkZXI6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5PcmRlciBkZWZhdWx0IGluIHRoZSB0ZW1wbGF0ZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIFRlbXBsYXRlcyBpbiBkZXIgVGVtcGxhdGUt3GJlcnNpY2h0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdUZW1wbGF0ZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJVcCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRvd24iPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVwIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIHZpZXcgb3ZlcnZpZXcgb3ZlciBhbGwgdGVtcGxhdGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSBFaW5zZWhlbiBkZXIgTGlzdGUgdm9uIFZvcmxhZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdUZW1wbGF0ZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ybzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSB0ZW1wbGF0ZSBvdmVydmlldy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBhbmdlemVpZ3RlbiBUYWJlbGxlbnNwYWx0ZW4gaW4gZGVyIFRlbXBsYXRlLdxiZXJzaWNodC4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1RlbXBsYXRlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGVtcGxhdGVJRCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29tbWVudCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVmFsaWQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlbGV0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlQnkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcjIyNTb3J0Qnk6OkRlZmF1bHQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5DaGFuZ2Ugc29ydCBieSBkZWZhdWx0IGluIHRoZSB0ZW1wbGF0ZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgU29ydGllcnVuZyBkZXIgVGVtcGxhdGVzIGluIGRlciBUZW1wbGF0ZS3cYmVyc2ljaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1RlbXBsYXRlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IlRlbXBsYXRlSUQiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5OYW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUZW1wbGF0ZVR5cGVJRCI+VGVtcGxhdGVUeXBlSUQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlZhbGlkSUQiPlZhbGlkSUQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNyZWF0ZVRpbWUiPkNyZWF0ZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVRpbWUiPkNoYW5nZVRpbWU8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJBZGQjIyNXb3JrT3JkZXJGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHdvcmtvcmRlciBmcmVlIHRleHQgb3B0aW9ucy4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW5nZXplaWd0ZSBXb3Jrb3JkZXItRnJlaS1UZXh0LUZlbGRlci4gTfZnbGljaGUgRWluc3RlbGx1bmdlbjogMCA9IERlYWt0aXZpZXJ0LCAxID0gQWt0aXZpZXJ0LCAyID0gQWt0aXZpZXJ0IHVuZCBQZmxpY2h0ZmVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3V29ya09yZGVyQWRkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJBZGQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIGFkZCBhIHdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gSGluenVm/GdlbiBlaW5lciBXb3Jrb3JkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlckFkZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyQWRkIyMjUGxhbm5lZEVmZm9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNob3cgdGhlIHBsYW5uZWQgZWZmb3J0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Tb2xsIGRlciBnZXBsYW50ZSBBdWZ3YW5kIGFuZ2V6ZWlndCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlckFkZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJBZ2VudCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gY2hhbmdlIHRoZSB3b3Jrb3JkZXIgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZXMgUmVjaHQgenVtIMRuZGVybiBkZXMgQWdlbnRlbiBlaW5lciBXb3Jrb3JkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlckFnZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcHJpdmlsZWdlIHRvIGRlbGV0ZSBhIHdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gTPZzY2hlbiBlaW5lciBXb3Jrb3JkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlckRlbGV0ZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyRWRpdCMjI1dvcmtPcmRlckZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gd29ya29yZGVyIGZyZWUgdGV4dCBvcHRpb25zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmdlemVpZ3RlIFdvcmtvcmRlci1GcmVpLVRleHQtRmVsZGVyLiBN9mdsaWNoZSBFaW5zdGVsbHVuZ2VuOiAwID0gRGVha3RpdmllcnQsIDEgPSBBa3RpdmllcnQsIDIgPSBBa3RpdmllcnQgdW5kIFBmbGljaHRmZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdXb3JrT3JkZXJFZGl0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1MCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJFZGl0IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBlZGl0IGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSDEbmRlcm4gZWluZXIgV29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdXb3JrT3JkZXJFZGl0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJFZGl0IyMjUGxhbm5lZEVmZm9ydCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNob3cgdGhlIHBsYW5uZWQgZWZmb3J0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Tb2xsIGRlciBnZXBsYW50ZSBBdWZ3YW5kIGFuZ2V6ZWlndCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlckVkaXQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gdmlldyB0aGUgaGlzdG9yeSBvZiBhIHdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gQmV0cmFjaHRlbiBkZXIgSGlzdG9yaWUgZWluZXIgV29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdXb3JrT3JkZXJIaXN0b3J5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXihyd3xybykkIj5ybzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5Wm9vbSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gdmlldyB0aGUgaGlzdG9yeSB6b29tIG9mIGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSBCZXRyYWNodGVuIGRlciBIaXN0b3JpZW5kZXRhaWxzIGVpbmVyIFdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3V29ya09yZGVySGlzdG9yeVpvb208L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclJlcG9ydCMjI0FjY291bnRlZFRpbWUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzaG93IHRoZSBhY2NvdW50ZWQgdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U29sbCBkaWUgZ2VidWNodGUgWmVpdCBhbmdlemVpZ3Qgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdXb3JrT3JkZXJSZXBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyUmVwb3J0IyMjQWN0dWFsVGltZVNwYW4iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIGFjdHVhbCBzdGFydCBhbmQgZW5kIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIHRhdHPkY2hsaWNoZSBTdGFydC0gdW5kIEVuZHplaXRwdW5rdCBnZXNldHp0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdXb3JrT3JkZXJSZXBvcnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyUmVwb3J0IyMjV29ya09yZGVyRnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93biB3b3Jrb3JkZXIgZnJlZSB0ZXh0IG9wdGlvbnMuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZ2V6ZWlndGUgV29ya29yZGVyLUZyZWktVGV4dC1GZWxkZXIuIE32Z2xpY2hlIEVpbnN0ZWxsdW5nZW46IDAgPSBEZWFrdGl2aWVydCwgMSA9IEFrdGl2aWVydCwgMiA9IEFrdGl2aWVydCB1bmQgUGZsaWNodGZlbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlclJlcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMzgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjM5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0MyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0NiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNDciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQ4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0OSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNTAiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyUmVwb3J0IyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byB3cml0ZSBhIHJlcG9ydCBmb3IgdGhlIHdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QmVu9nRpZ3RlcyBSZWNodCB6dW0gVmVyZmFzc2VuIGVpbmVzIEJlcmljaHRlcyBm/HIgZWluZSBXb3Jrb3JkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Vmlld1dvcmtPcmRlclJlcG9ydDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyVGFrZSMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwcml2aWxlZ2UgdG8gdGFrZSB0aGUgd29ya29yZGVyIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSDcYmVybmVobWVuIGVpbmVyIFdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3V29ya09yZGVyQWdlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byBjcmVhdGUgYSB0ZW1wbGF0ZSBmcm9tIGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHVtIGVpbmUgVm9ybGFnZSBhdXMgZWluZXIgV29ya29yZGVyIHp1IGVyc3RlbGxlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3V29ya09yZGVyVGVtcGxhdGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeKHJ3fHJvKSQiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OkFnZW50SVRTTVdvcmtPcmRlclpvb20jIyNBY2NvdW50ZWRUaW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2hvdyB0aGUgYWNjb3VudGVkIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlNvbGwgZGllIGdlYnVjaHRlIFplaXQgYW5nZXplaWd0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3V29ya09yZGVyWm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjpBZ2VudElUU01Xb3JrT3JkZXJab29tIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlJlcXVpcmVkIHByaXZpbGVnZSB0byB2aWV3IGEgd29ya29yZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGVzIFJlY2h0IHp1bSBCZXRyYWNodGVuIGVpbmVyIFdvcmtvcmRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpWaWV3V29ya09yZGVyWm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il4ocnd8cm8pJCI+cm88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6QWdlbnRJVFNNV29ya09yZGVyWm9vbSMjI1BsYW5uZWRFZmZvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzaG93IHRoZSBwbGFubmVkIGVmZm9ydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U29sbCBkZXIgZ2VwbGFudGUgQXVmd2FuZCBhbmdlemVpZ3Qgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlZpZXdXb3JrT3JkZXJab29tPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkN1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlIyMjRmlsdGVyOjpDaGFuZ2VTdGF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBjaGFuZ2Ugc3RhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGZpbHRlcnMgaW4gdGhlIGN1c3RvbWVyIGNoYW5nZSBzY2hlZHVsZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSBDaGFuZ2UtU3RhdGVzIGRpZSBhbHMgRmlsdGVyIGluIGRlciBLdW5kZW4tQW5zaWNodCAiQ2hhbmdlIFNjaGVkdWxlIiB2ZXJ3ZW5kZXQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6OlZpZXdDaGFuZ2VTY2hlZHVsZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+YXBwcm92ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5pbiBwcm9ncmVzczwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6Q3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUjIyNPcmRlcjo6RGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk9yZGVyIGRlZmF1bHQgaW4gdGhlIGN1c3RvbWVyIGNoYW5nZSBzY2hlZHVsZSBvdmVydmlldy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgUmVpaGVuZm9sZ2UgZGVyIENoYW5nZXMgaW4gZGVyIEt1bmRlbi1BbnNpY2h0ICJDaGFuZ2UgU2NoZWR1bGUiLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6OlZpZXdDaGFuZ2VTY2hlZHVsZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJVcCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRvd24iPkRvd248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlVwIj5VcDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkN1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlIyMjU2hvd0NvbHVtbnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmVzIHRoZSBzaG93biBjb2x1bW5zIGluIHRoZSBjdXN0b21lciBjaGFuZ2Ugc2NoZWR1bGUgb3ZlcnZpZXcuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCBkaWUgYW5nZXplaWd0ZW4gVGFiZWxsZW5zcGFsdGVuIGluIGRlciBLdW5kZW4tQW5zaWNodCAiQ2hhbmdlIFNjaGVkdWxlIi4gRGllc2UgT3B0aW9uIGhhdCBrZWluZW4gRWZmZWt0IGF1ZiBkaWUgUG9zaXRpb24gZGVyIFNwYWx0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6Vmlld0NoYW5nZVNjaGVkdWxlT3ZlcnZpZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlU3RhdGVTaWduYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlVGl0bGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZUJ1aWxkZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU1hbmFnZXIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldvcmtPcmRlckNvdW50Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2F0ZWdvcnkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlcnZpY2VzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1ZXN0ZWRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQbGFubmVkRW5kVGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3R1YWxFbmRUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVUaW1lIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkN1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlIyMjU2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgdGhhdCBvbmx5IGNoYW5nZXMgd2lsbCBiZSBzaG93biwgdGhhdCBjb250YWluIHdvcmtvcmRlcnMgd2hpY2ggYXJlIGxpbmtlZCB3aXRoIHNlcnZpY2VzIHdoZXJlIHRoZSBjdXN0b21lciB1c2VyIGlzIGFsbG93ZWQgdG8gdXNlIHRoZW0uIEFueSBvdGhlciBjaGFuZ2VzIHdpbGwgbm90IGJlIHNob3duLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQgZGFzIG51ciBDaGFuZ2VzIGFuZ2V6ZWlndCB3ZXJkZW4sIGRpZSBXb3Jrb3JkZXJzIGVudGhhbHRlbiwgZGllIG1pdCBTZXJ2aWNlcyB2ZXJsaW5rdCBzaW5kLCBm/HIgZGllIGRlciBLdW5kZW4tQmVudXR6ZXIgZWluZSBCZXJlY2h0aWd1bmcgaGF0LiBBbmRlcmUgQ2hhbmdlcyB3ZXJkZW4gbmljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6Q3VzdG9tZXI6OlZpZXdDaGFuZ2VTY2hlZHVsZU92ZXJ2aWV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkN1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlIyMjU29ydEJ5OjpEZWZhdWx0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q2hhbmdlIHNvcnQgYnkgZGVmYXVsdCBpbiB0aGUgY3VzdG9tZXIgY2hhbmdlIHNjaGVkdWxlIG92ZXJ2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBTb3J0aWVydW5nIGRlciBDaGFuZ2VzIGluIGRlciBLdW5kZW4tQW5zaWNodCAiQ2hhbmdlIFNjaGVkdWxlIi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpWaWV3Q2hhbmdlU2NoZWR1bGVPdmVydmlldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iUGxhbm5lZFN0YXJ0VGltZSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZU51bWJlciI+Q2hhbmdlTnVtYmVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDaGFuZ2VUaXRsZSI+Q2hhbmdlVGl0bGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZVN0YXRlSUQiPkNoYW5nZVN0YXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXRlZ29yeUlEIj5DYXRlZ29yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSW1wYWN0SUQiPkltcGFjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHlJRCI+UHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVlc3RlZFRpbWUiPlJlcXVlc3RlZFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRTdGFydFRpbWUiPlBsYW5uZWRTdGFydFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBsYW5uZWRFbmRUaW1lIj5QbGFubmVkRW5kVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0dWFsU3RhcnRUaW1lIj5BY3R1YWxTdGFydFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdHVhbEVuZFRpbWUiPkFjdHVhbEVuZFRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW9yaXR5Ij5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JlYXRlVGltZSI+Q3JlYXRlVGltZTwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6UGVybWlzc2lvbiMjIzEwLUNoYW5nZU1hbmFnZXJDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBjaGVjayB0aGUgY2hhbmdlIG1hbmFnZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1vZHVsIHp1bSDcYmVycHL8ZmVuIGRlcyBDaGFuZ2UgTWFuYWdlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01DaGFuZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OlBlcm1pc3Npb24jIyMyMC1DaGFuZ2VCdWlsZGVyQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gY2hlY2sgdGhlIGNoYW5nZSBidWlsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCB6dW0g3GJlcnBy/GZlbiBkZXMgQ2hhbmdlIEJ1aWxkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUJ1aWxkZXJDaGVjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWlyZWQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkdyYW50ZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uIyMjMzAtQ2hhbmdlQWdlbnRDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBjaGVjayB0aGUgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1vZHVsIHp1bSDcYmVycHL8ZmVuIGRlcyBBZ2VudGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUFnZW50Q2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6UGVybWlzc2lvbiMjIzQwLUNBQkNoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIGNoZWNrIHRoZSBDQUIgbWVtYmVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwgenVtINxiZXJwcvxmZW4gZGVzIEFnZW50ZW4gaW0gQ0FCLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ2hhbmdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNBQkNoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb24jIyMxMC1DaGFuZ2VNYW5hZ2VyQ2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gY2hlY2sgdGhlIGNoYW5nZSBtYW5hZ2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCB6dW0g3GJlcnBy/GZlbiBkZXMgQ2hhbmdlIE1hbmFnZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNoYW5nZU1hbmFnZXJDaGVjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVxdWlyZWQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkdyYW50ZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uIyMjMjAtQ2hhbmdlQnVpbGRlckNoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIGNoZWNrIHRoZSBjaGFuZ2UgYnVpbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwgenVtINxiZXJwcvxmZW4gZGVzIENoYW5nZSBCdWlsZGVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTVdvcmtPcmRlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VCdWlsZGVyQ2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbiMjIzMwLVdvcmtPcmRlckFnZW50Q2hlY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gY2hlY2sgdGhlIHdvcmtvcmRlciBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwgenVtINxiZXJwcvxmZW4gZGVzIFdvcmtvcmRlci1BZ2VudGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OldvcmtPcmRlckFnZW50Q2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbiMjIzQwLUNBQkNoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIGNoZWNrIHRoZSBDQUIgbWVtYmVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TW9kdWwgenVtINxiZXJwcvxmZW4gZGVzIEFnZW50ZW4gaW0gQ0FCLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00gQ2hhbmdlIE1hbmFnZW1lbnQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNV29ya09yZGVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNBQkNoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uIyMjMTAtRW1wdHlBZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBjaGVjayB3aGV0aGVyIG5vIHdvcmtvcmRlciBhZ2VudCBpcyBzZXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1vZHVsIHp1bSDcYmVycHL8ZmVuIG9iIGVzIGtlaW5lbiBBZ2VudGVuIGb8ciBkaWUgV29ya29yZGVyIGdpYnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6RW1wdHlBZ2VudENoZWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JhbnRlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uIyMjMjAtTGlzdEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGFnZW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgY29uZmlndXJlZCBsaXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCB6dW0g3GJlcnBy/GZlbiBvYiBkZXIgQWdlbnQgaW4gZGVyIGtvbmZpZ3VyaWVydGVuIExpc3RlIGVudGhhbHRlbiBpc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01Xb3JrT3JkZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6TGlzdEFnZW50Q2hlY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlcXVpcmVkIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcmFudGVkIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpBY2w6Ok1vZHVsZSMjIzIwMC1UaWNrZXQ6OkFjbDo6TW9kdWxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBBQ0wgbW9kdWxlIHJlc3RyaWN0cyB0aGUgdXN1YWdlIG9mIHRoZSB0aWNrZXQgdHlwZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgc3lzY29uZmlnIG9wdGlvbiAnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJywgdG8gdXNlcnMgb2YgdGhlIGdyb3VwcyBhcyBkZWZpbmVkIGluICJJVFNNQ2hhbmdlOjpSZXN0cmljdFRpY2tldFR5cGVzOjpHcm91cHMiLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWVzZXMgQUNMIE1vZHVsIHNjaHLkbmt0IGRpZSBWZXJ3ZW5kdW5nIGRlciBUaWNrZXQtVHlwZW4sIGRpZSBpbiBkZXIgU3lzY29uZmlnLU9wdGlvbiAnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJyBkZWZpbmllcnQgc2luZCwgYXVmIEJlbnV0emVyIGVpbiBkaWUgTWl0Z2xpZWQgaW4gZWluZXIgZGVyIGluICJJVFNNQ2hhbmdlOjpSZXN0cmljdFRpY2tldFR5cGVzOjpHcm91cHMiIGRlZmluZXJ0ZW4gR3J1cHBlbiBzaW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEFDTDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFjbDo6UmVzdHJpY3RUaWNrZXRUeXBlczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01TdGF0ZU1hY2hpbmU6Ok9iamVjdCMjI0NoYW5nZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNldCB1cCB0aGUgc3RhdGUgbWFjaGluZSBmb3IgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+S29uZmlndXJhdGlvbiBm/HIgZGllIFN0YXRlIE1hY2hpbmUgZvxyIENoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01TdGF0ZU1hY2hpbmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+Q2hhbmdlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01TdGF0ZU1hY2hpbmU6Ok9iamVjdCMjI1dvcmtPcmRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNldCB1cCB0aGUgc3RhdGUgbWFjaGluZSBmb3IgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+S29uZmlndXJhdGlvbiBm/HIgZGllIFN0YXRlIE1hY2hpbmUgZvxyIFdvcmtvcmRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OklUU01TdGF0ZU1hY2hpbmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+V29ya09yZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OlNlbmROb3RpZmljYXRpb25zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V2hldGhlciBub3RpZmljYXRpb25zIHNob3VsZCBiZSBzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIEJlbmFjaHJpY2h0aWd1bmdlbiB2ZXJzZW5kZXQgd2VyZGVuIHNvbGxlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6Tm90aWZpY2F0aW9uczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DaGFuZ2U6OlRpbWVSZWFjaGVkTm90aWZpY2F0aW9ucyMjI0ZyZXF1ZW5jeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkNvbmZpZ3VyZSBob3cgb2Z0ZW4gdGhlIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgd2hlbiBwbGFubmVkIHN0YXJ0IHRpbWUgb3Igb3RoZXIgdGltZSB2YWx1ZXMgaGF2ZSByZWFjaGVkL3Bhc3NlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+S29uZmlndXJhdGlvbiB3aWUgaOR1ZmlnIEJlbmFjaHJpY2h0dW5nZW4gdmVyc2NoaWNrdCB3ZXJkZW4gd2VubiBkaWUgZ2VwbGFudGUgU3RhcnR6ZWl0IG9kZXIgYW5kZXJlIFplaXRlbiBlcnJlaWNodCB3dXJkZW4gYnp3LiBzY2hvbiB2b3JiZWkgc2luZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6Tm90aWZpY2F0aW9uczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0ib25jZSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im9uY2UiPm9uY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InJlZ3VsYXJseSI+cmVndWxhcmx5PC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ2hhbmdlOjpUaW1lUmVhY2hlZE5vdGlmaWNhdGlvbnMjIyNIb3VycyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIGZyZXF1ZW5jeSBpcyAncmVndWxhcmx5JywgeW91IGNhbiBjb25maWd1cmUgaG93IG9mdGVuIHRoZSBub3RpY2F0aW9ucyBhcmUgc2VudCAoZXZlcnkgeHggaG91cnMpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRpZSBI5HVmaWdrZWl0IGF1ZiAicmVndWxhcmx5IiBlaW5nZXN0ZWxsdCBpc3QsIGv2bm5lbiBTaWUgaGllciBlaW5zdGVsbGVuLCBuYWNoIHdpZXZpZWxlbiBTdHVuZGVuIGVpbmUgZXJuZXV0ZSBFcmlubmVydW5nIHZlcnNjaGlja3Qgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTSBDaGFuZ2UgTWFuYWdlbWVudDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Ok5vdGlmaWNhdGlvbnM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeXGQrJCI+MTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN0YXRzOjpFeGNoYW5nZUF4aXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3UgYWN0aXZhdGUgdGhpcyBvcHRpb24gYW4gYWdlbnQgY2FuIGV4Y2hhbmdlIHRoZSBheGlzIG9mIGEgc3RhdCBpZiBoZSBnZW5lcmF0ZXMgb25lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRpZXNlIE9wdGlvbiBha3RpdmllcnQgd2lyZCwgaGF0IGRlciBBZ2VudCBkaWUgTfZnbGljaGtlaXQgYmVpbSBHZW5lcmllcmVuIGVpbmVyIFN0YXRpc3RpayBkaWUgYmVpZGVuIEFjaHNlbiB6dSB2ZXJ0YXVzY2hlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlN0YXRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBkZWNpZGUgaWYgdGhlIGNvbW1vbiBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IGNoYW5nZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga/ZubmVuIFNpZSBmZXN0bGVnZW4sIG9iIGRhcyBTdGF0aXN0aWstTW9kdWwgYXVjaCBhbGxnZW1laW5lIFN0YXRpc3Rpa2VuIPxiZXIgQ2hhbmdlcyBnZW5lcmllcmVuIGRhcmYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3RhdHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01DaGFuZ2VNYW5hZ2VtZW50PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudEhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gZGVjaWRlIGlmIHRoZSBjb21tb24gc3RhdHMgbW9kdWxlIG1heSBnZW5lcmF0ZSBzdGF0cyBhYm91dCBjaGFuZ2VzIHJlZ2FyZGluZyBjaGFuZ2Ugc3RhdGUgdXBkYXRlcyB3aXRoaW4gYSB0aW1lcGVyaW9kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGv2bm5lbiBTaWUgZmVzdGxlZ2VuLCBvYiBkYXMgU3RhdGlzdGlrLU1vZHVsIGF1Y2ggYWxsZ2VtZWluZSBTdGF0aXN0aWtlbiD8YmVyIENoYW5nZXMgYnpnbC4gU3RhdHVzLVVwZGF0ZXMgaW5uZXJoYWxiIGVpbmVyIFplaXRwZXJpb2RlIGdlbmVyaWVyZW4gZGFyZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRIaXN0b3J5PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNJbmNpZGVudHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gZGVjaWRlIGlmIHRoZSBjb21tb24gc3RhdHMgbW9kdWxlIG1heSBnZW5lcmF0ZSBzdGF0cyBhYm91dCBjaGFuZ2VzIHJlZ2FyZGluZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBjaGFuZ2VzIGFuZCBpbmNpZGVudCB0aWNrZXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGv2bm5lbiBTaWUgZmVzdGxlZ2VuLCBvYiBkYXMgU3RhdGlzdGlrLU1vZHVsIGF1Y2ggYWxsZ2VtZWluZSBTdGF0aXN0aWtlbiD8YmVyIENoYW5nZXMgYnpnbC4gZGVtIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBDaGFuZ2VzIHVuZCBWb3JmYWxscy1UaWNrZXRzIGdlbmVyaWVyZW4gZGFyZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzSW5jaWRlbnRzPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNQ2hhbmdlTWFuYWdlbWVudFJmY1JlcXVlc3RlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBkZWNpZGUgaWYgdGhlIGNvbW1vbiBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IHRoZSBudW1iZXIgb2YgUmZjIHRpY2tldHMgYSByZXF1ZXN0ZXIgY3JlYXRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gU2llIGZlc3RsZWdlbiwgb2IgZGFzIFN0YXRpc3Rpay1Nb2R1bCBhdWNoIGFsbGdlbWVpbmUgU3RhdGlzdGlrZW4g/GJlciBkaWUgQW56YWhsIHZvbiBSZkMtVGlja2V0cywgZGllIHZvbiBCZW51dHplcm4gZXJ6ZXVndCB3dXJkZW4sIGdlbmVyaWVyZW4gZGFyZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRSZmNSZXF1ZXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01DaGFuZ2VNYW5hZ2VtZW50Q2hhbmdlc1BlckNJQ2xhc3NlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBkZWNpZGUgaWYgdGhlIGNvbW1vbiBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IGNoYW5nZXMgZG9uZSBmb3IgY29uZmlnIGl0ZW0gY2xhc3Nlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gU2llIGZlc3RsZWdlbiwgb2IgZGFzIFN0YXRpc3Rpay1Nb2R1bCBhdWNoIGFsbGdlbWVpbmUgU3RhdGlzdGlrZW4g/GJlciBkaWUgQW56YWhsIGRlciBkdXJjaGdlZvxocnRlbiBDaGFuZ2VzIG5hY2ggQ0ktS2xhc3NlIGdlbmVyaWVyZW4gZGFyZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzUGVyQ0lDbGFzc2VzPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNoYW5nZTo6TnVtYmVyR2VuZXJhdG9yIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2VsZWN0IHRoZSBjaGFuZ2UgbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUuIFdpdGggIkRhdGUiIHRoZSBjaGFuZ2UgbnVtYmVycyB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCBkYXRlIGFuZCBhIGNvdW50ZXIuIFRoZSBmb3JtYXQgbG9va3MgbGlrZSBZZWFyLk1vbnRoLkRheS5jb3VudGVyLCBlLmcuIDIwMTAwNjI0MDAwMDEsIDIwMTAwNjI0MDAwMDIuIFdpdGggIkRhdGVDaGVja3N1bSIgdGhlIGNvdW50ZXIgd2lsbCBiZSBhcHBlbmRlZCBhcyBjaGVja3N1bSB0byB0aGUgc3RyaW5nIG9mIGRhdGUgcGx1cyB0aGUgU3lzdGVtSUQuIFRoZSBjaGVja3N1bSB3aWxsIGJlIHJvdGF0ZWQgb24gYSBkYWlseSBiYXNpcy4gVGhlIGZvcm1hdCBsb29rcyBsaWtlIFllYXIuTW9udGguRGF5LlN5c3RlbUlELkNvdW50ZXIuQ2hlY2tTdW0sIGUuZy4gMjAxMDA2MjQxMDAwMDAxNywgMjAxMDA2MjQxMDAwMDAyNi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXVzd2FobCBkZXMgTW9kdWxzIHp1ciBHZW5lcmllcnVuZyBkZXIgQ2hhbmdlbnVtbWVybi4gIkRhdGUiIGdlbmVyaWVydCBkaWUgQ2hhbmdlbnVtbWVyIGF1cyBEYXR1bSB1bmQgZGVtIENvdW50ZXIsIGVzIHdpcmQgZGFzIEZvcm1hdCAiSmFoci5Nb25hdC5UYWcuQ291bnRlciIgdmVyd2VuZGV0LCB6LiBCLiAyMDEwMDYyNDAwMDAxLCAyMDEwMDYyNDAwMDAyLiAiRGF0ZUNoZWNrc3VtIiBlcnpldWd0IGRpZSBDaGFuZ2VudW1tZXIgYXVzIGRlbSBEYXR1bSwgZGVyIFN5c3RlbUlELCBkZW0gQ291bnRlciB1bmQgZWluZXIgQ2hlY2tzdW1tZS4gRXMgd2lyZCBkYXMgRm9ybWF0ICJKYWhyLk1vbmF0LlRhZy5TeXN0ZW1JRC5Db3VudGVyLkNoZWNrU3VtbWUiIHZlcndlbmRldCwgei4gQi4gMjAxMDA2MjQxMDAwMDAxNywgMjAxMDA2MjQxMDAwMDAyNi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNIENoYW5nZSBNYW5hZ2VtZW50PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNoYW5nZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gTG9jYXRpb249Iktlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9OdW1iZXIvKi5wbSIgU2VsZWN0ZWRJRD0iS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok51bWJlcjo6RGF0ZUNoZWNrc3VtIj48L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTUNoYW5nZU1hbmFnZW1lbnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0lUU01DaGFuZ2VNYW5hZ2VtZW50LnBtLHYgMS43NiAyMDEwLzA2LzI5IDEyOjU2OjMxIHNiIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01DaGFuZ2VNYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43NiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgIyBtaXNjCiAgICAkTGFuZy0+eydBIGNoYW5nZSBtdXN0IGhhdmUgYSB0aXRsZSEnfSAgICAgICAgICA9ICdFaW4gQ2hhbmdlIGJlbvZ0aWd0IGVpbmVuIFRpdGVsISc7CiAgICAkTGFuZy0+eydUZW1wbGF0ZSBOYW1lJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdWb3JsYWdlbi1OYW1lJzsKICAgICRMYW5nLT57J1RlbXBsYXRlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1ZvcmxhZ2VuJzsKICAgICRMYW5nLT57J0Egd29ya29yZGVyIG11c3QgaGF2ZSBhIHRpdGxlISd9ICAgICAgID0gJ0VpbmUgV29ya29yZGVyIGJlbvZ0aWd0IGVpbmVuIFRpdGVsISc7CiAgICAkTGFuZy0+eydDbGVhcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdM9nNjaGUnOwogICAgJExhbmctPnsnQ3JlYXRlIGEgY2hhbmdlIGZyb20gdGhpcyB0aWNrZXQhJ30gICAgPSAnRWluZW4gQ2hhbmdlIGF1cyBkaWVzZW0gVGlja2V0IGVyc3RlbGxlbiEnOwogICAgJExhbmctPnsnQ3JlYXRlIENoYW5nZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIGVyc3RlbGxlbic7CiAgICAkTGFuZy0+eydlLmcuJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICd6LiBCLic7CiAgICAkTGFuZy0+eydTYXZlIENoYW5nZSBhcyB0ZW1wbGF0ZSd9ICAgICAgICAgICAgICA9ICdTcGVpY2hlcmUgQ2hhbmdlIGFscyBWb3JsYWdlJzsKICAgICRMYW5nLT57J1NhdmUgV29ya29yZGVyIGFzIHRlbXBsYXRlJ30gICAgICAgICAgID0gJ1NwZWljaGVyZSBXb3Jrb3JkZXIgYWxzIFZvcmxhZ2UnOwogICAgJExhbmctPnsnU2F2ZSBDaGFuZ2UgQ0FCIGFzIHRlbXBsYXRlJ30gICAgICAgICAgPSAnU3BlaWNoZXJlIENoYW5nZSBDQUIgYWxzIFZvcmxhZ2UnOwogICAgJExhbmctPnsnTmV3IHRpbWUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTmV1ZSBaZWl0JzsKICAgICRMYW5nLT57J1JlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIERhdGUnfSAgICAgICAgID0gJ1d1bnNjaHRlcm1pbiAoZGVzIEt1bmRlbiknOwogICAgJExhbmctPnsnVGhlIHBsYW5uZWQgZW5kIHRpbWUgaXMgaW52YWxpZCEnfSAgICAgPSAnRGllIGdlcGxhbnRlIEVuZHplaXQgaXN0IHVuZ/xsdGlnISc7CiAgICAkTGFuZy0+eydUaGUgcGxhbm5lZCBzdGFydCB0aW1lIGlzIGludmFsaWQhJ30gICA9ICdEaWUgZ2VwbGFudGUgU3RhcnR6ZWl0IGlzdCB1bmf8bHRpZyEnOwogICAgJExhbmctPnsnVGhlIHBsYW5uZWQgc3RhcnQgdGltZSBtdXN0IGJlIGJlZm9yZSB0aGUgcGxhbm5lZCBlbmQgdGltZSEnfQogICAgICAgID0gJ0RlciBnZXBsYW50ZSBTdGFydCBtdXNzIHZvciBkZW0gZ2VwbGFudGVuIEVuZGUgbGllZ2VuISc7CiAgICAkTGFuZy0+eydUaGUgcmVxdWVzdGVkIHRpbWUgaXMgaW52YWxpZCEnfSAgICAgICA9ICdEaWUgYW5nZWdlYmVuZSBaZWl0IGlzdCB1bmf8bHRpZyEnOwogICAgJExhbmctPnsnVGltZSB0eXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnWmVpdC1UeXAnOwogICAgJExhbmctPnsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIHRlbXBsYXRlPyd9ID0gJ032Y2h0ZW4gU2llIGRpZXNlIFZvcmxhZ2Ugd2lya2xpY2ggbPZzY2hlbj8nOwogICAgJExhbmctPnsnQ2hhbmdlIEFkdmlzb3J5IEJvYXJkJ30gICAgICAgICAgICAgICAgPSAnQ2hhbmdlIEFkdmlzb3J5IEJvYXJkJzsKICAgICRMYW5nLT57J0NBQid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NBQic7CiAgICAkTGFuZy0+eydSZXNldCBTdGF0ZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdTZXR6ZSBTdGF0dXMgenVy/GNrJzsKCiAgICAjIElUU00gQ2hhbmdlTWFuYWdlbWVudCBpY29ucwogICAgJExhbmctPnsnTXkgQ2hhbmdlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWVpbmUgQ2hhbmdlcyc7CiAgICAkTGFuZy0+eydNeSBXb3Jrb3JkZXJzJ30gICAgICAgICAgICAgICAgICAgICAgICA9ICdNZWluZSBXb3Jrb3JkZXJzJzsKICAgICRMYW5nLT57J1BJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpJ30gICAgID0gJ1BJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpJzsKICAgICRMYW5nLT57J1BTQSAoUHJvamVjdGVkIFNlcnZpY2UgQXZhaWxhYmlsaXR5KSd9ID0gJ1BTQSAoUHJvamVjdGVkIFNlcnZpY2UgQXZhaWxhYmlsaXR5KSc7CiAgICAkTGFuZy0+eydNeSBDQUJzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNZWluZSBDQUJzJzsKICAgICRMYW5nLT57J0NoYW5nZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0NoYW5nZSDcYmVyc2ljaHQnOwogICAgJExhbmctPnsnVGVtcGxhdGUgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgPSAnVm9ybGFnZW4t3GJlcnNpY2h0JzsKICAgICRMYW5nLT57J1NlYXJjaCBDaGFuZ2VzJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1N1Y2hlIENoYW5nZXMnOwoKICAgICMgQ2hhbmdlIG1lbnUKICAgICRMYW5nLT57J0lUU00gQ2hhbmdlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDaGFuZ2UnOwogICAgJExhbmctPnsnSVRTTSBXb3Jrb3JkZXInfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dvcmtvcmRlcic7CiAgICAkTGFuZy0+eydTY2hlZHVsZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnU2NoZWR1bGUnOwogICAgJExhbmctPnsnSW52b2x2ZWQgUGVyc29ucyd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0JldGVpbGlndGUgUGVyc29uZW4nOwogICAgJExhbmctPnsnQWRkIFdvcmtvcmRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1dvcmtvcmRlciBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J1RlbXBsYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdWb3JsYWdlJzsKICAgICRMYW5nLT57J01vdmUgVGltZSBTbG90J30gICAgICAgICAgICAgICAgICAgICAgICA9ICdWZXJzY2hpZWJlIFRpbWVzbG90JzsKICAgICRMYW5nLT57J1ByaW50IHRoZSBjaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICdEaWVzZW4gQ2hhbmdlIGRydWNrZW4nOwogICAgJExhbmctPnsnRWRpdCB0aGUgY2hhbmdlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0RpZXNlbiBDaGFuZ2UgYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydDaGFuZ2UgaW52b2x2ZWQgcGVyc29ucyBvZiB0aGUgY2hhbmdlJ30gPSAnQmVhcmJlaXRlIGJldGVpbGlndGUgUGVyc29uZW4gZGllc2VzIENoYW5nZXMnOwogICAgJExhbmctPnsnQWRkIGEgd29ya29yZGVyIHRvIHRoZSBjaGFuZ2UnfSAgICAgICAgID0gJ0b8Z2UgZWluZSBXb3Jrb3JkZXIgenUgZGllc2VtIENoYW5nZSBoaW56dSc7CiAgICAkTGFuZy0+eydFZGl0IHRoZSBjb25kaXRpb25zIG9mIHRoZSBjaGFuZ2UnfSAgICAgPSAnQmVhcmJlaXRlIGRpZSBCZWRpbmd1bmdlbiBkaWVzZXMgQ2hhbmdlcyc7CiAgICAkTGFuZy0+eydMaW5rIGFub3RoZXIgb2JqZWN0IHRvIHRoZSBjaGFuZ2UnfSAgICAgPSAnVmVya278cGZlIGVpbiBhbmRlcmVzIE9iamVrdCBtaXQgZGllc2VtIENoYW5nZSc7CiAgICAkTGFuZy0+eydTYXZlIGNoYW5nZSBhcyBhIHRlbXBsYXRlJ30gICAgICAgICAgICAgPSAnU3BlaWNoZXJlIGRpZXNlbiBDaGFuZ2UgYWxzIFZvcmxhZ2UnOwogICAgJExhbmctPnsnTW92ZSBhbGwgd29ya29yZGVycyBpbiB0aW1lJ30gICAgICAgICAgID0gJ1ZlcnNjaGllYmUgYWxsZSBXb3Jrb3JkZXJzIHVtIGVpbmUgbmV1ZSB6ZWl0bGljaGUgRGlmZmVyZW56JzsKICAgICRMYW5nLT57J0N1cnJlbnQgQ0FCJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBa3R1ZWxsZXMgQ0FCJzsKICAgICRMYW5nLT57J0FkZCB0byBDQUInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdadW0gQ0FCIGhpbnp1ZvxnZW4nOwogICAgJExhbmctPnsnQWRkIENBQiBUZW1wbGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0VpbmUgQ0FCLVZvcmxhZ2UgaGluenVm/Gdlbic7CiAgICAkTGFuZy0+eydBZGQgV29ya29yZGVyIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnV29ya29yZGVyIGhpbnp1ZvxnZW4genUnOwogICAgJExhbmctPnsnU2VsZWN0IFdvcmtvcmRlciBUZW1wbGF0ZSd9ICAgICAgICAgICAgID0gJ1dvcmtvcmRlci1Wb3JsYWdlIGF1c3fkaGxlbic7CiAgICAkTGFuZy0+eydTZWxlY3QgQ2hhbmdlIFRlbXBsYXRlJ30gICAgICAgICAgICAgICAgPSAnQ2hhbmdlLVZvcmxhZ2UgYXVzd+RobGVuJzsKICAgICRMYW5nLT57J1RoZSBwbGFubmVkIHRpbWUgaXMgaW52YWxpZCEnfSAgICAgICAgICA9ICdEZXIgZ2VwbGFudGUgWmVpdHJhdW0gaXN0IHVuZ/xsdGlnISc7CgogICAgIyBXb3Jrb3JkZXIgbWVudQogICAgJExhbmctPnsnV29ya29yZGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnV29ya29yZGVyJzsKICAgICRMYW5nLT57J1NhdmUgd29ya29yZGVyIGFzIGEgdGVtcGxhdGUnfSAgICAgICAgID0gJ1NwZWljaGVyZSBkaWVzZSBXb3Jrb3JkZXIgYWxzIFZvcmxhZ2UnOwogICAgJExhbmctPnsnTGluayBhbm90aGVyIG9iamVjdCB0byB0aGUgd29ya29yZGVyJ30gPSAnVmVya278cGZlIGVpbiBhbmRlcmVzIE9iamVrdCBtaXQgZGllc2VyIFdvcmtvcmRlcic7CiAgICAkTGFuZy0+eydEZWxldGUgV29ya29yZGVyJ30gICAgICAgICAgICAgICAgICAgICA9ICdEaWVzZSBXb3Jrb3JkZXIgbPZzY2hlbic7CiAgICAkTGFuZy0+eydFZGl0IHRoZSB3b3Jrb3JkZXInfSAgICAgICAgICAgICAgICAgICA9ICdEaWVzZSBXb3Jrb3JkZXIgYmVhcmJlaXRlbic7CiAgICAkTGFuZy0+eydQcmludCB0aGUgd29ya29yZGVyJ30gICAgICAgICAgICAgICAgICA9ICdEaWVzZSBXb3Jrb3JkZXIgZHJ1Y2tlbic7CiAgICAkTGFuZy0+eydTZXQgdGhlIGFnZW50IGZvciB0aGUgd29ya29yZGVyJ30gICAgICA9ICdFaW5lbiBBZ2VudGVuIGb8ciBkaWVzZSBXb3Jrb3JkZXIgYXVzd+RobGVuJzsKCiAgICAjIFRlbXBsYXRlIG1lbnUKICAgICRMYW5nLT57J0EgdGVtcGxhdGUgbXVzdCBoYXZlIGEgbmFtZSEnfSA9ICdFaW5lIFZvcmxhZ2UgYmVu9nRpZ3QgZWluZW4gTmFtZW4hJzsKCiAgICAjIENoYW5nZSBhdHRyaWJ1dGVzIGFzIHJldHVybmVkIGZyb20gQ2hhbmdlR2V0KCksIG9yIHRha2VuIGJ5IENoYW5nZVVwZGF0ZSgpCiAgICAkTGFuZy0+eydBY2NvdW50ZWRUaW1lJ30gICAgPSAnQmVu9nRpZ3RlIFplaXQnOwogICAgJExhbmctPnsnQWN0dWFsRW5kVGltZSd9ICAgID0gJ1RhdHPkY2hsaWNoZXMgRW5kZSc7CiAgICAkTGFuZy0+eydBY3R1YWxTdGFydFRpbWUnfSAgPSAnVGF0c+RjaGxpY2hlciBTdGFydCc7CiAgICAkTGFuZy0+eydDQUJBZ2VudCd9ICAgICAgICAgPSAnQ0FCIEFnZW50JzsKICAgICRMYW5nLT57J0NBQkFnZW50cyd9ICAgICAgICA9ICdDQUIgQWdlbnRzJzsKICAgICRMYW5nLT57J0NBQkN1c3RvbWVyJ30gICAgICA9ICdDQUIgS3VuZGUnOwogICAgJExhbmctPnsnQ0FCQ3VzdG9tZXJzJ30gICAgID0gJ0NBQiBLdW5kZW4nOwogICAgJExhbmctPnsnQ2F0ZWdvcnknfSAgICAgICAgID0gJ0thdGVnb3JpZSc7CiAgICAkTGFuZy0+eydDaGFuZ2VCdWlsZGVyJ30gICAgPSAnQ2hhbmdlIEJ1aWxkZXInOwogICAgJExhbmctPnsnQ2hhbmdlQnknfSAgICAgICAgID0gJ0dl5G5kZXJ0IHZvbic7CiAgICAkTGFuZy0+eydDaGFuZ2VNYW5hZ2VyJ30gICAgPSAnQ2hhbmdlIE1hbmFnZXInOwogICAgJExhbmctPnsnQ2hhbmdlTnVtYmVyJ30gICAgID0gJ0NoYW5nZSBOdW1tZXInOwogICAgJExhbmctPnsnQ2hhbmdlVGltZSd9ICAgICAgID0gJ0dl5G5kZXJ0JzsKICAgICRMYW5nLT57J0NoYW5nZVN0YXRlJ30gICAgICA9ICdDaGFuZ2UgU3RhdHVzJzsKICAgICRMYW5nLT57J0NoYW5nZVRpdGxlJ30gICAgICA9ICdDaGFuZ2UgVGl0ZWwnOwogICAgJExhbmctPnsnQ3JlYXRlQnknfSAgICAgICAgID0gJ0Vyc3RlbGx0IHZvbic7CiAgICAkTGFuZy0+eydDcmVhdGVUaW1lJ30gICAgICAgPSAnRXJzdGVsbHQnOwogICAgJExhbmctPnsnRGVzY3JpcHRpb24nfSAgICAgID0gJ0Jlc2NocmVpYnVuZyc7CiAgICAkTGFuZy0+eydJbXBhY3QnfSAgICAgICAgICAgPSAnQXVzd2lya3VuZyc7CiAgICAkTGFuZy0+eydKdXN0aWZpY2F0aW9uJ30gICAgPSAnQmVncvxuZHVuZyc7CiAgICAkTGFuZy0+eydQbGFubmVkRWZmb3J0J30gICAgPSAnR2VwbGFudGVyIEF1ZndhbmQnOwogICAgJExhbmctPnsnUGxhbm5lZEVuZFRpbWUnfSAgID0gJ0dlcGxhbnRlcyBFbmRlJzsKICAgICRMYW5nLT57J1BsYW5uZWRTdGFydFRpbWUnfSA9ICdHZXBsYW50ZXIgU3RhcnQnOwogICAgJExhbmctPnsnUHJpb3JpdHknfSAgICAgICAgID0gJ1ByaW9yaXTkdCc7CiAgICAkTGFuZy0+eydSZXF1ZXN0ZWRUaW1lJ30gICAgPSAnV3Vuc2NodGVybWluJzsKCiAgICAjIFdvcmtvcmRlciBhdHRyaWJ1dGVzIGFzIHJldHVybmVkIGZyb20gV29ya09yZGVyR2V0KCksIG9yIHRha2VuIGJ5IFdvcmtPcmRlclVwZGF0ZSgpCiAgICAkTGFuZy0+eydJbnN0cnVjdGlvbid9ICAgICAgPSAnQW53ZWlzdW5nJzsKICAgICRMYW5nLT57J1JlcG9ydCd9ICAgICAgICAgICA9ICdCZXJpY2h0JzsKICAgICRMYW5nLT57J1dvcmtPcmRlckFnZW50J30gICA9ICdXb3Jrb3JkZXIgQWdlbnQnOwogICAgJExhbmctPnsnV29ya09yZGVyTnVtYmVyJ30gID0gJ1dvcmtvcmRlciBOdW1tZXInOwogICAgJExhbmctPnsnV29ya09yZGVyU3RhdGUnfSAgID0gJ1dvcmtvcmRlciBTdGF0dXMnOwogICAgJExhbmctPnsnV29ya09yZGVyVGl0bGUnfSAgID0gJ1dvcmtvcmRlciBUaXRlbCc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJUeXBlJ30gICAgPSAnV29ya29yZGVyIFR5cCc7CgogICAgIyBDaGFuZ2UgaGlzdG9yeQogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQWRkJ30gICAgICAgICAgICAgID0gJ05ldWVyIENoYW5nZSAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVVwZGF0ZSd9ICAgICAgICAgICA9ICclczogTmV1OiAlcyAtPiBBbHQ6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUxpbmtBZGQnfSAgICAgICAgICA9ICdMaW5rIHp1ICVzIChJRD0lcykgaGluenVnZWb8Z3QnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlTGlua0RlbGV0ZSd9ICAgICAgID0gJ0xpbmsgenUgJXMgKElEPSVzKSBnZWz2c2NodCc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VDQUJVcGRhdGUnfSAgICAgICAgPSAnJXM6IE5ldTogJXMgLT4gQWx0OiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VDQUJEZWxldGUnfSAgICAgICAgPSAnQ0FCIGdlbPZzY2h0ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUF0dGFjaG1lbnRBZGQnfSAgICA9ICdOZXVlciBBbmhhbmc6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUF0dGFjaG1lbnREZWxldGUnfSA9ICdBbmhhbmcgZ2Vs9nNjaHQ6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZU5vdGlmaWNhdGlvblNlbnQnfSA9ICdCZW5hY2hyaWNodGlndW5nIGFuICVzIGdlc2NoaWNrdCAoRXZlbnQ6ICVzKSc7CgogICAgIyB3b3Jrb3JkZXIgaGlzdG9yeQogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWRkJ30gICAgICAgICAgICAgID0gJ05ldWUgV29ya29yZGVyIChJRD0lcyknOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyVXBkYXRlJ30gICAgICAgICAgID0gJyVzOiBOZXU6ICVzIC0+IEFsdDogJXMnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTGlua0FkZCd9ICAgICAgICAgID0gJ0xpbmsgenUgJXMgKElEPSVzKSBoaW56dWdlZvxndCc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJMaW5rRGVsZXRlJ30gICAgICAgPSAnTGluayB0byAlcyAoSUQ9JXMpIGdlbPZzY2h0JzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckRlbGV0ZSd9ICAgICAgICAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSBnZWz2c2NodCc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBdHRhY2htZW50QWRkJ30gICAgPSAnTmV1ZXIgQW5oYW5nIGb8ciBXb3Jrb3JkZXI6ICVzJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUnfSA9ICdBbmhhbmcgdm9uIFdvcmtvcmRlciBnZWz2c2NodDogJXMnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTm90aWZpY2F0aW9uU2VudCd9ID0gJ0JlbmFjaHJpY2h0aWd1bmcgYW4gJXMgZ2VzY2hpY2t0IChFdmVudDogJXMpJzsKCiAgICAjIGxvbmcgd29ya29yZGVyIGhpc3RvcnkKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFkZFdpdGhXb3JrT3JkZXJJRCd9ICAgICAgICAgICAgICA9ICdOZXVlIFdvcmtvcmRlciAoSUQ9JXMpJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlclVwZGF0ZVdpdGhXb3JrT3JkZXJJRCd9ICAgICAgICAgICA9ICcoSUQ9JXMpICVzOiBOZXU6ICVzIC0+IEFsdDogJXMnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTGlua0FkZFdpdGhXb3JrT3JkZXJJRCd9ICAgICAgICAgID0gJyhJRD0lcykgTGluayB6dSAlcyAoSUQ9JXMpIGhpbnp1Z2Vm/Gd0JzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckxpbmtEZWxldGVXaXRoV29ya09yZGVySUQnfSAgICAgICA9ICcoSUQ9JXMpIExpbmsgdG8gJXMgKElEPSVzKSBnZWz2c2NodCc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJEZWxldGVXaXRoV29ya09yZGVySUQnfSAgICAgICAgICAgPSAnV29ya29yZGVyIChJRD0lcykgZ2Vs9nNjaHQnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQXR0YWNobWVudEFkZFdpdGhXb3JrT3JkZXJJRCd9ICAgID0gJyhJRD0lcykgTmV1ZXIgQW5oYW5nIGb8ciBXb3Jrb3JkZXI6ICVzJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckF0dGFjaG1lbnREZWxldGVXaXRoV29ya09yZGVySUQnfSA9ICcoSUQ9JXMpIEFuaGFuZyB2b24gV29ya29yZGVyIGdlbPZzY2h0OiAlcyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJOb3RpZmljYXRpb25TZW50V2l0aFdvcmtPcmRlcklEJ30gPSAnKElEPSVzKSBCZW5hY2hyaWNodGlndW5nIGFuICVzIGdlc2NoaWNrdCAoRXZlbnQ6ICVzKSc7CgogICAgIyBjb25kaXRpb24gaGlzdG9yeQogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q29uZGl0aW9uQWRkJ30gICAgICAgPSAnJXM6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNvbmRpdGlvbkFkZElEJ30gICAgID0gJ05ldWUgQmVkaW5ndW5nIChJRD0lcyknOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q29uZGl0aW9uVXBkYXRlJ30gICAgPSAnJXMgKEJlZGluZ3VuZyBJRD0lcyk6IE5ldTogJXMgLT4gT2xkOiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25EZWxldGUnfSAgICA9ICdCZWRpbmd1bmcgKElEPSVzKSBnZWz2c2NodCc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25EZWxldGVBbGwnfSA9ICdBbGxlIEJlZGluZ3VuZ2VuIHZvbiBDaGFuZ2UgKElEPSVzKSBnZWz2c2NodCc7CgogICAgIyBleHByZXNzaW9uIGhpc3RvcnkKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25BZGQnfSAgICAgICA9ICclczogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6RXhwcmVzc2lvbkFkZElEJ30gICAgID0gJ05ldWUgRXhwcmVzc2lvbiAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25VcGRhdGUnfSAgICA9ICclcyAoRXhwcmVzc2lvbiBJRD0lcyk6IE5ldTogJXMgLT4gT2xkOiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpFeHByZXNzaW9uRGVsZXRlJ30gICAgPSAnRXhwcmVzc2lvbiAoSUQ9JXMpIGdlbPZzY2h0JzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25EZWxldGVBbGwnfSA9ICdBbGxlIGxvZ2lzY2hlbiBBdXNkcvxja2Ugdm9uIEJlZGluZ3VuZyAoSUQ9JXMpIGdlbPZzY2h0JzsKCiAgICAjIGFjdGlvbiBoaXN0b3J5CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpBY3Rpb25BZGQnfSAgICAgICA9ICclczogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6QWN0aW9uQWRkSUQnfSAgICAgPSAnTmV1ZSBBY3Rpb24gKElEPSVzKSc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpBY3Rpb25VcGRhdGUnfSAgICA9ICclcyAoQWN0aW9uIElEPSVzKTogTmV1OiAlcyAtPiBPbGQ6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkRlbGV0ZSd9ICAgID0gJ0FjdGlvbiAoSUQ9JXMpIGdlbPZzY2h0JzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkRlbGV0ZUFsbCd9ID0gJ0FsbGUgQWt0aW9uZW4gdm9uIEJlZGluZ3VuZyAoSUQ9JXMpIGdlbPZzY2h0JzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkV4ZWN1dGUnfSAgID0gJ0FrdGlvbiAoSUQ9JXMpIGF1c2dlZvxocnQ6ICVzJzsKICAgICRMYW5nLT57J0FjdGlvbkV4ZWN1dGU6OnN1Y2Nlc3NmdWxseSd9ICAgID0gJ2VyZm9sZ3JlaWNoJzsKICAgICRMYW5nLT57J0FjdGlvbkV4ZWN1dGU6OnVuc3VjY2Vzc2Z1bGx5J30gID0gJ25pY2h0IGVyZm9sZ3JlaWNoJzsKCiAgICAjIGhpc3RvcnkgZm9yIHRpbWUgZXZlbnRzCiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZCd9ICAgICAgICAgICAgICAgICAgICAgID0gJ0NoYW5nZSAoSUQ9JXMpIGhhdCBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQuJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVBsYW5uZWRFbmRUaW1lUmVhY2hlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIChJRD0lcykgaGF0IGdlcGxhbnRlIEVuZHplaXQgZXJyZWljaHQuJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUFjdHVhbFN0YXJ0VGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIChJRD0lcykgaGF0IGJlZ29ubmVuLic7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NoYW5nZSAoSUQ9JXMpIHd1cmRlIGJlZW5kZXQuJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIChJRD0lcykgaGF0IGdld/xuc2NodGUgRW5kemVpdCBlcnJlaWNodC4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSBoYXQgZ2VwbGFudGUgU3RhcnR6ZWl0IGVycmVpY2h0Lic7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgID0gJ1dvcmtvcmRlciAoSUQ9JXMpIGhhdCBnZXBsYW50ZSBFbmR6ZWl0IGVycmVpY2h0Lic7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBY3R1YWxTdGFydFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgID0gJ1dvcmtvcmRlciAoSUQ9JXMpIGhhdCBiZWdvbm5lbi4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSB3dXJkZSBiZWVuZGV0Lic7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZFdpdGhXb3JrT3JkZXJJRCd9ID0gJ1dvcmtvcmRlciAoSUQ9JXMpIGhhdCBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQuJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlclBsYW5uZWRFbmRUaW1lUmVhY2hlZFdpdGhXb3JrT3JkZXJJRCd9ICAgPSAnV29ya29yZGVyIChJRD0lcykgaGF0IGdlcGxhbnRlIEVuZHplaXQgZXJyZWljaHQuJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWRXaXRoV29ya09yZGVySUQnfSAgPSAnV29ya29yZGVyIChJRD0lcykgaGF0IGJlZ29ubmVuLic7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZFdpdGhXb3JrT3JkZXJJRCd9ICAgID0gJ1dvcmtvcmRlciAoSUQ9JXMpIHd1cmRlIGJlZW5kZXQuJzsKCiAgICAjIGNoYW5nZSBzdGF0ZXMKICAgICRMYW5nLT57J3JlcXVlc3RlZCd9ICAgICAgICA9ICdSZXF1ZXN0ZWQnOwogICAgJExhbmctPnsncGVuZGluZyBhcHByb3ZhbCd9ID0gJ1BlbmRpbmcgQXBwcm92YWwnOwogICAgJExhbmctPnsncGVuZGluZyBwaXInfSAgICAgID0gJ1BlbmRpbmcgUElSJzsKICAgICRMYW5nLT57J3JlamVjdGVkJ30gICAgICAgICA9ICdSZWplY3RlZCc7CiAgICAkTGFuZy0+eydhcHByb3ZlZCd9ICAgICAgICAgPSAnQXBwcm92ZWQnOwogICAgJExhbmctPnsnaW4gcHJvZ3Jlc3MnfSAgICAgID0gJ0luIFByb2dyZXNzJzsKICAgICRMYW5nLT57J3N1Y2Nlc3NmdWwnfSAgICAgICA9ICdTdWNjZXNzZnVsJzsKICAgICRMYW5nLT57J2ZhaWxlZCd9ICAgICAgICAgICA9ICdGYWlsZWQnOwogICAgJExhbmctPnsnY2FuY2VsZWQnfSAgICAgICAgID0gJ0NhbmNlbGVkJzsKICAgICRMYW5nLT57J3JldHJhY3RlZCd9ICAgICAgICA9ICdSZXRyYWN0ZWQnOwoKICAgICMgd29ya29yZGVyIHN0YXRlcwogICAgJExhbmctPnsnY3JlYXRlZCd9ICAgICA9ICdDcmVhdGVkJzsKICAgICRMYW5nLT57J2FjY2VwdGVkJ30gICAgPSAnQWNjZXB0ZWQnOwogICAgJExhbmctPnsncmVhZHknfSAgICAgICA9ICdSZWFkeSc7CiAgICAkTGFuZy0+eydpbiBwcm9ncmVzcyd9ID0gJ0luIFByb2dyZXNzJzsKICAgICRMYW5nLT57J2Nsb3NlZCd9ICAgICAgPSAnQ2xvc2VkJzsKICAgICRMYW5nLT57J2NhbmNlbGVkJ30gICAgPSAnQ2FuY2VsZWQnOwoKICAgICMgQWRtaW4gSW50ZXJmYWNlCiAgICAkTGFuZy0+eydDYXRlZ29yeSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSd9ICAgICAgPSAnS2F0ZWdvcmllIDwtPiBBdXN3aXJrdW5nIDwtPiBQcmlvcml05HQnOwogICAgJExhbmctPnsnTm90aWZpY2F0aW9uIChJVFNNIENoYW5nZSBNYW5hZ2VtZW50KSd9ID0gJ0JlbmFjaHJpY2h0aWd1bmcgKElUU00gQ2hhbmdlIE1hbmFnZW1lbnQpJzsKCiAgICAjIEFkbWluIFN0YXRlTWFjaGluZQogICAgJExhbmctPnsnQWRkIGEgc3RhdGUgdHJhbnNpdGlvbid9ICAgICAgICAgICAgICAgPSAnSGluenVm/GdlbiBlaW5lcyBTdGF0dXMt3GJlcmdhbmdzJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBzdGF0ZSB0cmFuc2l0aW9uIGZvcid9ICAgICAgID0gJ0hpbnp1ZvxnZW4gZWluZXMgbmV1ZW4gU3RhdHVzLdxiZXJnYW5ncyBm/HInOwogICAgJExhbmctPnsnRWRpdCBhIHN0YXRlIHRyYW5zaXRpb24gZm9yJ30gICAgICAgICAgPSAnQmVhcmJlaXRlbiBlaW5lcyBTdGF0dXMt3GJlcmdhbmdzIGb8cic7CiAgICAkTGFuZy0+eydPdmVydmlldyBvdmVyIHN0YXRlIHRyYW5zaXRpb25zIGZvcid9ICA9ICfcYmVyc2ljaHQg/GJlciBTdGF0dXMt3GJlcmfkbmdlIGb8cic7CiAgICAkTGFuZy0+eydPYmplY3QgTmFtZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdPYmpla3QgTmFtZSc7CiAgICAkTGFuZy0+eydQbGVhc2Ugc2VsZWN0IGZpcnN0IGEgY2F0YWxvZyBjbGFzcyEnfSA9ICdCaXR0ZSB35GhsZW4gU2llIHp1ZXJzdCBlaW5lIEthdGFsb2cgS2xhc3NlIGF1cyEnOwoKICAgICMgd29ya29yZGVyIHR5cGVzCiAgICAkTGFuZy0+eydhcHByb3ZhbCd9ICA9ICdHZW5laG1pZ3VuZyc7CiAgICAkTGFuZy0+eydkZWNpc2lvbid9ICA9ICdFbnRzY2hlaWR1bmcnOwogICAgJExhbmctPnsnd29ya29yZGVyJ30gPSAnV29ya29yZGVyJzsKICAgICRMYW5nLT57J2JhY2tvdXQnfSAgID0gJ0JhY2tvdXQgUGxhbic7CiAgICAkTGFuZy0+eydwaXInfSAgICAgICA9ICdQSVIgKFBvc3QgSW1wbGVtZW50YXRpb24gUmV2aWV3KSc7CgogICAgIyBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uZGl0aW9uIGV4cHJlc3Npb25zIGFuZCBhY3Rpb25zCiAgICAkTGFuZy0+eydJVFNNQ2hhbmdlJ30gICAgPSAnQ2hhbmdlJzsKICAgICRMYW5nLT57J0lUU01Xb3JrT3JkZXInfSA9ICdXb3Jrb3JkZXInOwogICAgJExhbmctPnsnSVRTTUNvbmRpdGlvbid9ID0gJ0JlZGluZ3VuZyc7CgogICAgIyBPdmVydmlld3MKICAgICRMYW5nLT57J0NoYW5nZSBTY2hlZHVsZSd9ID0gJ0NoYW5nZSBTY2hlZHVsZSc7CgogICAgIyBXb3Jrb3JkZXIgZGVsZXRlCiAgICAkTGFuZy0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgd29ya29yZGVyPyd9ID0gJ032Y2h0ZW4gU2llIGRpZXNlIFdvcmtvcmRlciB3aXJrbGljaCBs9nNjaGVuPyc7CiAgICAkTGFuZy0+eydZb3UgY2FuIG5vdCBkZWxldGUgdGhpcyBXb3Jrb3JkZXIuIEl0IGlzIHVzZWQgaW4gYXQgbGVhc3Qgb25lIENvbmRpdGlvbiEnfSA9ICdTaWUga/ZubmVuIGRpZXNlIFdvcmtvcmRlciBuaWNodCBs9nNjaGVuLiBTaWUgd2lyZCBpbiBtaW5kZXN0ZW5zIGVpbmVyIEJlZGluZ3VuZyB2ZXJ3ZW5kZXQhJzsKICAgICRMYW5nLT57J1RoaXMgV29ya29yZGVyIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBDb25kaXRpb24ocyknfSA9ICdEaWVzZSBXb3Jrb3JkZXIgZmluZGV0IFZlcndlbmR1bmcgaW4gZGVuIGZvbGdlbmRlbiBCZWRpbmd1bmcoZW4pJzsKCiAgICAjIFRha2Ugd29ya29yZGVyCiAgICAkTGFuZy0+eydUYWtlIFdvcmtvcmRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdXb3Jrb3JkZXIg/GJlcm5laG1lbic7CiAgICAkTGFuZy0+eydUYWtlIHRoZSB3b3Jrb3JkZXInfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdEaWVzZSBXb3Jrb3JkZXIg/GJlcm5laG1lbic7CiAgICAkTGFuZy0+eydDdXJyZW50IEFnZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBa3R1ZWxsZXIgQWdlbnQnOwogICAgJExhbmctPnsnRG8geW91IHJlYWxseSB3YW50IHRvIHRha2UgdGhpcyB3b3Jrb3JkZXI/J30gPSAnV29sbGVuIHNpZSBkaWVzZSBXb3Jrb3JkZXIgd2lya2xpY2gg/GJlcm5laG1lbj8nOwoKICAgICMgQ29uZGl0aW9uIE92ZXJ2aWV3IGFuZCBFZGl0CiAgICAkTGFuZy0+eydDb25kaXRpb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQmVkaW5ndW5nJzsKICAgICRMYW5nLT57J0NvbmRpdGlvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWRpbmd1bmdlbic7CiAgICAkTGFuZy0+eydFeHByZXNzaW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTG9naXNjaGVyIEF1c2RydWNrJzsKICAgICRMYW5nLT57J0V4cHJlc3Npb25zJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMb2dpc2NoZSBBdXNkcvxja2UnOwogICAgJExhbmctPnsnQWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FrdGlvbic7CiAgICAkTGFuZy0+eydBY3Rpb25zJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWt0aW9uZW4nOwogICAgJExhbmctPnsnTWF0Y2hpbmcnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ9xiZXJlaW5zdGltbXVuZyc7CiAgICAkTGFuZy0+eydDb25kaXRpb25zIGFuZCBBY3Rpb25zJ30gICAgICAgICAgICAgICAgICAgPSAnQmVkaW5ndW5nZW4gdW5kIEFrdGlvbmVuJzsKICAgICRMYW5nLT57J0FkZCBuZXcgY29uZGl0aW9uIGFuZCBhY3Rpb24gcGFpcid9ICAgICAgICA9ICdG/GdlIGVpbiBuZXVlcyBCZWRpbmd1bmdzLSB1bmQgQWt0aW9ucy1QYWFyIGhpbnp1JzsKICAgICRMYW5nLT57J0EgY29uZGl0aW9uIG11c3QgaGF2ZSBhIG5hbWUhJ30gICAgICAgICAgICA9ICdFaW5lIEJlZGluZ3VuZyBiZW72dGlndCBlaW5lbiBOYW1lbiEnOwogICAgJExhbmctPnsnQ29uZGl0aW9uIEVkaXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0JlZGluZ3VuZyBiZWFyYmVpdGVuJzsKICAgICRMYW5nLT57J0FkZCBuZXcgZXhwcmVzc2lvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdG/GdlIGVpbmVuIG5ldWVuIGxvZ2lzY2hlbiBBdXNkcnVjayBoaW56dSc7CiAgICAkTGFuZy0+eydBZGQgbmV3IGFjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnRvxnZSBlaW5lIG5ldWUgQWt0aW9uIGhpbnp1JzsKICAgICRMYW5nLT57J0FueSBleHByZXNzaW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWxpZWJpZ2VyIGxvZ2lzY2hlciBBdXNkcnVjayc7CiAgICAkTGFuZy0+eydBbGwgZXhwcmVzc2lvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWxsZSBsb2dpc2NoZW4gQXVzZHL8Y2tlJzsKICAgICRMYW5nLT57J2FueSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdiZWxpZWJpZ2UnOwogICAgJExhbmctPnsnYWxsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2FsbGUnOwogICAgJExhbmctPnsnaXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2lzdCc7CiAgICAkTGFuZy0+eydpcyBub3QnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnaXN0IG5pY2h0JzsKICAgICRMYW5nLT57J2lzIGVtcHR5J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdpc3QgbGVlcic7CiAgICAkTGFuZy0+eydpcyBub3QgZW1wdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnaXN0IG5pY2h0IGxlZXInOwogICAgJExhbmctPnsnaXMgZ3JlYXRlciB0aGFuJ30gICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2lzdCBncvZzc2VyIGFscyc7CiAgICAkTGFuZy0+eydpcyBsZXNzIHRoYW4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnaXN0IGtsZWluZXIgYWxzJzsKICAgICRMYW5nLT57J2lzIGJlZm9yZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdpc3Qgdm9yJzsKICAgICRMYW5nLT57J2lzIGFmdGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdpc3QgbmFjaCc7CiAgICAkTGFuZy0+eydjb250YWlucyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZW50aORsdCc7CiAgICAkTGFuZy0+eydub3QgY29udGFpbnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZW50aORsdCBuaWNodCc7CiAgICAkTGFuZy0+eydiZWdpbnMgd2l0aCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnYmVnaW5udCBtaXQnOwogICAgJExhbmctPnsnZW5kcyB3aXRoJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2VuZGV0IG1pdCc7CiAgICAkTGFuZy0+eydzZXQnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnc2V0emUnOwogICAgJExhbmctPnsnbG9jayd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ3NwZXJyZSc7CgogICAgIyBDaGFuZ2UgWm9vbQogICAgJExhbmctPnsnQ2hhbmdlIEluaXRpYXRvcihzKSd9ID0gJ0NoYW5nZSBJbml0aWF0b3IocyknOwoKICAgICMgQWdlbnRJVFNNQ2hhbmdlUHJpbnQKICAgICRMYW5nLT57J0xpbmtlZCBPYmplY3RzJ30gPSAnVmVya278cGZ0ZSBPYmpla3RlJzsKICAgICRMYW5nLT57J0Z1bGwtVGV4dCBTZWFyY2ggaW4gQ2hhbmdlIGFuZCBXb3Jrb3JkZXInfSA9CiAgICAgICAgJ1ZvbGx0ZXh0c3VjaGUgaW4gQ2hhbmdlIHVuZCBXb3Jrb3JkZXInOwoKICAgICMgQWdlbnRJVFNNQ2hhbmdlU2VhcmNoCiAgICAkTGFuZy0+eydObyBYWFggc2V0dGluZ3MnfSA9ICJLZWluZSAnJXMnIEF1c3dhaGwiOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lbl9JVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSAtIHRoZSBlbmdsaXNoIChVUykgdHJhbnNsYXRpb24gb2YgSVRTTUNoYW5nZU1hbmFnZW1lbnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGVuX0lUU01DaGFuZ2VNYW5hZ2VtZW50LnBtLHYgMS41MiAyMDEwLzA1LzE5IDE0OjI3OjI2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0lUU01DaGFuZ2VNYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41MiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgIyBtaXNjCgogICAgIyBJVFNNIENoYW5nZU1hbmFnZW1lbnQgaWNvbnMKICAgICRMYW5nLT57J015IENoYW5nZXMnfSAgICA9ICdNeSBDaGFuZ2VzJzsKICAgICRMYW5nLT57J015IFdvcmtvcmRlcnMnfSA9ICdNeSBXb3Jrb3JkZXJzJzsKCiAgICAjIENoYW5nZSBtZW51CiAgICAkTGFuZy0+eydJVFNNIENoYW5nZSd9ICAgID0gJ0NoYW5nZSc7CiAgICAkTGFuZy0+eydJVFNNIFdvcmtvcmRlcid9ID0gJ1dvcmtvcmRlcic7CgogICAgIyBXb3Jrb3JkZXIgbWVudQoKICAgICMgVGVtcGxhdGUgbWVudQoKICAgICMgQ2hhbmdlIGF0dHJpYnV0ZXMgYXMgcmV0dXJuZWQgZnJvbSBDaGFuZ2VHZXQoKSwgb3IgdGFrZW4gYnkgQ2hhbmdlVXBkYXRlKCkKICAgICRMYW5nLT57J0FjY291bnRlZFRpbWUnfSAgICA9ICdBY2NvdW50ZWQgVGltZSc7CiAgICAkTGFuZy0+eydBY3R1YWxFbmRUaW1lJ30gICAgPSAnQWN0dWFsIEVuZCc7CiAgICAkTGFuZy0+eydBY3R1YWxTdGFydFRpbWUnfSAgPSAnQWN0dWFsIFN0YXJ0JzsKICAgICRMYW5nLT57J0NBQkFnZW50J30gICAgICAgICA9ICdDQUIgQWdlbnQnOwogICAgJExhbmctPnsnQ0FCQWdlbnRzJ30gICAgICAgID0gJ0NBQiBBZ2VudHMnOwogICAgJExhbmctPnsnQ0FCQ3VzdG9tZXInfSAgICAgID0gJ0NBQiBDdXN0b21lcic7CiAgICAkTGFuZy0+eydDQUJDdXN0b21lcnMnfSAgICAgPSAnQ0FCIEN1c3RvbWVycyc7CiAgICAkTGFuZy0+eydDYXRlZ29yeSd9ICAgICAgICAgPSAnQ2F0ZWdvcnknOwogICAgJExhbmctPnsnQ2hhbmdlQnVpbGRlcid9ICAgID0gJ0NoYW5nZSBCdWlsZGVyJzsKICAgICRMYW5nLT57J0NoYW5nZUJ5J30gICAgICAgICA9ICdDaGFuZ2VkIGJ5JzsKICAgICRMYW5nLT57J0NoYW5nZU1hbmFnZXInfSAgICA9ICdDaGFuZ2UgTWFuYWdlcic7CiAgICAkTGFuZy0+eydDaGFuZ2VOdW1iZXInfSAgICAgPSAnQ2hhbmdlIE51bWJlcic7CiAgICAkTGFuZy0+eydDaGFuZ2VUaW1lJ30gICAgICAgPSAnQ2hhbmdlZCc7CiAgICAkTGFuZy0+eydDaGFuZ2VTdGF0ZSd9ICAgICAgPSAnQ2hhbmdlIFN0YXRlJzsKICAgICRMYW5nLT57J0NoYW5nZVRpdGxlJ30gICAgICA9ICdDaGFuZ2UgVGl0bGUnOwogICAgJExhbmctPnsnQ3JlYXRlQnknfSAgICAgICAgID0gJ0NyZWF0ZWQgYnknOwogICAgJExhbmctPnsnQ3JlYXRlVGltZSd9ICAgICAgID0gJ0NyZWF0ZWQnOwogICAgJExhbmctPnsnRGVzY3JpcHRpb24nfSAgICAgID0gJ0Rlc2NyaXB0aW9uJzsKICAgICRMYW5nLT57J0ltcGFjdCd9ICAgICAgICAgICA9ICdJbXBhY3QnOwogICAgJExhbmctPnsnSnVzdGlmaWNhdGlvbid9ICAgID0gJ0p1c3RpZmljYXRpb24nOwogICAgJExhbmctPnsnUGxhbm5lZEVmZm9ydCd9ICAgID0gJ1BsYW5uZWQgRWZmb3J0JzsKICAgICRMYW5nLT57J1BsYW5uZWRFbmRUaW1lJ30gICA9ICdQbGFubmVkIEVuZCc7CiAgICAkTGFuZy0+eydQbGFubmVkU3RhcnRUaW1lJ30gPSAnUGxhbm5lZCBTdGFydCc7CiAgICAkTGFuZy0+eydQcmlvcml0eSd9ICAgICAgICAgPSAnUHJpb3JpdHknOwogICAgJExhbmctPnsnUmVxdWVzdGVkVGltZSd9ICAgID0gJ1JlcXVlc3RlZCBUaW1lJzsKCiAgICAjIFdvcmtvcmRlciBhdHRyaWJ1dGVzIGFzIHJldHVybmVkIGZyb20gV29ya09yZGVyR2V0KCksIG9yIHRha2VuIGJ5IFdvcmtPcmRlclVwZGF0ZSgpCiAgICAkTGFuZy0+eydJbnN0cnVjdGlvbid9ICAgICAgPSAnSW5zdHJ1Y3Rpb24nOwogICAgJExhbmctPnsnUmVwb3J0J30gICAgICAgICAgID0gJ1JlcG9ydCc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJBZ2VudCd9ICAgPSAnV29ya29yZGVyIEFnZW50JzsKICAgICRMYW5nLT57J1dvcmtPcmRlck51bWJlcid9ICA9ICdXb3Jrb3JkZXIgTnVtYmVyJzsKICAgICRMYW5nLT57J1dvcmtPcmRlclN0YXRlJ30gICA9ICdXb3Jrb3JkZXIgU3RhdGUnOwogICAgJExhbmctPnsnV29ya09yZGVyVGl0bGUnfSAgID0gJ1dvcmtvcmRlciBUaXRsZSc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJUeXBlJ30gICAgPSAnV29ya29yZGVyIFR5cGUnOwoKICAgICMgQ2hhbmdlIGhpc3RvcnkKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUFkZCd9ICAgICAgICAgICAgICA9ICdOZXcgQ2hhbmdlIChJRD0lcyknOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlVXBkYXRlJ30gICAgICAgICAgID0gJyVzOiBOZXc6ICVzIC0+IE9sZDogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlTGlua0FkZCd9ICAgICAgICAgID0gJ0xpbmsgdG8gJXMgKElEPSVzKSBhZGRlZCc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VMaW5rRGVsZXRlJ30gICAgICAgPSAnTGluayB0byAlcyAoSUQ9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQ0FCVXBkYXRlJ30gICAgICAgID0gJyVzOiBOZXc6ICVzIC0+IE9sZDogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQ0FCRGVsZXRlJ30gICAgICAgID0gJ0NBQiBEZWxldGVkICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUF0dGFjaG1lbnRBZGQnfSAgICA9ICdOZXcgQXR0YWNobWVudDogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQXR0YWNobWVudERlbGV0ZSd9ID0gJ0RlbGV0ZWQgQXR0YWNobWVudCAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VOb3RpZmljYXRpb25TZW50J30gPSAnTm90aWZpY2F0aW9uIHNlbnQgdG8gJXMgKEV2ZW50OiAlcyknOwoKICAgICMgd29ya29yZGVyIGhpc3RvcnkKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFkZCd9ICAgICAgICAgICAgICA9ICdOZXcgV29ya29yZGVyIChJRD0lcyknOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyVXBkYXRlJ30gICAgICAgICAgID0gJyVzOiBOZXc6ICVzIC0+IE9sZDogJXMnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTGlua0FkZCd9ICAgICAgICAgID0gJ0xpbmsgdG8gJXMgKElEPSVzKSBhZGRlZCc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJMaW5rRGVsZXRlJ30gICAgICAgPSAnTGluayB0byAlcyAoSUQ9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyRGVsZXRlJ30gICAgICAgICAgID0gJ1dvcmtvcmRlciAoSUQ9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQXR0YWNobWVudEFkZCd9ICAgID0gJ05ldyBBdHRhY2htZW50IGZvciBXb3JrT3JkZXI6ICVzJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUnfSA9ICdEZWxldGVkIEF0dGFjaG1lbnQgZnJvbSBXb3JrT3JkZXI6ICVzJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlck5vdGlmaWNhdGlvblNlbnQnfSA9ICdOb3RpZmljYXRpb24gc2VudCB0byAlcyAoRXZlbnQ6ICVzKSc7CgogICAgIyBsb25nIHdvcmtvcmRlciBoaXN0b3J5CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBZGRXaXRoV29ya09yZGVySUQnfSAgICAgICAgICAgICAgPSAnTmV3IFdvcmtvcmRlciAoSUQ9JXMpJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlclVwZGF0ZVdpdGhXb3JrT3JkZXJJRCd9ICAgICAgICAgICA9ICcoSUQ9JXMpICVzOiBOZXc6ICVzIC0+IE9sZDogJXMnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTGlua0FkZFdpdGhXb3JrT3JkZXJJRCd9ICAgICAgICAgID0gJyhJRD0lcykgTGluayB0byAlcyAoSUQ9JXMpIGFkZGVkJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckxpbmtEZWxldGVXaXRoV29ya09yZGVySUQnfSAgICAgICA9ICcoSUQ9JXMpIExpbmsgdG8gJXMgKElEPSVzKSBkZWxldGVkJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckRlbGV0ZVdpdGhXb3JrT3JkZXJJRCd9ICAgICAgICAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSBkZWxldGVkJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckF0dGFjaG1lbnRBZGRXaXRoV29ya09yZGVySUQnfSAgICA9ICcoSUQ9JXMpIE5ldyBBdHRhY2htZW50IGZvciBXb3JrT3JkZXI6ICVzJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckF0dGFjaG1lbnREZWxldGVXaXRoV29ya09yZGVySUQnfSA9ICcoSUQ9JXMpIERlbGV0ZWQgQXR0YWNobWVudCBmcm9tIFdvcmtPcmRlcjogJXMnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTm90aWZpY2F0aW9uU2VudFdpdGhXb3JrT3JkZXJJRCd9ID0gJyhJRD0lcykgTm90aWZpY2F0aW9uIHNlbnQgdG8gJXMgKEV2ZW50OiAlcyknOwoKICAgICMgY29uZGl0aW9uIGhpc3RvcnkKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNvbmRpdGlvbkFkZCd9ICAgICAgID0gJyVzOiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25BZGRJRCd9ICAgICA9ICdOZXcgQ29uZGl0aW9uIChJRD0lcyknOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q29uZGl0aW9uVXBkYXRlJ30gICAgPSAnJXMgKENvbmRpdGlvbiBJRD0lcyk6IE5ldzogJXMgLT4gT2xkOiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25EZWxldGUnfSAgICA9ICdDb25kaXRpb24gKElEPSVzKSBkZWxldGVkJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNvbmRpdGlvbkRlbGV0ZUFsbCd9ID0gJ0FsbCBDb25kaXRpb25zIG9mIENoYW5nZSAoSUQ9JXMpIGRlbGV0ZWQnOwoKICAgICMgZXhwcmVzc2lvbiBoaXN0b3J5CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpFeHByZXNzaW9uQWRkJ30gICAgICAgPSAnJXM6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25BZGRJRCd9ICAgICA9ICdOZXcgRXhwcmVzc2lvbiAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25VcGRhdGUnfSAgICA9ICclcyAoRXhwcmVzc2lvbiBJRD0lcyk6IE5ldzogJXMgLT4gT2xkOiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpFeHByZXNzaW9uRGVsZXRlJ30gICAgPSAnRXhwcmVzc2lvbiAoSUQ9JXMpIGRlbGV0ZWQnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6RXhwcmVzc2lvbkRlbGV0ZUFsbCd9ID0gJ0FsbCBFeHByZXNzaW9ucyBvZiBDb25kaXRpb24gKElEPSVzKSBkZWxldGVkJzsKCiAgICAjIGFjdGlvbiBoaXN0b3J5CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpBY3Rpb25BZGQnfSAgICAgICA9ICclczogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6QWN0aW9uQWRkSUQnfSAgICAgPSAnTmV3IEFjdGlvbiAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvblVwZGF0ZSd9ICAgID0gJyVzIChBY3Rpb24gSUQ9JXMpOiBOZXc6ICVzIC0+IE9sZDogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6QWN0aW9uRGVsZXRlJ30gICAgPSAnQWN0aW9uIChJRD0lcykgZGVsZXRlZCc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpBY3Rpb25EZWxldGVBbGwnfSA9ICdBbGwgQWN0aW9ucyBvZiBDb25kaXRpb24gKElEPSVzKSBkZWxldGVkJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkV4ZWN1dGUnfSAgID0gJ0FjdGlvbiAoSUQ9JXMpIGV4ZWN1dGVkOiAlcyc7CiAgICAkTGFuZy0+eydBY3Rpb25FeGVjdXRlOjpzdWNjZXNzZnVsbHknfSAgICA9ICdTdWNjZXNzZnVsbHknOwogICAgJExhbmctPnsnQWN0aW9uRXhlY3V0ZTo6dW5zdWNjZXNzZnVsbHknfSAgPSAnVW5zdWNjZXNzZnVsbHknOwoKICAgICMgaGlzdG9yeSBmb3IgdGltZSBldmVudHMKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVBsYW5uZWRTdGFydFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCBwbGFubmVkIHN0YXJ0IHRpbWUuJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVBsYW5uZWRFbmRUaW1lUmVhY2hlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCBwbGFubmVkIGVuZCB0aW1lLic7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0NoYW5nZSAoSUQ9JXMpIHJlYWNoZWQgYWN0dWFsIHN0YXJ0IHRpbWUuJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUFjdHVhbEVuZFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCBhY3R1YWwgZW5kIHRpbWUuJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnQ2hhbmdlIChJRD0lcykgcmVhY2hlZCByZXF1ZXN0ZWQgdGltZS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIHBsYW5uZWQgc3RhcnQgdGltZS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIHBsYW5uZWQgZW5kIHRpbWUuJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgPSAnV29ya29yZGVyIChJRD0lcykgcmVhY2hlZCBhY3R1YWwgc3RhcnQgdGltZS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIGFjdHVhbCBlbmQgdGltZS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWRXaXRoV29ya09yZGVySUQnfSA9ICdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIHBsYW5uZWQgc3RhcnQgdGltZS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkV2l0aFdvcmtPcmRlcklEJ30gICA9ICdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIHBsYW5uZWQgZW5kIHRpbWUuJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWRXaXRoV29ya09yZGVySUQnfSAgPSAnV29ya29yZGVyIChJRD0lcykgcmVhY2hlZCBhY3R1YWwgc3RhcnQgdGltZS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWRXaXRoV29ya09yZGVySUQnfSAgICA9ICdXb3Jrb3JkZXIgKElEPSVzKSByZWFjaGVkIGFjdHVhbCBlbmQgdGltZS4nOwoKICAgICMgY2hhbmdlIHN0YXRlcwogICAgJExhbmctPnsncmVxdWVzdGVkJ30gICAgICAgID0gJ1JlcXVlc3RlZCc7CiAgICAkTGFuZy0+eydwZW5kaW5nIGFwcHJvdmFsJ30gPSAnUGVuZGluZyBBcHByb3ZhbCc7CiAgICAkTGFuZy0+eydwZW5kaW5nIHBpcid9ICAgICAgPSAnUGVuZGluZyBQSVInOwogICAgJExhbmctPnsncmVqZWN0ZWQnfSAgICAgICAgID0gJ1JlamVjdGVkJzsKICAgICRMYW5nLT57J2FwcHJvdmVkJ30gICAgICAgICA9ICdBcHByb3ZlZCc7CiAgICAkTGFuZy0+eydpbiBwcm9ncmVzcyd9ICAgICAgPSAnSW4gUHJvZ3Jlc3MnOwogICAgJExhbmctPnsnc3VjY2Vzc2Z1bCd9ICAgICAgID0gJ1N1Y2Nlc3NmdWwnOwogICAgJExhbmctPnsnZmFpbGVkJ30gICAgICAgICAgID0gJ0ZhaWxlZCc7CiAgICAkTGFuZy0+eydjYW5jZWxlZCd9ICAgICAgICAgPSAnQ2FuY2VsZWQnOwogICAgJExhbmctPnsncmV0cmFjdGVkJ30gICAgICAgID0gJ1JldHJhY3RlZCc7CgogICAgIyB3b3Jrb3JkZXIgc3RhdGVzCiAgICAkTGFuZy0+eydjcmVhdGVkJ30gICAgID0gJ0NyZWF0ZWQnOwogICAgJExhbmctPnsnYWNjZXB0ZWQnfSAgICA9ICdBY2NlcHRlZCc7CiAgICAkTGFuZy0+eydyZWFkeSd9ICAgICAgID0gJ1JlYWR5JzsKICAgICRMYW5nLT57J2luIHByb2dyZXNzJ30gPSAnSW4gUHJvZ3Jlc3MnOwogICAgJExhbmctPnsnY2xvc2VkJ30gICAgICA9ICdDbG9zZWQnOwogICAgJExhbmctPnsnY2FuY2VsZWQnfSAgICA9ICdDYW5jZWxlZCc7CgogICAgIyBBZG1pbiBJbnRlcmZhY2UKCiAgICAjIEFkbWluIFN0YXRlTWFjaGluZQoKICAgICMgd29ya29yZGVyIHR5cGVzCiAgICAkTGFuZy0+eydhcHByb3ZhbCd9ICA9ICdBcHByb3ZhbCc7CiAgICAkTGFuZy0+eydkZWNpc2lvbid9ICA9ICdEZWNpc2lvbic7CiAgICAkTGFuZy0+eyd3b3Jrb3JkZXInfSA9ICdXb3Jrb3JkZXInOwogICAgJExhbmctPnsnYmFja291dCd9ICAgPSAnQmFja291dCBQbGFuJzsKICAgICRMYW5nLT57J3Bpcid9ICAgICAgID0gJ1BJUiAoUG9zdCBJbXBsZW1lbnRhdGlvbiBSZXZpZXcpJzsKCiAgICAjIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBjb25kaXRpb24gZXhwcmVzc2lvbnMgYW5kIGFjdGlvbnMKICAgICRMYW5nLT57J0lUU01DaGFuZ2UnfSAgICA9ICdDaGFuZ2UnOwogICAgJExhbmctPnsnSVRTTVdvcmtPcmRlcid9ID0gJ1dvcmtvcmRlcic7CiAgICAkTGFuZy0+eydJVFNNQ29uZGl0aW9uJ30gPSAnQ29uZGl0aW9uJzsKCiAgICAjIE92ZXJ2aWV3cwoKICAgICMgV29ya29yZGVyIGRlbGV0ZQoKICAgICMgVGFrZSB3b3Jrb3JkZXIKCiAgICAjIENvbmRpdGlvbiBPdmVydmlldyBhbmQgRWRpdAogICAgJExhbmctPnsnbm90IGNvbnRhaW5zJ30gPSAnZG9lcyBub3QgY29udGFpbic7CgogICAgIyBDaGFuZ2UgWm9vbQoKICAgICMgQWdlbnRJVFNNQ2hhbmdlUHJpbnQKCiAgICAjIEFnZW50SVRTTUNoYW5nZVNlYXJjaAogICAgJExhbmctPnsnTm8gWFhYIHNldHRpbmdzJ30gPSAiTm8gJyVzJyBzZXR0aW5ncyI7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIElUU01DaGFuZ2VNYW5hZ2VtZW50CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAxMCBMZW9uYXJkbyBDZXJ0dWNoZSA8bGVvbmFyZG8uY2VydHVjaGUgYXQgaXRjb24tbHRkYS5jb20+CiMgLS0KIyAkSWQ6IGVzX0lUU01DaGFuZ2VNYW5hZ2VtZW50LnBtLHYgMS43IDIwMTAvMDYvMjkgMTI6NTY6MzEgc2IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSVRTTUNoYW5nZU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICMgbWlzYwogICAgJExhbmctPnsnQSBjaGFuZ2UgbXVzdCBoYXZlIGEgdGl0bGUhJ30gICAgICAgICAgPSAnQ2FkYSBjYW1iaW8gZGViZSB0ZW5lciB1biB07XR1bG8nOwogICAgJExhbmctPnsnVGVtcGxhdGUgTmFtZSd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnTm9tYnJlIGRlIGxhIHBsYW50aWxsYSc7CiAgICAkTGFuZy0+eydUZW1wbGF0ZXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQbGFudGlsbGFzJzsKICAgICRMYW5nLT57J0Egd29ya29yZGVyIG11c3QgaGF2ZSBhIHRpdGxlISd9ICAgICAgID0gJ0NhZGEgT3JkZW4gZGUgVHJhYmFqbyBkZWJlIHRlbmVyIHVuIHTtdHVsbyc7CiAgICAkTGFuZy0+eydDbGVhcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdMaW1waWFyIGNhbXBvcyc7CiAgICAkTGFuZy0+eydDcmVhdGUgYSBjaGFuZ2UgZnJvbSB0aGlzIHRpY2tldCEnfSAgICA9ICdDcmVhciB1biBjYW1iaW8gYSBwYXJ0aXIgZGUgZXN0ZSB0aWNrZXQhJzsKICAgICRMYW5nLT57J0NyZWF0ZSBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NyZWFyIHVuIENhbWJpbyc7CiAgICAkTGFuZy0+eydlLmcuJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdlai4nOwogICAgJExhbmctPnsnU2F2ZSBDaGFuZ2UgYXMgdGVtcGxhdGUnfSAgICAgICAgICAgICAgPSAnR3VhcmRhciBDaGFuZ2UgY29tbyBQbGFudGlsbGEnOwogICAgJExhbmctPnsnU2F2ZSBXb3Jrb3JkZXIgYXMgdGVtcGxhdGUnfSAgICAgICAgICAgPSAnR3VhcmRhciBXb3Jrb3JkZXIgY29tbyBQbGFudGlsbGEnOwogICAgJExhbmctPnsnU2F2ZSBDaGFuZ2UgQ0FCIGFzIHRlbXBsYXRlJ30gICAgICAgICAgPSAnR3VhcmRhciBDaGFuZ2UgQ0FCIGNvbW8gUGxhbnRpbGxhJzsKICAgICRMYW5nLT57J05ldyB0aW1lJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ051ZXZvIGludGVydmFsbyBkZSB0aWVtcG8nOwogICAgJExhbmctPnsnUmVxdWVzdGVkIChieSBjdXN0b21lcikgRGF0ZSd9ICAgICAgICAgPSAnRmVjaGEgc29saWNpdGFkYSAocG9yIGVsIGNsaWVudGUpJzsKICAgICRMYW5nLT57J1RoZSBwbGFubmVkIGVuZCB0aW1lIGlzIGludmFsaWQhJ30gICAgID0gJ0xhIGZlY2hhIGRlIGZpbmFsaXphY2nzbiBwbGFuZWFkYSBlcyBpbnbhbGlkYSEnOwogICAgJExhbmctPnsnVGhlIHBsYW5uZWQgc3RhcnQgdGltZSBpcyBpbnZhbGlkISd9ICAgPSAnTGEgZmVjaGEgZGUgaW5pY2lvIHBsYW5lYWRhIGVzIGluduFsaWRhISc7CiAgICAkTGFuZy0+eydUaGUgcGxhbm5lZCBzdGFydCB0aW1lIG11c3QgYmUgYmVmb3JlIHRoZSBwbGFubmVkIGVuZCB0aW1lISd9ID0gJ0xhIGZlY2hhIHBsYW5lYWRhIGRlIGluaWNpbyBkZWJlIHNlciBhbnRlcmlvciBhIGxhIGZlY2hhIHBsYW5lYWRhIGRlIGZpbmFsaXphY2nzbiEnOwogICAgJExhbmctPnsnVGhlIHJlcXVlc3RlZCB0aW1lIGlzIGludmFsaWQhJ30gICAgICAgPSAnTGEgZmVjaGEgc29saWNpdGFkYSBlcyBpbnbhbGlkYSEnOwogICAgJExhbmctPnsnVGltZSB0eXBlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnVGlwbyBkZSBmZWNoYSc7CiAgICAkTGFuZy0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgdGVtcGxhdGU/J30gPSAnUmVhbG1lbnRlIGRlc2VhIGVsaW1pbmFyIGVzdGEgcGxhbnRpbGxhPyc7CiAgICAkTGFuZy0+eydDaGFuZ2UgQWR2aXNvcnkgQm9hcmQnfSAgICAgICAgICAgICAgICA9ICdDb21pdOlzIGRlIENhbWJpbyc7CiAgICAkTGFuZy0+eydDQUInfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDQUInOwogICAgJExhbmctPnsnUmVzZXQgU3RhdGVzJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnJzsKCiAgICAjIElUU00gQ2hhbmdlTWFuYWdlbWVudCBpY29ucwogICAgJExhbmctPnsnTXkgQ2hhbmdlcyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlzIENhbWJpb3MnOwogICAgJExhbmctPnsnTXkgV29ya29yZGVycyd9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnTWlzINNyZGVuZGVzIGRlIFRyYWJham8nOwogICAgJExhbmctPnsnUElSIChQb3N0IEltcGxlbWVudGF0aW9uIFJldmlldyknfSAgICAgPSAnUmV2aXNp824gUG9zdCBJbXBsZW1lbnRhY2nzbiAoUElSKSc7CiAgICAkTGFuZy0+eydQU0EgKFByb2plY3RlZCBTZXJ2aWNlIEF2YWlsYWJpbGl0eSknfSA9ICdEaXNwb25pYmlsaWRhZCBwcm95ZWN0YWRhIGRlbCBzZXJ2aWNpbyAoUFNBKSc7CiAgICAkTGFuZy0+eydNeSBDQUJzJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdNaXMgQ29taXTpcyBkZSBDYW1iaW8gKENBQnMpJzsKICAgICRMYW5nLT57J0NoYW5nZSBPdmVydmlldyd9ICAgICAgICAgICAgICAgICAgICAgID0gJ1Zpc3RhIGRlIENhbWJpb3MnOwogICAgJExhbmctPnsnVGVtcGxhdGUgT3ZlcnZpZXcnfSAgICAgICAgICAgICAgICAgICAgPSAnVmlzdGEgZGUgUGxhbnRpbGxhcyc7CiAgICAkTGFuZy0+eydTZWFyY2ggQ2hhbmdlcyd9ICAgICAgICAgICAgICAgICAgICAgICA9ICdCdXNjYXIgQ2FtYmlvcyc7CgogICAgIyBDaGFuZ2UgbWVudQogICAgJExhbmctPnsnSVRTTSBDaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NhbWJpbyc7CiAgICAkTGFuZy0+eydJVFNNIFdvcmtvcmRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3JkZW4gZGUgVHJhYmFqbyc7CiAgICAkTGFuZy0+eydTY2hlZHVsZSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnQWdlbmRhJzsKICAgICRMYW5nLT57J0ludm9sdmVkIFBlcnNvbnMnfSAgICAgICAgICAgICAgICAgICAgICA9ICdQZXJzb25hcyBJbnZvbHVjcmFkYXMnOwogICAgJExhbmctPnsnQWRkIFdvcmtvcmRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkaWNpb25hciBPcmRlbiBkZSBUcmFiYWpvJzsKICAgICRMYW5nLT57J1RlbXBsYXRlJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdQbGFudGlsbGEnOwogICAgJExhbmctPnsnTW92ZSBUaW1lIFNsb3QnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ01vdmVyIHBlcmlvZG8gZGUgdGllbXBvJzsKICAgICRMYW5nLT57J1ByaW50IHRoZSBjaGFuZ2UnfSAgICAgICAgICAgICAgICAgICAgICA9ICdJbXByaW1pciBlbCBjYW1iaW8nOwogICAgJExhbmctPnsnRWRpdCB0aGUgY2hhbmdlJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ0VkaXRhciBlbCBjYW1iaW8nOwogICAgJExhbmctPnsnQ2hhbmdlIGludm9sdmVkIHBlcnNvbnMgb2YgdGhlIGNoYW5nZSd9ID0gJ0NhbWJpYXIgbGFzIHBlcnNvbmFzIGludm9sdWNyYWRhcyBlbiBlbCBDYW1iaW8nOwogICAgJExhbmctPnsnQWRkIGEgd29ya29yZGVyIHRvIHRoZSBjaGFuZ2UnfSAgICAgICAgID0gJ0FkaWNpb25hciB1bmEgT3JkZW4gZGUgVHJhYmFqbyBhbCBDYW1iaW8nOwogICAgJExhbmctPnsnRWRpdCB0aGUgY29uZGl0aW9ucyBvZiB0aGUgY2hhbmdlJ30gICAgID0gJ0VkaXRhciBsYXMgY29uZGljaW9uZXMgZGVsIENhbWJpbyc7CiAgICAkTGFuZy0+eydMaW5rIGFub3RoZXIgb2JqZWN0IHRvIHRoZSBjaGFuZ2UnfSAgICAgPSAnVmluY3VsYXIgdW4gbnVldm8gb2JqZXRvIGFsIENhbWJpbyc7CiAgICAkTGFuZy0+eydTYXZlIGNoYW5nZSBhcyBhIHRlbXBsYXRlJ30gICAgICAgICAgICAgPSAnR3VhcmRhciBlbCBDYW1iaW8gY29tbyBQbGFudGlsbGEnOwogICAgJExhbmctPnsnTW92ZSBhbGwgd29ya29yZGVycyBpbiB0aW1lJ30gICAgICAgICAgID0gJ01vdmVyIHRvZGFzIGxhcyBPcmRlbmVzIGRlIFRyYWJham8gZW4gZWwgdGllbXBvJzsKICAgICRMYW5nLT57J0N1cnJlbnQgQ0FCJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDb21pdOkgZGUgQ2FtYmlvcyBBY3R1YWwnOwogICAgJExhbmctPnsnQWRkIHRvIENBQid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FkaWNpb25hciBlbCBDb21pdOkgZGUgQ2FtYmlvcyc7CiAgICAkTGFuZy0+eydBZGQgQ0FCIFRlbXBsYXRlJ30gICAgICAgICAgICAgICAgICAgICAgPSAnQWRpY2lvbmFyIENvbWl06SBhIGxhIFBsYW50aWxsYSc7CiAgICAkTGFuZy0+eydBZGQgV29ya29yZGVyIHRvJ30gICAgICAgICAgICAgICAgICAgICAgPSAnQWRpY2lvbmFyIE9yZGVuIGRlIFRyYWJham8gYSc7CiAgICAkTGFuZy0+eydTZWxlY3QgV29ya29yZGVyIFRlbXBsYXRlJ30gICAgICAgICAgICAgPSAnU2VsZWNjaW9uYXIgUGxhbnRpbGxhIGRlIE9yZGVuIGRlIFRyYWJham8nOwogICAgJExhbmctPnsnU2VsZWN0IENoYW5nZSBUZW1wbGF0ZSd9ICAgICAgICAgICAgICAgID0gJ1NlbGVjY2lvbmFyIFBsYW50aWxsYSBkZSBDYW1iaW8nOwogICAgJExhbmctPnsnVGhlIHBsYW5uZWQgdGltZSBpcyBpbnZhbGlkISd9ICAgICAgICAgID0gJ0VsIHBlcmlvZG8gZGUgdGllbXBvIHBsYW5lYWRvIGVzIGluduFsaWRvISc7CgogICAgIyBXb3Jrb3JkZXIgbWVudQogICAgJExhbmctPnsnV29ya29yZGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnT3JkZW4gZGUgVHJhYmFqbyc7CiAgICAkTGFuZy0+eydTYXZlIHdvcmtvcmRlciBhcyBhIHRlbXBsYXRlJ30gICAgICAgICA9ICdHdWFyZGFyIE9yZGVuIGRlIFRyYWJham8gY29tbyBQbGFudGlsbGEnOwogICAgJExhbmctPnsnTGluayBhbm90aGVyIG9iamVjdCB0byB0aGUgd29ya29yZGVyJ30gPSAnVmluY3VsYXIgb3RybyBPYmpldG8gYSBsYSBPcmRlbiBkZSBUcmFiYWpvJzsKICAgICRMYW5nLT57J0RlbGV0ZSBXb3Jrb3JkZXInfSAgICAgICAgICAgICAgICAgICAgID0gJ0JvcnJhciBPcmRlbiBkZSBUcmFiYWpvJzsKICAgICRMYW5nLT57J0VkaXQgdGhlIHdvcmtvcmRlcid9ICAgICAgICAgICAgICAgICAgID0gJ0VkaXRhciBsYSBPcmRlbiBkZSBUcmFiYWpvJzsKICAgICRMYW5nLT57J1ByaW50IHRoZSB3b3Jrb3JkZXInfSAgICAgICAgICAgICAgICAgID0gJ0ltcHJpbWlyIGxhIE9yZGVuIGRlIFRyYWJham8nOwogICAgJExhbmctPnsnU2V0IHRoZSBhZ2VudCBmb3IgdGhlIHdvcmtvcmRlcid9ICAgICAgPSAnQXNpZ25hciBBZ2VudGUgYSBsYSBPcmRlbiBkZSBUcmFiYWpvJzsKCiAgICAjIFRlbXBsYXRlIG1lbnUKICAgICRMYW5nLT57J0EgdGVtcGxhdGUgbXVzdCBoYXZlIGEgbmFtZSEnfSA9ICdUb2RhIHBsYW50aWxsYSBkZWJlIHRlbmVyIHVuIG5vbWJyZSEnOwoKICAgICMgQ2hhbmdlIGF0dHJpYnV0ZXMgYXMgcmV0dXJuZWQgZnJvbSBDaGFuZ2VHZXQoKSwgb3IgdGFrZW4gYnkgQ2hhbmdlVXBkYXRlKCkKICAgICRMYW5nLT57J0FjY291bnRlZFRpbWUnfSAgICA9ICdUaWVtcG8gQ29udGFiaWxpemFkbyc7CiAgICAkTGFuZy0+eydBY3R1YWxFbmRUaW1lJ30gICAgPSAnRmluYWxpemFjafNuIFJlYWwnOwogICAgJExhbmctPnsnQWN0dWFsU3RhcnRUaW1lJ30gID0gJ0luaWNpbyBSZWFsJzsKICAgICRMYW5nLT57J0NBQkFnZW50J30gICAgICAgICA9ICdBZ2VudGUgZGVsIENBQic7CiAgICAkTGFuZy0+eydDQUJBZ2VudHMnfSAgICAgICAgPSAnQWdlbnRlcyBkZWwgQ0FCJzsKICAgICRMYW5nLT57J0NBQkN1c3RvbWVyJ30gICAgICA9ICdDbGllbnRlIGRlbCBDQUInOwogICAgJExhbmctPnsnQ0FCQ3VzdG9tZXJzJ30gICAgID0gJ0NsaWVudGVzIGRlbCBDQUInOwogICAgJExhbmctPnsnQ2F0ZWdvcnknfSAgICAgICAgID0gJ0NhdGVnb3JpYSc7CiAgICAkTGFuZy0+eydDaGFuZ2VCdWlsZGVyJ30gICAgPSAnQ29uc3RydWN0b3IgZGVsIENhbWJpbyc7CiAgICAkTGFuZy0+eydDaGFuZ2VCeSd9ICAgICAgICAgPSAnTW9kaWZpY2FkbyBwb3InOwogICAgJExhbmctPnsnQ2hhbmdlTWFuYWdlcid9ICAgID0gJ0FkbWluaXN0cmFkb3IgZGVsIENhbWJpbyc7CiAgICAkTGFuZy0+eydDaGFuZ2VOdW1iZXInfSAgICAgPSAnTnVtZXJvIGRlbCBDYW1iaW8nOwogICAgJExhbmctPnsnQ2hhbmdlVGltZSd9ICAgICAgID0gJ0ZlY2hhIGRlbCBDYW1iaW8nOwogICAgJExhbmctPnsnQ2hhbmdlU3RhdGUnfSAgICAgID0gJ0VzdGFkbyBkZWwgQ2FtYmlvJzsKICAgICRMYW5nLT57J0NoYW5nZVRpdGxlJ30gICAgICA9ICdUaXR1bG8gZGVsIENhbWJpbyc7CiAgICAkTGFuZy0+eydDcmVhdGVCeSd9ICAgICAgICAgPSAnQ3JlYWRvIHBvcic7CiAgICAkTGFuZy0+eydDcmVhdGVUaW1lJ30gICAgICAgPSAnRmVjaGEgZGUgQ3JlYWNp824nOwogICAgJExhbmctPnsnRGVzY3JpcHRpb24nfSAgICAgID0gJ0Rlc2NyaXBjafNuJzsKICAgICRMYW5nLT57J0ltcGFjdCd9ICAgICAgICAgICA9ICdJbXBhY3RvJzsKICAgICRMYW5nLT57J0p1c3RpZmljYXRpb24nfSAgICA9ICdKdXN0aWZpY2FjafNuJzsKICAgICRMYW5nLT57J1BsYW5uZWRFZmZvcnQnfSAgICA9ICdFc2Z1ZXJ6byBQbGFuZWFkbyc7CiAgICAkTGFuZy0+eydQbGFubmVkRW5kVGltZSd9ICAgPSAnRmluYWxpemFjafNuIFBsYW5lYWRhJzsKICAgICRMYW5nLT57J1BsYW5uZWRTdGFydFRpbWUnfSA9ICdJbmljaW8gUGxhbmVhZG8nOwogICAgJExhbmctPnsnUHJpb3JpdHknfSAgICAgICAgID0gJ1ByaW9yaWRhZCc7CiAgICAkTGFuZy0+eydSZXF1ZXN0ZWRUaW1lJ30gICAgPSAnRmVjaGEgU29saWNpdGFkYSc7CgogICAgIyBXb3Jrb3JkZXIgYXR0cmlidXRlcyBhcyByZXR1cm5lZCBmcm9tIFdvcmtPcmRlckdldCgpLCBvciB0YWtlbiBieSBXb3JrT3JkZXJVcGRhdGUoKQogICAgJExhbmctPnsnSW5zdHJ1Y3Rpb24nfSAgICAgID0gJ0luc3RydWNjafNuJzsKICAgICRMYW5nLT57J1JlcG9ydCd9ICAgICAgICAgICA9ICdSZXBvcnRlJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckFnZW50J30gICA9ICdBZ2VudGUgZGUgbGEgT3JkZW4gZGUgVHJhYmFqbyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJOdW1iZXInfSAgPSAnTvptZXJvIGRlIGxhIE9yZGVuIGRlIFRyYWJham8nOwogICAgJExhbmctPnsnV29ya09yZGVyU3RhdGUnfSAgID0gJ0VzdGFkbyBkZSBsYSBPcmRlbiBkZSBUcmFiYWpvJzsKICAgICRMYW5nLT57J1dvcmtPcmRlclRpdGxlJ30gICA9ICdU7XR1bG8gZGUgbGEgT3JkZW4gZGUgVHJhYmFqbyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJUeXBlJ30gICAgPSAnVGlwbyBkZSBPcmRlbiBkZSBUcmFiYWpvJzsKCiAgICAjIENoYW5nZSBoaXN0b3J5CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VBZGQnfSAgICAgICAgICAgICAgPSAnTnVldm8gQ2FtYmlvIChJRD0lcyknOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlVXBkYXRlJ30gICAgICAgICAgID0gJyVzOiBOdWV2bzogJXMgLT4gQW50aWd1bzogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlTGlua0FkZCd9ICAgICAgICAgID0gJ1ZpbmN1bG8gYSAlcyAoSUQ9JXMpIGFkaWNpb25hZG8nOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlTGlua0RlbGV0ZSd9ICAgICAgID0gJ1ZpbmN1bG8gYSAlcyAoSUQ9JXMpIGJvcnJhZG8nOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQ0FCVXBkYXRlJ30gICAgICAgID0gJyVzOiBOdWV2bzogJXMgLT4gQW50aWd1bzogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQ0FCRGVsZXRlJ30gICAgICAgID0gJ0NvbWl06SBkZSBDYW1iaW9zIEVsaW1pbmFkbyAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VBdHRhY2htZW50QWRkJ30gICAgPSAnTnVldm8gQWRqdW50bzogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlQXR0YWNobWVudERlbGV0ZSd9ID0gJ0JvcnJhciBBZGp1bnRvICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZU5vdGlmaWNhdGlvblNlbnQnfSA9ICdOb3RpZmljYWNp824gZW52aWFkYSBhICVzIChFdmVudG86ICVzKSc7CgogICAgIyB3b3Jrb3JkZXIgaGlzdG9yeQogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWRkJ30gICAgICAgICAgICAgID0gJ051ZXZhIE9yZGVuIGRlIFRyYWJham8gKElEPSVzKSc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJVcGRhdGUnfSAgICAgICAgICAgPSAnJXM6IE51ZXZhOiAlcyAtPiBBbnRpZ3VhOiAlcyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJMaW5rQWRkJ30gICAgICAgICAgPSAnVmluY3VsbyBhICVzIChJRD0lcykgYWRpY2lvbmFkbyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJMaW5rRGVsZXRlJ30gICAgICAgPSAnVmluY3VsbyBhICVzIChJRD0lcykgYm9ycmFkbyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJEZWxldGUnfSAgICAgICAgICAgPSAnT3JkZW4gZGUgVHJhYmFqbyAoSUQ9JXMpIGJvcnJhZGEnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQXR0YWNobWVudEFkZCd9ICAgID0gJ051ZXZvIGFkanVudG8gcGFyYSBPcmRlbiBkZSBUcmFiYWpvOiAlcyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlJ30gPSAnQm9ycmFyIGFkanVudG8gZGUgT3JkZW4gZGUgVHJhYmFqbzogJXMnOwoKICAgICMgbG9uZyB3b3Jrb3JkZXIgaGlzdG9yeQogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWRkV2l0aFdvcmtPcmRlcklEJ30gICAgICAgICAgICAgID0gJ051ZXZhIE9yZGVuIGRlIFRyYWJham8gKElEPSVzKSc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJVcGRhdGVXaXRoV29ya09yZGVySUQnfSAgICAgICAgICAgPSAnKElEPSVzKSAlczogTnVldmE6ICVzIC0+IEFudGlndWE6ICVzJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckxpbmtBZGRXaXRoV29ya09yZGVySUQnfSAgICAgICAgICA9ICcoSUQ9JXMpIFZpbmN1bG8gYSAlcyAoSUQ9JXMpIGFkaWNpb25hZG8nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyTGlua0RlbGV0ZVdpdGhXb3JrT3JkZXJJRCd9ICAgICAgID0gJyhJRD0lcykgVmluY3VsbyBhICVzIChJRD0lcykgYm9ycmFkbyc7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJEZWxldGVXaXRoV29ya09yZGVySUQnfSAgICAgICAgICAgPSAnT3JkZW4gZGUgVHJhYmFqbyAoSUQ9JXMpIGJvcnJhZGEnOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQXR0YWNobWVudEFkZFdpdGhXb3JrT3JkZXJJRCd9ICAgID0gJyhJRD0lcykgTnVldm8gYWRqdW50byBwYXJhIE9yZGVuIGRlIFRyYWJham86ICVzJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckF0dGFjaG1lbnREZWxldGVXaXRoV29ya09yZGVySUQnfSA9ICcoSUQ9JXMpIEJvcnJhciBhZGp1bnRvIGRlIE9yZGVuIGRlIFRyYWJham86ICVzJzsKCiAgICAjIGNvbmRpdGlvbiBoaXN0b3J5CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25BZGQnfSAgICAgICA9ICclczogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q29uZGl0aW9uQWRkSUQnfSAgICAgPSAnTnVldmEgQ29uZGljafNuIChJRD0lcyknOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q29uZGl0aW9uVXBkYXRlJ30gICAgPSAnJXMgKElEIGRlIGxhIENvbmRpY2nzbj0lcyk6IE51ZXZvOiAlcyAtPiBBbnRpZ3VvOiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDb25kaXRpb25EZWxldGUnfSAgICA9ICdDb2RpY2nzbiAoSUQ9JXMpIGJvcnJhZGEnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q29uZGl0aW9uRGVsZXRlQWxsJ30gPSAnVG9kYXMgbGFzIGNvbmRpY2lvbmVzIGRlbCBjYW1iaW8gKElEPSVzKSBib3JyYWRhcyc7CgogICAgIyBleHByZXNzaW9uIGhpc3RvcnkKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25BZGQnfSAgICAgICA9ICclczogJXMnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6RXhwcmVzc2lvbkFkZElEJ30gICAgID0gJ051ZXZhIEV4cHJlc2nzbiAoSUQ9JXMpJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25VcGRhdGUnfSAgICA9ICclcyAoSUQgZGUgbGEgRXhwcmVzafNuPSVzKTogTnVldmE6ICVzIC0+IEFudGlndWE6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25EZWxldGUnfSAgICA9ICdFeHByZXNp824gKElEPSVzKSBib3JyYWRhJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkV4cHJlc3Npb25EZWxldGVBbGwnfSA9ICdUb2RhcyBsYXMgRXhwcmVzaW9uZXMgZGUgbGEgQ29uZGljafNuIChJRD0lcykgYm9ycmFkYXMnOwoKICAgICMgYWN0aW9uIGhpc3RvcnkKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkFkZCd9ICAgICAgID0gJyVzOiAlcyc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpBY3Rpb25BZGRJRCd9ICAgICA9ICdOdWV2YSBBY2Np824gKElEPSVzKSc7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpBY3Rpb25VcGRhdGUnfSAgICA9ICclcyAoSUQgZGUgbGEgQWNjafNuPSVzKTogTnVldmE6ICVzIC0+IEFudGlndWE6ICVzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkRlbGV0ZSd9ICAgID0gJ0FjY2nzbiAoSUQ9JXMpIGJvcnJhZGEnOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6QWN0aW9uRGVsZXRlQWxsJ30gPSAnVG9kYXMgbGFzIEFjY2lvbmVzIGRlIGxhIENvbmRpY2nzbiAoSUQ9JXMpIGJvcnJhZGFzJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkFjdGlvbkV4ZWN1dGUnfSAgID0gJ0FjY2nzbiAoSUQ9JXMpIGVqZWN1dGFkYTogJXMnOwogICAgJExhbmctPnsnQWN0aW9uRXhlY3V0ZTo6c3VjY2Vzc2Z1bGx5J30gICAgPSAnQ29uIOl4aXRvJzsKICAgICRMYW5nLT57J0FjdGlvbkV4ZWN1dGU6OnVuc3VjY2Vzc2Z1bGx5J30gID0gJ1NpbiDpeGl0byc7CgogICAgIyBoaXN0b3J5IGZvciB0aW1lIGV2ZW50cwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgICAgICA9ICdFbCBDYW1iaW8gKElEPSVzKSBoYSBhbGNhbnphZG8gc3UgZmVjaGEgZGUgaW5pY2lvIHBsYW5lYWRhLic7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VQbGFubmVkRW5kVGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VsIENhbWJpbyAoSUQ9JXMpIGhhIGFsY2FuemFkbyBzdSBmZWNoYSBkZSBmaW5hbGl6YWNp824gcGxhbmVhZGEuJzsKICAgICRMYW5nLT57J0NoYW5nZUhpc3Rvcnk6OkNoYW5nZUFjdHVhbFN0YXJ0VGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgICAgICAgPSAnRWwgQ2FtYmlvIChJRD0lcykgaGEgYWxjYW56YWRvIHN1IGZlY2hhIGRlIGluaWNpbyByZWFsIHBsYW5lYWRhLic7CiAgICAkTGFuZy0+eydDaGFuZ2VIaXN0b3J5OjpDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZCd9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0VsIENhbWJpbyAoSUQ9JXMpIGhhIGFsY2FuemFkbyBzdSBmZWNoYSBkZSBmaW5hbGl6YWNp824gcmVhbCBwbGFuZWFkYS4nOwogICAgJExhbmctPnsnQ2hhbmdlSGlzdG9yeTo6Q2hhbmdlUmVxdWVzdGVkVGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFbCBDYW1iaW8gKElEPSVzKSBoYSBhbGNhbnphZG8gc3UgZmVjaGEgZXNwZXJhZGEgZGUgb2N1cnJlbmNpYS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnfSAgICAgICAgICAgICAgICA9ICdMYSBPcmRlbiBkZSBUcmFiYWpvIChJRD0lcykgaGEgYWxjYW56YWRvIHN1IGZlY2hhIGRlIGluaWNpbyBwbGFuZWFkYS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkJ30gICAgICAgICAgICAgICAgICA9ICdMYSBPcmRlbiBkZSBUcmFiYWpvIChJRD0lcykgaGEgYWxjYW56YWRvIHN1IGZlY2hhIGRlIGZpbmFsaXphY2nzbiBwbGFuZWFkYS4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCd9ICAgICAgICAgICAgICAgICA9ICdMYSBPcmRlbiBkZSBUcmFiYWpvIChJRD0lcykgaGEgYWxjYW56YWRvIHN1IGZlY2hhIGRlIGluaWNpbyByZWFsLic7CiAgICAkTGFuZy0+eydXb3JrT3JkZXJIaXN0b3J5OjpXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZCd9ICAgICAgICAgICAgICAgICAgID0gJ0xhIE9yZGVuIGRlIFRyYWJham8gKElEPSVzKSBoYSBhbGNhbnphZG8gc3UgZmVjaGEgZGUgZmluYWxpemFjafNuIHJlYWwuJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkV2l0aFdvcmtPcmRlcklEJ30gPSAnTGEgT3JkZW4gZGUgVHJhYmFqbyAoSUQ9JXMpIGhhIGFsY2FuemFkbyBzdSBmZWNoYSBkZSBpbmljaW8gcGxhbmVhZGEuJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlclBsYW5uZWRFbmRUaW1lUmVhY2hlZFdpdGhXb3JrT3JkZXJJRCd9ICAgPSAnTGEgT3JkZW4gZGUgVHJhYmFqbyAoSUQ9JXMpIGhhIGFsY2FuemFkbyBzdSBmZWNoYSBkZSBmaW5hbGl6YWNp824gcGxhbmVhZGEuJzsKICAgICRMYW5nLT57J1dvcmtPcmRlckhpc3Rvcnk6OldvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWRXaXRoV29ya09yZGVySUQnfSAgPSAnTGEgT3JkZW4gZGUgVHJhYmFqbyAoSUQ9JXMpIGhhIGFsY2FuemFkbyBzdSBmZWNoYSBkZSBpbmljaW8gcmVhbC4nOwogICAgJExhbmctPnsnV29ya09yZGVySGlzdG9yeTo6V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWRXaXRoV29ya09yZGVySUQnfSAgICA9ICdMYSBPcmRlbiBkZSBUcmFiYWpvIChJRD0lcykgaGEgYWxjYW56YWRvIHN1IGZlY2hhIGRlIGZpbmFsaXphY2nzbiByZWFsLic7CgogICAgIyBjaGFuZ2Ugc3RhdGVzCiAgICAkTGFuZy0+eydyZXF1ZXN0ZWQnfSAgICAgICAgPSAnU29saWNpdGFkbyc7CiAgICAkTGFuZy0+eydwZW5kaW5nIGFwcHJvdmFsJ30gPSAnUGVuZGllbnRlIHBvciBBcHJvYmFjafNuJzsKICAgICRMYW5nLT57J3BlbmRpbmcgcGlyJ30gICAgICA9ICdQZW5kaWVudGUgZGUgUmV2aXNp824gUG9zdC1JbXBsZW1lbnRhY2nzbic7CiAgICAkTGFuZy0+eydyZWplY3RlZCd9ICAgICAgICAgPSAnUmVjaGF6YWRvJzsKICAgICRMYW5nLT57J2FwcHJvdmVkJ30gICAgICAgICA9ICdBcHJvYmFkbyc7CiAgICAkTGFuZy0+eydpbiBwcm9ncmVzcyd9ICAgICAgPSAnRW4gUHJvZ3Jlc28nOwogICAgJExhbmctPnsnc3VjY2Vzc2Z1bCd9ICAgICAgID0gJ0V4aXRvc28nOwogICAgJExhbmctPnsnZmFpbGVkJ30gICAgICAgICAgID0gJ0ZhbGxpZG8nOwogICAgJExhbmctPnsnY2FuY2VsZWQnfSAgICAgICAgID0gJ0NhbmNlbGFkbyc7CiAgICAkTGFuZy0+eydyZXRyYWN0ZWQnfSAgICAgICAgPSAnRGV2dWVsdG8nOwoKICAgICMgd29ya29yZGVyIHN0YXRlcwogICAgJExhbmctPnsnY3JlYXRlZCd9ICAgICA9ICdDcmVhZGEnOwogICAgJExhbmctPnsnYWNjZXB0ZWQnfSAgICA9ICdBY2VwdGFkYSc7CiAgICAkTGFuZy0+eydyZWFkeSd9ICAgICAgID0gJ0xpc3RhJzsKICAgICRMYW5nLT57J2luIHByb2dyZXNzJ30gPSAnRW4gUHJvZ3Jlc28nOwogICAgJExhbmctPnsnY2xvc2VkJ30gICAgICA9ICdDZXJyYWRhJzsKICAgICRMYW5nLT57J2NhbmNlbGVkJ30gICAgPSAnQ2FuY2VsYWRhJzsKCiAgICAjIEFkbWluIEludGVyZmFjZQogICAgJExhbmctPnsnQ2F0ZWdvcnkgPC0+IEltcGFjdCA8LT4gUHJpb3JpdHknfSAgICAgID0gJ0NhdGVnb3JpYSA8LT4gSW1wYWN0byA8LT4gUHJpb3JpZGFkJzsKICAgICRMYW5nLT57J05vdGlmaWNhdGlvbiAoSVRTTSBDaGFuZ2UgTWFuYWdlbWVudCknfSA9ICdOb3RpZmljYWNpb25lcyBkZSBDYW1iaW9zJzsKCiAgICAjIEFkbWluIFN0YXRlTWFjaGluZQogICAgJExhbmctPnsnQWRkIGEgc3RhdGUgdHJhbnNpdGlvbid9ICAgICAgICAgICAgICAgPSAnQWRpY2lvbmFyIHVuIGVzdGFkbyBkZSB0cmFuc2ljafNuJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBzdGF0ZSB0cmFuc2l0aW9uIGZvcid9ICAgICAgID0gJ0FkaWNpb25hciB1biBudWV2byBlc3RhZG8gZGUgdHJhbnNpY2nzbiBwYXJhJzsKICAgICRMYW5nLT57J0VkaXQgYSBzdGF0ZSB0cmFuc2l0aW9uIGZvcid9ICAgICAgICAgID0gJ0VkaXRhciB1biBlc3RhZG8gZGUgdHJhbnNpY2nzbiBwYXJhJzsKICAgICRMYW5nLT57J092ZXJ2aWV3IG92ZXIgc3RhdGUgdHJhbnNpdGlvbnMgZm9yJ30gID0gJ1Zpc3RhIGRlIGxhcyB0cmFuc2ljaW9uZXMgZGUgZXN0YWRvIHBhcmEnOwogICAgJExhbmctPnsnT2JqZWN0IE5hbWUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnTm9tYnJlIGRlbCBPYmpldG8nOwogICAgJExhbmctPnsnUGxlYXNlIHNlbGVjdCBmaXJzdCBhIGNhdGFsb2cgY2xhc3MhJ30gPSAnUG9yIGZhdm9yIHNlbGVjY2lvbmUgcHJpbWVybyB1bmEgY2xhc2UgZGUgY2F04WxvZ28nOwoKICAgICMgd29ya29yZGVyIHR5cGVzCiAgICAkTGFuZy0+eydhcHByb3ZhbCd9ICA9ICdBcHJvYmFjafNuJzsKICAgICRMYW5nLT57J2RlY2lzaW9uJ30gID0gJ0RlY2lzafNuJzsKICAgICRMYW5nLT57J3dvcmtvcmRlcid9ID0gJ09yZGVuIGRlIHRyYWJham8nOwogICAgJExhbmctPnsnYmFja291dCd9ICAgPSAnUGxhbiBkZSBWdWVsdGEgQXRy4XMnOwogICAgJExhbmctPnsncGlyJ30gICAgICAgPSAnUmV2aXNp824gUG9zdC1JbXBsZW1lbnRhY2nzbic7CgogICAgIyBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uZGl0aW9uIGV4cHJlc3Npb25zIGFuZCBhY3Rpb25zCiAgICAkTGFuZy0+eydJVFNNQ2hhbmdlJ30gICAgPSAnQ2FtYmlvJzsKICAgICRMYW5nLT57J0lUU01Xb3JrT3JkZXInfSA9ICdPcmRlbiBkZSBUcmFiYWpvJzsKICAgICRMYW5nLT57J0lUU01Db25kaXRpb24nfSA9ICdDb25kaWNp824nOwoKICAgICMgT3ZlcnZpZXdzCiAgICAkTGFuZy0+eydDaGFuZ2UgU2NoZWR1bGUnfSA9ICdDYW1iaWFyIFByb2dyYW1hY2nzbic7CgogICAgIyBXb3Jrb3JkZXIgZGVsZXRlCiAgICAkTGFuZy0+eydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgd29ya29yZGVyPyd9ID0gJ1JlYWxtZW50ZSBkZXNlYSBib3JyYXIgZXN0YSBvcmRlbiBkZSB0cmFiYWpvJzsKICAgICRMYW5nLT57J1lvdSBjYW4gbm90IGRlbGV0ZSB0aGlzIFdvcmtvcmRlci4gSXQgaXMgdXNlZCBpbiBhdCBsZWFzdCBvbmUgQ29uZGl0aW9uISd9ID0gJ05vIGVzIHBvc2libGUgYm9ycmFyIGVzdGEgb3JkZW4gZGUgdHJhYmFqbyBwdWVzIGVzdOEgc2llbmRvIHVzYWRhIGVuIGFsIG1lbm9zIHVuYSBDb25kaWNp824nOwogICAgJExhbmctPnsnVGhpcyBXb3Jrb3JkZXIgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIENvbmRpdGlvbihzKSd9ID0gJ0VzdGEgb3JkZW4gZGUgdHJhYmFqbyBlcyB1c2FkYSBlbiBsYXMgc2lndWllbnRlKHMpIGNvbmRpY2lvbihlcyknOwoKICAgICMgVGFrZSB3b3Jrb3JkZXIKICAgICRMYW5nLT57J1Rha2UgV29ya29yZGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RvbWFyIE9yZGVuIGRlIFRyYWJham8nOwogICAgJExhbmctPnsnVGFrZSB0aGUgd29ya29yZGVyJ30gICAgICAgICAgICAgICAgICAgICAgICAgPSAnVG9tYXIgTGEgT3JkZW4gZGUgVHJhYmFqbyc7CiAgICAkTGFuZy0+eydDdXJyZW50IEFnZW50J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZ2VudGUgYWN0dWFsJzsKICAgICRMYW5nLT57J0RvIHlvdSByZWFsbHkgd2FudCB0byB0YWtlIHRoaXMgd29ya29yZGVyPyd9ID0gJ1JlYWxtZW50ZSBxdWllcmUgdG9tYXIgZXN0YSBPcmRlbiBkZSBUcmFiYWpvPyc7CgogICAgIyBDb25kaXRpb24gT3ZlcnZpZXcgYW5kIEVkaXQKICAgICRMYW5nLT57J0NvbmRpdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDb25kaWNp824nOwogICAgJExhbmctPnsnQ29uZGl0aW9ucyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0NvbmRpY2lvbmVzJzsKICAgICRMYW5nLT57J0V4cHJlc3Npb24nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFeHByZXNp824nOwogICAgJExhbmctPnsnRXhwcmVzc2lvbnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0V4cHJlc2lvbmVzJzsKICAgICRMYW5nLT57J0FjdGlvbid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBY2Np824nOwogICAgJExhbmctPnsnQWN0aW9ucyd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0FjY2lvbmVzJzsKICAgICRMYW5nLT57J01hdGNoaW5nJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDb2luY2lkZW50ZXMnOwogICAgJExhbmctPnsnQ29uZGl0aW9ucyBhbmQgQWN0aW9ucyd9ICAgICAgICAgICAgICAgICAgID0gJ0NvbmRpY2lvbmVzIHkgQWNjaW9uZXMnOwogICAgJExhbmctPnsnQWRkIG5ldyBjb25kaXRpb24gYW5kIGFjdGlvbiBwYWlyJ30gICAgICAgID0gJ0FkaWNpb25hciBudWV2byBwYXIgY29uZGljafNuLWFjY2nzbic7CiAgICAkTGFuZy0+eydBIGNvbmRpdGlvbiBtdXN0IGhhdmUgYSBuYW1lISd9ICAgICAgICAgICAgPSAnQ2FkYSBjb25kaWNp824gZGViZSB0ZW5lciB1biBub21icmUhJzsKICAgICRMYW5nLT57J0NvbmRpdGlvbiBFZGl0J30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdFZGl0YXIgQ29uZGljafNuJzsKICAgICRMYW5nLT57J0FkZCBuZXcgZXhwcmVzc2lvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdBZGljaW9uYXIgbnVldmEgZXhwcmVzafNuJzsKICAgICRMYW5nLT57J0FkZCBuZXcgYWN0aW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdBZGljaW9uYXIgbnVldmEgYWNjafNuJzsKICAgICRMYW5nLT57J0FueSBleHByZXNzaW9uJ30gICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdDdWFscXVpZXIgZXhwcmVzafNuJzsKICAgICRMYW5nLT57J0FsbCBleHByZXNzaW9ucyd9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdUb2RhcyBsYXMgZXhwcmVzaW9uZXMnOwogICAgJExhbmctPnsnYW55J30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ0N1YWxxdWllcmEnOwogICAgJExhbmctPnsnYWxsJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1RvZG8nOwogICAgJExhbmctPnsnaXMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2VzJzsKICAgICRMYW5nLT57J2lzIG5vdCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdubyBlcyc7CiAgICAkTGFuZy0+eydpcyBlbXB0eSd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZXN04SB2YWPtYSc7CiAgICAkTGFuZy0+eydpcyBub3QgZW1wdHknfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnbm8gZXN04SB2YWPtYSc7CiAgICAkTGFuZy0+eydpcyBncmVhdGVyIHRoYW4nfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZXMgbeFzIGdyYW5kZSBxdWUnOwogICAgJExhbmctPnsnaXMgbGVzcyB0aGFuJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2VzIG1lbm9yIHF1ZSc7CiAgICAkTGFuZy0+eydpcyBiZWZvcmUnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZXN04SBhbnRlcyc7CiAgICAkTGFuZy0+eydpcyBhZnRlcid9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZXN04SBkZXNwdelzJzsKICAgICRMYW5nLT57J2NvbnRhaW5zJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdjb250aWVuZSc7CiAgICAkTGFuZy0+eydub3QgY29udGFpbnMnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnbm8gY29udGllbmUnOwogICAgJExhbmctPnsnYmVnaW5zIHdpdGgnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ2NvbWllbnphIGNvbic7CiAgICAkTGFuZy0+eydlbmRzIHdpdGgnfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZmluYWxpemEgY29uJzsKICAgICRMYW5nLT57J3NldCd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdjb25maWd1cmFkYSc7CiAgICAkTGFuZy0+eydsb2NrJ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnYmxvcXVlYWRhJzsKCiAgICAjIENoYW5nZSBab29tCiAgICAkTGFuZy0+eydDaGFuZ2UgSW5pdGlhdG9yKHMpJ30gPSAnSW5pY2lhZG9yKGVzKSBkZWwgY2FtYmlvcyc7CgogICAgIyBBZ2VudElUU01DaGFuZ2VQcmludAogICAgJExhbmctPnsnTGlua2VkIE9iamVjdHMnfSA9ICdPYmpldG9zIFZpbmN1bGFkb3MnOwogICAgJExhbmctPnsnRnVsbC1UZXh0IFNlYXJjaCBpbiBDaGFuZ2UgYW5kIFdvcmtvcmRlcid9ID0gJ0L6c3F1ZWRhIGRlIHRleHRvIGNvbXBsZXRvIGVuIHVuIENhbWJpbyBvIHVuYSBPcmRlbiBkZSBUcmFiYWpvJzsKCiAgICAjIEFnZW50SVRTTUNoYW5nZVNlYXJjaAogICAgJExhbmctPnsnTm8gWFhYIHNldHRpbmdzJ30gPSAiTm8gaGF5IGNvbmZpZ3VyYWNpb25lcyAnJXMnICI7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlLnBtIC0gYWRtaW4gZnJvbnRlbmQgb2YgY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlLnBtLHYgMS42IDIwMTAvMDQvMjcgMjA6MzM6NTAgdWIgRXhwICQKIyAkT2xkSWQ6IEFkbWluSVRTTUNJUEFsbG9jYXRlLnBtLHYgMS4xMSAyMDA5LzA1LzE4IDA5OjQ4OjM1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KI3BhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01DSVBBbGxvY2F0ZTsKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlOwojIC0tLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiN1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKI3VzZSBLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlOwojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiMgICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKIyAgICAkU2VsZi0+e1ByaW9yaXR5T2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQcmlvcml0eS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwojIC0tLQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiMgICAgIyBjcml0aWNhbGl0eSwgaW1wYWN0IGFuZCBwcmlvcml0eSBhbGxvY2F0aW9uCiAgICAjIGNhdGVnb3J5LCBpbXBhY3QgYW5kIHByaW9yaXR5IGFsbG9jYXRpb24KIyAtLS0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDSVBBbGxvY2F0ZScgKSB7CgogICAgICAgICMgZ2V0IG9wdGlvbiBsaXN0cwogICAgICAgIG15ICVPYmplY3RPcHRpb247CiMgLS0tCiMgSVRTTSBDaGFuZ2UgTWFuYWdlbWVudAojIC0tLQojICAgICAgICAkT2JqZWN0T3B0aW9ue0NyaXRpY2FsaXR5TGlzdH0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiMgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAojICAgICAgICApOwojICAgICAgICAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAojICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiMgICAgICAgICk7CiMgICAgICAgIG15ICVPcHRpb25Qcmlvcml0eUxpc3QgPSAkU2VsZi0+e1ByaW9yaXR5T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAojICAgICAgICAgICAgVXNlcklEID0+IDEsCiMgICAgICAgICk7CiMgICAgICAgICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSA9IFwlT3B0aW9uUHJpb3JpdHlMaXN0OwogICAgICAgICRPYmplY3RPcHRpb257Q2F0ZWdvcnlMaXN0fSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNhdGVnb3J5JywKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpJbXBhY3QnLAogICAgICAgICk7CiAgICAgICAgJE9iamVjdE9wdGlvbntQcmlvcml0eUxpc3R9ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6UHJpb3JpdHknLAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgZ2V0IGFsbCBQcmlvcml0eUlEcyBvZiB0aGUgbWF0cml4CiAgICAgICAgbXkgJEFsbG9jYXRlRGF0YTsKICAgICAgICBmb3IgbXkgJEltcGFjdElEICgga2V5cyAleyAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9IH0gKSB7CgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgIENSSVRJQ0FMSVRZSUQ6CiMgICAgICAgICAgICBmb3IgbXkgJENyaXRpY2FsaXR5SUQgKCBrZXlzICV7ICRPYmplY3RPcHRpb257Q3JpdGljYWxpdHlMaXN0fSB9ICkgewojCiMgICAgICAgICAgICAgICAgIyBnZXQgZm9ybSBwYXJhbQojICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAojICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAiUHJpb3JpdHlJRCIgLiAkSW1wYWN0SUQgLiAnLScgLiAkQ3JpdGljYWxpdHlJRAojICAgICAgICAgICAgICAgICkgfHwgJyc7CiMKIyAgICAgICAgICAgICAgICBuZXh0IENSSVRJQ0FMSVRZSUQgaWYgISRQcmlvcml0eUlEOwojCiMgICAgICAgICAgICAgICAgJEFsbG9jYXRlRGF0YS0+eyRJbXBhY3RJRH0tPnskQ3JpdGljYWxpdHlJRH0gPSAkUHJpb3JpdHlJRDsKIyAgICAgICAgICAgIH0KICAgICAgICAgICAgQ0FURUdPUllJRDoKICAgICAgICAgICAgZm9yIG15ICRDYXRlZ29yeUlEICgga2V5cyAleyAkT2JqZWN0T3B0aW9ue0NhdGVnb3J5TGlzdH0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtIHBhcmFtCiAgICAgICAgICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAiUHJpb3JpdHlJRCIgLiAkSW1wYWN0SUQgLiAnLScgLiAkQ2F0ZWdvcnlJRAogICAgICAgICAgICAgICAgKSB8fCAnJzsKCiAgICAgICAgICAgICAgICBuZXh0IENBVEVHT1JZSUQgaWYgISRQcmlvcml0eUlEOwoKICAgICAgICAgICAgICAgICRBbGxvY2F0ZURhdGEtPnskSW1wYWN0SUR9LT57JENhdGVnb3J5SUR9ID0gJFByaW9yaXR5SUQ7CiAgICAgICAgICAgIH0KIyAtLS0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGFsbG9jYXRpb25zCiAgICAgICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlVXBkYXRlKAogICAgICAgICAgICBBbGxvY2F0ZURhdGEgPT4gJEFsbG9jYXRlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBvcHRpb24gbGlzdHMKICAgICAgICBteSAlT2JqZWN0T3B0aW9uOwojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAojICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKIyAgICAgICAgKTsKIyAgICAgICAgJE9iamVjdE9wdGlvbntJbXBhY3RMaXN0fSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKIyAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAojICAgICAgICApOwojICAgICAgICBteSAlT3B0aW9uUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntQcmlvcml0eU9iamVjdH0tPlByaW9yaXR5TGlzdCgKIyAgICAgICAgICAgIFVzZXJJRCA9PiAxLAojICAgICAgICApOwojICAgICAgICAkT2JqZWN0T3B0aW9ue1ByaW9yaXR5TGlzdH0gPSBcJU9wdGlvblByaW9yaXR5TGlzdDsKICAgICAgICAkT2JqZWN0T3B0aW9ue0NhdGVnb3J5TGlzdH0gPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDYXRlZ29yeScsCiAgICAgICAgKTsKICAgICAgICAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6SW1wYWN0JywKICAgICAgICApOwogICAgICAgICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OlByaW9yaXR5JywKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIGdldCBhbGxvY2F0aW9uIGRhdGEKICAgICAgICBteSAkQWxsb2NhdGVEYXRhID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPkFsbG9jYXRlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFsbG9jYXRlTWF0cml4OwogICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bMF0tPntDbGFzc30gPSAnRGVzY3JpcHRpb24nOwoKICAgICAgICAjIGdlbmVyYXRlIHRhYmxlIGRlc2NyaXB0aW9uIChJbXBhY3QpCiAgICAgICAgbXkgJENvdW50ZXIxID0gMTsKICAgICAgICBmb3IgbXkgJEltcGFjdCAoCiAgICAgICAgICAgIHNvcnQgeyAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9LT57JGF9IGNtcCAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9LT57JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkT2JqZWN0T3B0aW9ue0ltcGFjdExpc3R9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXIxXS0+WzBdLT57T2JqZWN0VHlwZX0gICA9ICdJbXBhY3QnOwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlskQ291bnRlcjFdLT5bMF0tPntJbXBhY3RLZXl9ICAgID0gJEltcGFjdDsKICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJENvdW50ZXIxXS0+WzBdLT57T2JqZWN0T3B0aW9ufSA9ICRPYmplY3RPcHRpb257SW1wYWN0TGlzdH17JEltcGFjdH07CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRDb3VudGVyMV0tPlswXS0+e0NsYXNzfSAgICAgICAgPSAnRGVzY3JpcHRpb24nOwogICAgICAgICAgICAkQ291bnRlcjErKzsKICAgICAgICB9CgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgIyBnZW5lcmF0ZSB0YWJsZSBkZXNjcmlwdGlvbiAoQ3JpdGljYWxpdHkpCiMgICAgICAgIG15ICRDb3VudGVyMiA9IDE7CiMgICAgICAgIGZvciBteSAkQ3JpdGljYWxpdHkgKAojICAgICAgICAgICAgc29ydCB7ICRPYmplY3RPcHRpb257Q3JpdGljYWxpdHlMaXN0fS0+eyRhfSBjbXAgJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9LT57JGJ9IH0KIyAgICAgICAgICAgIGtleXMgJXsgJE9iamVjdE9wdGlvbntDcml0aWNhbGl0eUxpc3R9IH0KIyAgICAgICAgICAgICkKIyAgICAgICAgewojICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bMF0tPlskQ291bnRlcjJdLT57T2JqZWN0VHlwZX0gICAgID0gJ0NyaXRpY2FsaXR5JzsKIyAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e0NyaXRpY2FsaXR5S2V5fSA9ICRDcml0aWNhbGl0eTsKIyAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e09iamVjdE9wdGlvbn0KIyAgICAgICAgICAgICAgICA9ICRPYmplY3RPcHRpb257Q3JpdGljYWxpdHlMaXN0fXskQ3JpdGljYWxpdHl9OwojICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bMF0tPlskQ291bnRlcjJdLT57Q2xhc3N9ID0gJ0Rlc2NyaXB0aW9uJzsKIyAgICAgICAgICAgICRDb3VudGVyMisrOwojICAgICAgICB9CiAgICAgICAgIyBnZW5lcmF0ZSB0YWJsZSBkZXNjcmlwdGlvbiAoQ2F0ZWdvcnkpCiAgICAgICAgbXkgJENvdW50ZXIyID0gMTsKICAgICAgICBmb3IgbXkgJENhdGVnb3J5ICgKICAgICAgICAgICAgc29ydCB7ICRPYmplY3RPcHRpb257Q2F0ZWdvcnlMaXN0fS0+eyRhfSBjbXAgJE9iamVjdE9wdGlvbntDYXRlZ29yeUxpc3R9LT57JGJ9IH0KICAgICAgICAgICAga2V5cyAleyAkT2JqZWN0T3B0aW9ue0NhdGVnb3J5TGlzdH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyMl0tPntPYmplY3RUeXBlfSAgPSAnQ2F0ZWdvcnknOwogICAgICAgICAgICAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb3VudGVyMl0tPntDYXRlZ29yeUtleX0gPSAkQ2F0ZWdvcnk7CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e09iamVjdE9wdGlvbn0KICAgICAgICAgICAgICAgID0gJE9iamVjdE9wdGlvbntDYXRlZ29yeUxpc3R9eyRDYXRlZ29yeX07CiAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WzBdLT5bJENvdW50ZXIyXS0+e0NsYXNzfSA9ICdEZXNjcmlwdGlvbic7CiAgICAgICAgICAgICRDb3VudGVyMisrOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBnZW5lcmF0ZSBjb250ZW50CiAgICAgICAgZm9yIG15ICRSb3cgKCAxIC4uICggJENvdW50ZXIxIC0gMSApICkgewogICAgICAgICAgICBmb3IgbXkgJENvbHVtbiAoIDEgLi4gKCAkQ291bnRlcjIgLSAxICkgKSB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGtleXMKICAgICAgICAgICAgICAgIG15ICRJbXBhY3RLZXkgICAgICA9ICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bMF0tPntJbXBhY3RLZXl9OwojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlLZXkgPSAkQWxsb2NhdGVNYXRyaXgtPlswXS0+WyRDb2x1bW5dLT57Q3JpdGljYWxpdHlLZXl9OwojCiMgICAgICAgICAgICAgICAgIyBjcmVhdGUgb3B0aW9uIHN0cmluZwojICAgICAgICAgICAgICAgIG15ICRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKIyAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUHJpb3JpdHlJRCcgLiAkSW1wYWN0S2V5IC4gJy0nIC4gJENyaXRpY2FsaXR5S2V5LAojICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRPYmplY3RPcHRpb257UHJpb3JpdHlMaXN0fSwKIyAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkQWxsb2NhdGVEYXRhLT57JEltcGFjdEtleX17JENyaXRpY2FsaXR5S2V5fSB8fCAnJywKIyAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJENhdGVnb3J5S2V5ID0gJEFsbG9jYXRlTWF0cml4LT5bMF0tPlskQ29sdW1uXS0+e0NhdGVnb3J5S2V5fTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBvcHRpb24gc3RyaW5nCiAgICAgICAgICAgICAgICBteSAkT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUHJpb3JpdHlJRCcgLiAkSW1wYWN0S2V5IC4gJy0nIC4gJENhdGVnb3J5S2V5LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJE9iamVjdE9wdGlvbntQcmlvcml0eUxpc3R9LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFsbG9jYXRlRGF0YS0+eyRJbXBhY3RLZXl9eyRDYXRlZ29yeUtleX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwojIC0tLQoKICAgICAgICAgICAgICAgICRBbGxvY2F0ZU1hdHJpeC0+WyRSb3ddLT5bJENvbHVtbl0tPntPcHRpb25TdHJnfSA9ICRPcHRpb25TdHJnOwogICAgICAgICAgICAgICAgJEFsbG9jYXRlTWF0cml4LT5bJFJvd10tPlskQ29sdW1uXS0+e0NsYXNzfSAgICAgID0gJ0NvbnRlbnQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhbGxvY2F0aW9uIG1hdHJpeAogICAgICAgIGZvciBteSAkUm93UmVmICggQHskQWxsb2NhdGVNYXRyaXh9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ0lQQWxsb2NhdGVSb3cnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRDZWxsICggQHskUm93UmVmfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ0lQQWxsb2NhdGVSb3dDb2x1bW4nIC4gJENlbGwtPntDbGFzc30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQ2VsbCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiMgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNJUEFsbG9jYXRlJywKIyAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAojICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwojIC0tLQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbi5wbSAtIHRvIGFkZC91cGRhdGUvZGVsZXRlCiMgbm90aWZpY2F0aW9uIHJ1bGVzIGZvciBJVFNNIGNoYW5nZSBtYW5hZ2VtZW50CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb24ucG0sdiAxLjEzIDIwMTAvMDEvMTYgMTk6NTg6MDAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01DaGFuZ2VOb3RpZmljYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3Rvcnk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskTmVlZGVkT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE5lZWRlZE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0hpc3RvcnlPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e05vdGlmaWNhdGlvbk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBoYXNoIHdpdGggZmVlZGJhY2sgdG8gdGhlIHVzZXIKICAgIG15ICVOb3RpZmljYXRpb247CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2UnICkgewogICAgICAgIG15ICRJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICREYXRhID0gJFNlbGYtPntOb3RpZmljYXRpb25PYmplY3R9LT5Ob3RpZmljYXRpb25SdWxlR2V0KCBJRCA9PiAkSUQgKTsKCiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gICAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgQWN0aW9uTGFiZWwgPT4gJ0VkaXQnLAogICAgICAgICAgICAleyREYXRhfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJE5vdGUgPSAnJzsKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoSUQgTmFtZSBFdmVudElEIENvbW1lbnQgVmFsaWRJRCBBdHRyaWJ1dGUgUnVsZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte1JlY2lwaWVudElEc30gPSBbCiAgICAgICAgICAgICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ1JlY2lwaWVudElEcycgKQogICAgICAgIF07CgogICAgICAgICMgdXBkYXRlIGdyb3VwCiAgICAgICAgaWYgKCAkU2VsZi0+e05vdGlmaWNhdGlvbk9iamVjdH0tPk5vdGlmaWNhdGlvblJ1bGVVcGRhdGUoJUdldFBhcmFtKSApIHsKICAgICAgICAgICAgJFNlbGYtPl9PdmVydmlldygpOwoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gd2FzIHVwZGF0ZWQKICAgICAgICAgICAgJU5vdGlmaWNhdGlvbiA9ICggSW5mbyA9PiAnTm90aWZpY2F0aW9uIHVwZGF0ZWQhJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgYW4gZXJyb3Igb2NjdXJlZCAtPiBzaG93IG5vdGlmaWNhdGlvbgogICAgICAgICAgICAlTm90aWZpY2F0aW9uID0gKCBQcmlvcml0eSA9PiAnRXJyb3InICk7CgogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgICAgIEFjdGlvbkxhYmVsID0+ICdFZGl0JywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGQnICkgewogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uICAgICAgPT4gJ0FkZCcsCiAgICAgICAgICAgIEFjdGlvbkxhYmVsID0+ICdBZGQnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkTm90ZSA9ICcnOwogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhJRCBFdmVudElEIE5hbWUgQ29tbWVudCBWYWxpZElEIEF0dHJpYnV0ZSBSdWxlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAkR2V0UGFyYW17UmVjaXBpZW50SURzfSA9IFsKICAgICAgICAgICAgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnUmVjaXBpZW50SURzJyApCiAgICAgICAgXTsKCiAgICAgICAgIyBhZGQgbm90aWZpY2F0aW9uIHJ1bGUKICAgICAgICBpZiAoIG15ICRTdGF0ZUlEID0gJFNlbGYtPntOb3RpZmljYXRpb25PYmplY3R9LT5Ob3RpZmljYXRpb25SdWxlQWRkKCVHZXRQYXJhbSkgKSB7CiAgICAgICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKCiAgICAgICAgICAgICMgbm90aWZpY2F0aW9uIHdhcyBhZGRlZAogICAgICAgICAgICAlTm90aWZpY2F0aW9uID0gKCBJbmZvID0+ICdOb3RpZmljYXRpb24gYWRkZWQhJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgYW4gZXJyb3Igb2NjdXJlZCAtPiBzaG93IG5vdGlmaWNhdGlvbgogICAgICAgICAgICAlTm90aWZpY2F0aW9uID0gKCBQcmlvcml0eSA9PiAnRXJyb3InICk7CgogICAgICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICA9PiAnQWRkJywKICAgICAgICAgICAgICAgIEFjdGlvbkxhYmVsID0+ICdBZGQnLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgaWYgKCVOb3RpZmljYXRpb24pIHsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KCVOb3RpZmljYXRpb24pIHx8ICcnOwogICAgfQogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKfQoKIyBzaG93IHRoZSBlZGl0IG1hc2sgZm9yIGEgbm90aWZpY2F0aW9uIHJ1bGUKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKICAgICRQYXJhbXtWYWxpZE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCksCiAgICAgICAgfSwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAoICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpIClbMF0sCiAgICAgICAgU29ydCAgICAgICA9PiAnTnVtZXJpY0tleScsCiAgICApOwogICAgJFBhcmFte0V2ZW50T3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5VHlwZUxpc3QoIFVzZXJJRCA9PiAxICkgfHwgW10sCiAgICAgICAgTmFtZSA9PiAnRXZlbnRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RXZlbnRJRH0sCiAgICApOwogICAgJFBhcmFte1JlY2lwaWVudE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gJFNlbGYtPntOb3RpZmljYXRpb25PYmplY3R9LT5SZWNpcGllbnRMaXN0KCBVc2VySUQgPT4gMSApIHx8IFtdLAogICAgICAgIE5hbWUgPT4gJ1JlY2lwaWVudElEcycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gMTMsICAgICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgbnVtYmVyIG9mIGRlZmF1bHQgcmVjaXBpZW50cywgYXZvaWQgc2Nyb2xsaW5nCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17UmVjaXBpZW50SURzfSwKICAgICk7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZScsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKIyBzaG93IGEgdGFibGUgb2Ygbm90aWZpY2F0aW9uIHJ1bGVzCnN1YiBfT3ZlcnZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRSdWxlSURzID0gJFNlbGYtPntOb3RpZmljYXRpb25PYmplY3R9LT5Ob3RpZmljYXRpb25SdWxlTGlzdCgpIHx8IFtdOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICBteSAkQ3NzQ2xhc3MgID0gJyc7CiAgICBmb3IgbXkgJFJ1bGVJRCAoIEB7JFJ1bGVJRHN9ICkgewoKICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICBpZiAoICRDc3NDbGFzcyAmJiAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgKSB7CiAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgIH0KCiAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+e05vdGlmaWNhdGlvbk9iamVjdH0tPk5vdGlmaWNhdGlvblJ1bGVHZXQoIElEID0+ICRSdWxlSUQgKTsKICAgICAgICBteSAkUmVjaXBpZW50cyA9IGpvaW4gJywgJywgQHsgJERhdGEtPntSZWNpcGllbnRzfSB8fCBbXSB9OwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFsaWQgICAgPT4gJFZhbGlkTGlzdHsgJERhdGEtPntWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgJXskRGF0YX0sCiAgICAgICAgICAgICAgICBSZWNpcGllbnRzID0+ICRSZWNpcGllbnRzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTVN0YXRlTWFjaGluZS5wbSAtIHRvIGFkZC91cGRhdGUvZGVsZXRlIHN0YXRlIHRyYW5zaXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZG1pbklUU01TdGF0ZU1hY2hpbmUucG0sdiAxLjI1IDIwMTAvMDEvMjAgMDg6MzI6MTQgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbklUU01TdGF0ZU1hY2hpbmU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI1ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBhbGwgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZS0+bmV3KCVQYXJhbSk7CgogICAgIyByZWFkIHRoZSBjb25maWcsCiAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01TdGF0ZU1hY2hpbmU6Ok9iamVjdCIpIHx8IHt9OwoKICAgICMgcHJlcGFyZSB0aGUgY29uZmlnIGZvciBsb29rdXAgYnkgY2xhc3MKICAgICMgdGhlIGhhc2gga2V5cyBvZiAkQ29uZmlnIGFyZSBub3Qgc2lnbmlmaWNhbnQKICAgICRTZWxmLT57Q29uZmlnQnlDbGFzc30gPSB7fTsKICAgIGZvciBteSAkSGFzaFJlZiAoIHZhbHVlcyAleyRDb25maWd9ICkgewogICAgICAgICRTZWxmLT57Q29uZmlnQnlDbGFzc30tPnsgJEhhc2hSZWYtPntDbGFzc30gfSA9ICRIYXNoUmVmOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc3RvcmUgY29tbW9ubHkgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoU3RhdGVJRCBOZXh0U3RhdGVJRCBDbGFzcykpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIHRyYW5zbGF0ZSBmcm9tIG5hbWUgdG8gY2xhc3MgYW5kIHZpc2EgdmVyc2EKICAgIGlmICggJEdldFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkR2V0UGFyYW17Q2xhc3NTaG9ydE5hbWV9ID0gJFNlbGYtPntDb25maWdCeUNsYXNzfS0+eyAkR2V0UGFyYW17Q2xhc3N9IH0tPntOYW1lfTsKICAgIH0KCiAgICAjIEJ1aWxkIGRyb3AtZG93biBmb3IgdGhlIGNsYXNzIHNlbGVjdGlvbiBvbiB0aGUgbGVmdCBzaWRlLgogICAgbXkgQEFyckhhc2hSZWY7CiAgICBmb3IgbXkgJENsYXNzICggc29ydCBrZXlzICV7ICRTZWxmLT57Q29uZmlnQnlDbGFzc30gfSApIHsKICAgICAgICBwdXNoIEBBcnJIYXNoUmVmLCB7IEtleSA9PiAkQ2xhc3MsIFZhbHVlID0+ICRDbGFzcywgfTsKICAgIH0KICAgICRHZXRQYXJhbXtDbGFzc1NlbGVjdGlvblN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcQEFyckhhc2hSZWYsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtDbGFzc30sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICApOwoKICAgICMgZXJyb3IgbWVzc2FnZXMgYXJlIGFkZGVkIHRvIHRoaXMgdmFyaWFibGUKICAgIG15ICROb3RlID0gJyc7CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0YXRlVHJhbnNpdGlvblVwZGF0ZScgKSB7CgogICAgICAgICMgcHJvdmlkZSBmb3JtIGZvciBjaGFuZ2luZyB0aGUgbmV4dCBzdGF0ZQogICAgICAgIHJldHVybiAkU2VsZi0+X1N0YXRlVHJhbnNpdGlvblVwZGF0ZVBhZ2VHZXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnU3RhdGVUcmFuc2l0aW9uVXBkYXRlJywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RhdGVUcmFuc2l0aW9uQWRkJyApIHsKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2xhc3N9ICkgewogICAgICAgICAgICAkTm90ZSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIHNlbGVjdCBmaXJzdCBhIGNhdGFsb2cgY2xhc3MhJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHByb3ZpZGUgZm9ybSBmb3IgYWRkaW5nIGEgc3RhdGUgdHJhbnNpdGlvbgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9TdGF0ZVRyYW5zaXRpb25BZGRQYWdlR2V0KAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICdTdGF0ZVRyYW5zaXRpb25BZGQnLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0ZVRyYW5zaXRpb25EZWxldGUnICkgewoKICAgICAgICAjIHNob3cgY29uZmlybWF0aW9uIHBhZ2UgZm9yIHN0YXRlIGRlbGV0aW9uCiAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RhdGVUcmFuc2l0aW9uRGVsZXRlUGFnZUdldCgKICAgICAgICAgICAgQWN0aW9uID0+ICdTdGF0ZVRyYW5zaXRpb25EZWxldGUnLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHBlcmZvcm0gYWN0aW9ucwoKICAgIG15ICRBY3Rpb25Jc09rID0gMTsKCiAgICAjIHVwZGF0ZSB0aGUgbmV4dCBzdGF0ZSBvZiBhIHN0YXRlIHRyYW5zaXRpb24KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0ZVRyYW5zaXRpb25VcGRhdGVBY3Rpb24nICkgewoKICAgICAgICAjIHBhcmFtcyBzcGVjaWZpYyB0byBTdGF0ZVRyYW5zaXRpb25VcGRhdGUKICAgICAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoTmV3TmV4dFN0YXRlSUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgICAgIH0KCiAgICAgICAgIyBVcGRhdGUgdGhlIHN0YXRlIHRyYW5zaXRpb24KICAgICAgICAkQWN0aW9uSXNPayA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uVXBkYXRlKAogICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAkR2V0UGFyYW17Q2xhc3N9LAogICAgICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkR2V0UGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgIE5ld05leHRTdGF0ZUlEID0+ICRHZXRQYXJhbXtOZXdOZXh0U3RhdGVJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0ZVRyYW5zaXRpb25BZGRBY3Rpb24nICkgewoKICAgICAgICBteSAkSXNWYWxpZCA9IDE7CgogICAgICAgICMgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVtcHR5IHN0cmluZyAnJyBhbmQgdGhlIHN0cmluZyAnMCcuCiAgICAgICAgIyAnJyBpbmRpY2F0ZXMgdGhhdCBubyB2YWx1ZSB3YXMgc2VsZWN0ZWQsIHdoaWNoIGlzIGludmFsaWQKICAgICAgICAjICcwJyBpbmRpY2F0ZWQgJypTVEFSVConIG9yICcqRU5EKicKICAgICAgICBpZiAoICRHZXRQYXJhbXtTdGF0ZUlEfSBlcSAnJyApIHsKICAgICAgICAgICAgJElzVmFsaWQgPSAwOwogICAgICAgICAgICAkTm90ZSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIHNlbGVjdCBhIHN0YXRlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gZXEgJycgKSB7CiAgICAgICAgICAgICRJc1ZhbGlkID0gMDsKICAgICAgICAgICAgJE5vdGUgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ1BsZWFzZSBzZWxlY3QgYSBuZXh0IHN0YXRlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkSXNWYWxpZCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RhdGVUcmFuc2l0aW9uQWRkUGFnZUdldCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnU3RhdGVUcmFuc2l0aW9uQWRkJywKICAgICAgICAgICAgICAgIE5vdGUgICA9PiAkTm90ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQWRkIHRoZSBzdGF0ZSB0cmFuc2l0aW9uCiAgICAgICAgJEFjdGlvbklzT2sgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlVHJhbnNpdGlvbkFkZCgKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJEdldFBhcmFte0NsYXNzfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgPT4gJEdldFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RhdGVUcmFuc2l0aW9uRGVsZXRlQWN0aW9uJyApIHsKCiAgICAgICAgIyBEZWxldGUgdGhlIHN0YXRlIHRyYW5zaXRpb24KICAgICAgICAkQWN0aW9uSXNPayA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uRGVsZXRlKAogICAgICAgICAgICBTdGF0ZUlEICAgICA9PiAkR2V0UGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgbGlzdCBvZiBzdGF0ZSB0cmFuc2l0aW9ucyBmb3IgdGhlIGNsYXNzCiAgICBpZiAoICRHZXRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJE5vdGUgLj0gJEFjdGlvbklzT2sgPyAnJyA6ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+X092ZXJ2aWV3U3RhdGVUcmFuc2l0aW9uc1BhZ2VHZXQoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgTm90ZSA9PiAkTm90ZSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlc2VudCBhIGxpc3Qgb2YgYWxsIGNvbmZpZ3VyZWQgY2xhc3NlcywgYXMgdGhlIGNsYXNzIGlzIG5vdCBrbm93biB5ZXQKICAgIHJldHVybiAkU2VsZi0+X092ZXJ2aWV3Q2xhc3Nlc1BhZ2VHZXQoCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIE5vdGUgPT4gJE5vdGUsCiAgICApOwp9CgojIHByb3ZpZGUgYSBmb3JtIGZvciBjaGFuZ2luZyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRyYW5zaXRpb24Kc3ViIF9TdGF0ZVRyYW5zaXRpb25VcGRhdGVQYWdlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte1N0YXRlTmFtZX0gPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlTG9va3VwKAogICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtTdGF0ZUlEfSwKICAgICkgfHwgJypTVEFSVConOwoKICAgICMgQXJyYXlIYXNoUmVmIHdpdGggYWxsIHN0YXRlcyBmb3IgYSBjYXRhbG9nIGNsYXNzCiAgICBteSAkQWxsU3RhdGVzQXJyYXlIYXNoUmVmID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgQ2xhc3MgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBBZGQgdGhlIHNwZWNpYWwgZmluYWwgc3RhdGUKICAgIHB1c2ggQHskQWxsU3RhdGVzQXJyYXlIYXNoUmVmfSwgeyBLZXkgPT4gJzAnLCBWYWx1ZSA9PiAnKkVORConIH07CgogICAgJFBhcmFte05leHRTdGF0ZVNlbGVjdGlvblN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJEFsbFN0YXRlc0FycmF5SGFzaFJlZiwKICAgICAgICBOYW1lICAgICAgID0+ICdOZXdOZXh0U3RhdGVJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV4dFN0YXRlSUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU3RhdGVUcmFuc2l0aW9uVXBkYXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkUGFyYW17Tm90ZX0gfHwgJyc7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCiMgcHJvdmlkZSBhIGZvcm0gZm9yIGFkZGluZyBhIG5ldyBzdGF0ZSB0cmFuc2l0aW9uCnN1YiBfU3RhdGVUcmFuc2l0aW9uQWRkUGFnZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQXJyYXlIYXNoUmVmIHdpdGggYWxsIHN0YXRlcyBmb3IgYSBjYXRhbG9nIGNsYXNzCiAgICBteSAkQWxsU3RhdGVzQXJyYXlIYXNoUmVmID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgQ2xhc3MgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBBZGQgdGhlIHNwZWNpYWwgZmluYWwgc3RhdGUKICAgIHB1c2ggQHskQWxsU3RhdGVzQXJyYXlIYXNoUmVmfSwgeyBLZXkgPT4gJzAnLCBWYWx1ZSA9PiAnKlNUQVJUKicgfTsKCiAgICAjIGRyb3Bkb3duIG1lbnUsIHdoZXJlIHRoZSBzdGF0ZSBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFkZGl0aW9uCiAgICAkUGFyYW17U3RhdGVTZWxlY3Rpb25TdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJEFsbFN0YXRlc0FycmF5SGFzaFJlZiwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgICMgZHJvcGRvd24gbWVudSwgd2hlcmUgdGhlIG5leHQgc3RhdGUgY2FuIGJlIHNlbGVjdGVkIGZvciBhZGRpdGlvbgogICAgJEFsbFN0YXRlc0FycmF5SGFzaFJlZi0+Wy0xXSA9IHsgS2V5ID0+ICcwJywgVmFsdWUgPT4gJypFTkQqJyB9OwogICAgJFBhcmFte05leHRTdGF0ZVNlbGVjdGlvblN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkQWxsU3RhdGVzQXJyYXlIYXNoUmVmLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU3RhdGVUcmFuc2l0aW9uQWRkJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkUGFyYW17Tm90ZX0gfHwgJyc7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCiMgcHJvdmlkZSBhIGZvcm0gZm9yIGNvbmZpcm1pbmcgdGhlIGRlbGV0aW9uIG9mIGEgc3RhdGUgdHJhbnNpdGlvbgpzdWIgX1N0YXRlVHJhbnNpdGlvbkRlbGV0ZVBhZ2VHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRQYXJhbXtTdGF0ZU5hbWV9ID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZUxvb2t1cCgKICAgICAgICBDbGFzcyAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgU3RhdGVJRCA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICApIHx8ICcqU1RBUlQqJzsKCiAgICAkUGFyYW17TmV4dFN0YXRlTmFtZX0gPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlTG9va3VwKAogICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICApIHx8ICcqRU5EKic7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTdGF0ZVRyYW5zaXRpb25EZWxldGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBIVE1MCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRQYXJhbXtOb3RlfSB8fCAnJzsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbklUU01TdGF0ZU1hY2hpbmUnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKIyBTaG93IGEgdGFibGUgb2YgYWxsIHN0YXRlIHRyYW5zaXRpb25zCnN1YiBfT3ZlcnZpZXdTdGF0ZVRyYW5zaXRpb25zUGFnZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1N0YXRlVHJhbnNpdGlvbnMnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBsb29rdXAgZm9yIHN0YXRlIG5hbWVzCiAgICBteSAkQ3NzQ2xhc3MgPSAnc2VhcmNoYWN0aXZlJzsKICAgIG15ICVOZXh0U3RhdGVJRHMKICAgICAgICA9ICV7ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uTGlzdCggQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSApIHx8IHt9IH07CgogICAgIyBsb29wIG92ZXIgYWxsICdTdGF0ZScgYW5kICdOZXh0U3RhdGUnIHBhaXJzIGZvciB0aGUgY2F0YWxvZyBjbGFzcwogICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICVOZXh0U3RhdGVJRHMgKSB7CgogICAgICAgIGZvciBteSAkTmV4dFN0YXRlSUQgKCBAeyAkTmV4dFN0YXRlSURzeyRTdGF0ZUlEfSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJyA/ICdzZWFyY2hwYXNzaXZlJyA6ICdzZWFyY2hhY3RpdmUnOwoKICAgICAgICAgICAgIyBzdGF0ZSBuYW1lcwogICAgICAgICAgICBteSAkU3RhdGVOYW1lID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICkgfHwgJypTVEFSVConOwogICAgICAgICAgICBteSAkTmV4dFN0YXRlTmFtZSA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgICAgICAgICBTdGF0ZUlEID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgKSB8fCAnKkVORConOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlVHJhbnNpdGlvblJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgICAgICA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgICAgICAgICBTdGF0ZU5hbWUgICAgID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgICA9PiAkTmV4dFN0YXRlSUQsCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlTmFtZSA9PiAkTmV4dFN0YXRlTmFtZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG9ubHkgc2hvdyB0aGUgZGVsZXRlIGxpbmsgaWYgaXQgaXMgbm90IHRoZSBzdGFydCBzdGF0ZQogICAgICAgICAgICBpZiAoICRTdGF0ZU5hbWUgbmUgJypTVEFSVConICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZVRyYW5zaXRpb25EZWxldGVCdXR0b24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzICAgICAgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU5hbWUgICAgID0+ICRTdGF0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEICAgPT4gJE5leHRTdGF0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBOZXh0U3RhdGVOYW1lID0+ICROZXh0U3RhdGVOYW1lLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkUGFyYW17Tm90ZX0gfHwgJyc7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCiMgU2hvdyBhIGxpc3Qgb2YgcmVsZXZhbnQgb2JqZWN0IHR5cGVzCnN1YiBfT3ZlcnZpZXdDbGFzc2VzUGFnZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3NlcycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkQ3NzQ2xhc3MgPSAnc2VhcmNoYWN0aXZlJzsKICAgIGZvciBteSAkQ2xhc3MgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntDb25maWdCeUNsYXNzfSB9ICkgewogICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJyA/ICdzZWFyY2hwYXNzaXZlJyA6ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3Nlc1JvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ3NzQ2xhc3MgICAgICAgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgQ2xhc3NTaG9ydE5hbWUgPT4gJFNlbGYtPntDb25maWdCeUNsYXNzfS0+eyRDbGFzc30tPntOYW1lfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkUGFyYW17Tm90ZX0gfHwgJyc7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNU3RhdGVNYWNoaW5lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNBQk1lbWJlclNlYXJjaC5wbSAtIGEgbW9kdWxlIHVzZWQgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ0FCTWVtYmVyU2VhcmNoLnBtLHYgMS4xMSAyMDEwLzA1LzExIDE1OjIxOjI2IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ0FCTWVtYmVyU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBhbGwgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEpTT04gPSAnJzsKCiAgICAjIHNlYXJjaCBmb3IgcG9zc2libGUgQ0FCIG1lbWJlcnMKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIHBhcmFtcwogICAgICAgIG15ICRTZWFyY2ggPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2gnICkgfHwgJyc7CiAgICAgICAgbXkgJEdyb3VwcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0dyb3VwcycgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgYWxsIG1lbWJlcnMgb2YgdGhlIGdyb3VwcwogICAgICAgIG15ICVHcm91cFVzZXJzOwogICAgICAgIGlmICgkR3JvdXBzKSB7CiAgICAgICAgICAgIG15IEBHcm91cE5hbWVzID0gc3BsaXQgLyxccysvLCAkR3JvdXBzOwoKICAgICAgICAgICAgZm9yIG15ICRHcm91cE5hbWUgKEBHcm91cE5hbWVzKSB7CiAgICAgICAgICAgICAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgICAgICAgICAgICAgbXkgJVVzZXJzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15IEBVc2VySURzID0ga2V5cyAlVXNlcnM7CiAgICAgICAgICAgICAgICBAR3JvdXBVc2Vyc3tAVXNlcklEc30gPSBAVXNlcklEczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB3b3JrYXJvdW5kLCBhbGwgYXV0byBjb21wbGV0aW9uIHJlcXVlc3RzIGdldCBwb3N0ZWQgYnkgdXRmOCBhbnl3YXkKICAgICAgICAjIGNvbnZlcnQgYW55IHRvIDhiaXQgc3RyaW5nIGlmIGFwcGxpY2F0aW9uIGlzIG5vdCBydW5uaW5nIGluIHV0ZjgKICAgICAgICBpZiAoICEkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZUludGVybmFsVXNlZCgpICkgewogICAgICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntFbmNvZGVPYmplY3R9LT5Db252ZXJ0KAogICAgICAgICAgICAgICAgVGV4dCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgICAgICAgICAgICAgVG8gICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhZ2VudCBsaXN0CiAgICAgICAgbXkgJVVzZXJMaXN0ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgVXNlclNlYXJjaCgpIHJldHVybnMgdmFsdWVzIHdpdGggYSB0cmFpbGluZyBzcGFjZSwgZ2V0IHJpZCBvZiBpdAogICAgICAgIGZvciBteSAkTmFtZSAoIHZhbHVlcyAlVXNlckxpc3QgKSB7CiAgICAgICAgICAgICROYW1lID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgfQoKICAgICAgICAjIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IGFzIHJlc3BvbnNlCiAgICAgICAgbXkgQERhdGE7CgogICAgICAgIFVTRVJJRDoKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQgeyAkVXNlckxpc3R7JGF9IGNtcCAkVXNlckxpc3R7JGJ9IH0ga2V5cyAlVXNlckxpc3QgKSB7CgogICAgICAgICAgICAjIGlmIGdyb3VwcyBhcmUgcmVxdWlyZWQgYW5kIHVzZXIgaXMgbm90IG1lbWJlciBvZiBvbmUgb2YgdGhlIGdyb3VwcwogICAgICAgICAgICAjIHRoZSBza2lwIHRoZSB1c2VyCiAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICRHcm91cHMgJiYgISRHcm91cFVzZXJzeyRVc2VySUR9OwoKICAgICAgICAgICAgIyBUaGUgdmFsdWVzIGluICVVc2VyTGlzdCBhcmUgaW4gdGhlIGZvcm06ICdtbSBNYXggTXVzdGVybWFubicuCiAgICAgICAgICAgICMgU28gYXNzZW1ibGUgYSBuZWF0ZXIgc3RyaW5nIGZvciBkaXNwbGF5LgogICAgICAgICAgICAjIChBY3R1YWxseSBVc2VyU2VhcmNoKCkgY29udGFpbnMgY29kZSBmb3IgZm9ybWF0aW5nLCBidXQgdGhhdCBpcyB1c3VhbGx5IG5vdCBjYWxsZWQuKQogICAgICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gJFBhcmFte1ZhbGlkfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFVzZXJWYWx1ZVBsYWluID0gc3ByaW50ZiAnIiVzICVzIiA8JXM+JywKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJFbWFpbH07CgogICAgICAgICAgICAjIGh0bWwgcXVvdGUgY2hhcmFjdGVycyBsaWtlIDw+CiAgICAgICAgICAgIG15ICRVc2VyVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRVc2VyVmFsdWVQbGFpbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgICAgIFVzZXJLZXkgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBVc2VyVmFsdWUgICAgICA9PiAkVXNlclZhbHVlLAogICAgICAgICAgICAgICAgVXNlclZhbHVlUGxhaW4gPT4gJFVzZXJWYWx1ZVBsYWluLAogICAgICAgICAgICAgICAgVXNlclR5cGUgICAgICAgPT4gJ0NBQkFnZW50cycsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXN0b21lciBsaXN0CiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgQ1VTVE9NRVJVU0VSTE9HSU46CiAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJMb2dpbiAoCiAgICAgICAgICAgIHNvcnQgeyAkQ3VzdG9tZXJVc2VyTGlzdHskYX0gY21wICRDdXN0b21lclVzZXJMaXN0eyRifSB9CiAgICAgICAgICAgIGtleXMgJUN1c3RvbWVyVXNlckxpc3QKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgaWYgZ3JvdXBzIGFyZSByZXF1aXJlZCBhbmQgdXNlciBpcyBub3QgbWVtYmVyIG9mIG9uZSBvZiB0aGUgZ3JvdXBzCiAgICAgICAgICAgICMgdGhlIHNraXAgdGhlIHVzZXIKICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgJEdyb3VwcyAmJiAhJEdyb3VwVXNlcnN7JEN1c3RvbWVyVXNlckxvZ2lufTsKCiAgICAgICAgICAgICMgaHRtbCBxdW90ZSBjaGFyYWN0ZXJzIGxpa2UgPD4KICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlclZhbHVlUGxhaW4gPSAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyTG9naW59OwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyTG9naW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICAgICAgVXNlcktleSAgICAgICAgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgVXNlclZhbHVlICAgICAgPT4gJEN1c3RvbWVyVXNlckxpc3R7JEN1c3RvbWVyVXNlckxvZ2lufSwKICAgICAgICAgICAgICAgIFVzZXJWYWx1ZVBsYWluID0+ICRDdXN0b21lclVzZXJWYWx1ZVBsYWluLAogICAgICAgICAgICAgICAgVXNlclR5cGUgICAgICAgPT4gJ0NBQkN1c3RvbWVycycsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT04oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFJlc3VsdHMgPT4gXEBEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZS5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IGNoYW5nZSBvdmVydmlldyBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZS5wbSx2IDEuMjkgMjAxMC8wMS8yNyAxMDowMTowMyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCBmaWx0ZXIgYW5kIHZpZXcgcGFyYW1zCiAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWaWV3JyApICAgfHwgJyc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbiwgdXNlZCBmb3IgYmFja2xpbmtzCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5DaGFuZ2VzJywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIGdldCBzb3J0aW5nIHBhcmFtZXRlcnMKICAgIG15ICRTb3J0QnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnQ2hhbmdlTnVtYmVyJzsKCiAgICAjIGdldCBvcmRlcmluZyBwYXJhbWV0ZXJzCiAgICBteSAkT3JkZXJCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnT3JkZXI6OkRlZmF1bHQnfQogICAgICAgIHx8ICdVcCc7CgogICAgbXkgQFNvcnRCeUFycmF5ICA9ICgkU29ydEJ5KTsKICAgIG15IEBPcmRlckJ5QXJyYXkgPSAoJE9yZGVyQnkpOwoKICAgICMgaW52ZXN0aWdhdGUgcmVmcmVzaAogICAgbXkgJFJlZnJlc2ggPSAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gPyA2MCAqICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA6IHVuZGVmOwoKICAgICMgc3RhcnRpbmcgd2l0aCBwYWdlIC4uLgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBSZWZyZXNoID0+ICRSZWZyZXNoICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0ICk7CiAgICAkT3V0cHV0ID0gJyc7CgogICAgIyBmaW5kIG91dCB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBzaG93bgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnCiAgICAgICAgbXkgJVBvc3NpYmxlQ29sdW1uID0gJXsgJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9IH07CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICBAU2hvd0NvbHVtbnMgPSBncmVwIHsgJFBvc3NpYmxlQ29sdW1ueyRffSB9IGtleXMgJVBvc3NpYmxlQ29sdW1uOwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRV9TVEFURToKICAgICAgICBmb3IgbXkgJENoYW5nZVN0YXRlICggQHsgJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBlbXB0eSBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFX1NUQVRFIGlmICEkQ2hhbmdlU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBpbnZhbGlkIGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VfU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgd2l0aCBwYXJhbXMgZm9yIHRoZSBzZWFyY2ggbWV0aG9kCiAgICAgICAgICAgICRGaWx0ZXJzeyRDaGFuZ2VTdGF0ZX0gPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICAgICAgUHJpbyAgID0+ICRQcmlvQ291bnRlciwKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiBbJENoYW5nZVN0YXRlXSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIG9ubHkgb25lIGZpbHRlciBleGlzdHMKICAgIGlmICggc2NhbGFyIGtleXMgJUZpbHRlcnMgPT0gMSApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIG9ubHkgZmlsdGVyCiAgICAgICAgbXkgKCRGaWx0ZXJOYW1lKSA9IGtleXMgJUZpbHRlcnM7CgogICAgICAgICMgYWN0aXZhdGUgdGhpcyBmaWx0ZXIKICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkRmlsdGVyTmFtZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGFkZCBkZWZhdWx0IGZpbHRlciwgd2hpY2ggc2hvd3MgYWxsIGl0ZW1zCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgZmlsdGVyIGlzIHZhbGlkCiAgICBpZiAoICEkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJJbnZhbGlkIEZpbHRlcjogJFNlbGYtPntGaWx0ZXJ9ISIgKTsKICAgIH0KCiAgICAjIHNlYXJjaCBjaGFuZ2VzIHdoaWNoIG1hdGNoIHRoZSBzZWxlY3RlZCBmaWx0ZXIKICAgIG15ICRJRHNSZWYgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAleyAkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0tPntTZWFyY2h9IH0sCiAgICApOwoKICAgICMgZGlzcGxheSBhbGwgbmF2YmFyIGZpbHRlcnMKICAgIG15ICVOYXZCYXJGaWx0ZXI7CiAgICBmb3IgbXkgJEZpbHRlciAoIGtleXMgJUZpbHRlcnMgKSB7CgogICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNob3cgdGhlIGxpc3QKICAgIG15ICRMaW5rUGFnZSA9CiAgICAgICAgJ0ZpbHRlcj0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmU29ydEJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnJk9yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua1NvcnQgPQogICAgICAgICdGaWx0ZXI9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua0ZpbHRlciA9CiAgICAgICAgJ1NvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJyZPcmRlckJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNoYW5nZUxpc3RTaG93KAogICAgICAgIENoYW5nZUlEcyA9PiAkSURzUmVmLAogICAgICAgIFRvdGFsICAgICA9PiBzY2FsYXIgQHskSURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnT3ZlcnZpZXcnKQogICAgICAgICAgICAuICc6ICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSVRTTSBDaGFuZ2UnKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0tPntOYW1lfSwKCiAgICAgICAgRW52ICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ID0+ICRMaW5rU29ydCwKCiAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKICAgICk7CgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUFkZC5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IGNoYW5nZSBhZGQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VBZGQucG0sdiAxLjY1IDIwMTAvMDYvMjkgMTM6MzY6NDAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VBZGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUtPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGhlIGFkZCBtYXNrCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KAogICAgICAgIENoYW5nZVRpdGxlIERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24gVGlja2V0SUQKICAgICAgICBPbGRDYXRlZ29yeUlEIENhdGVnb3J5SUQgT2xkSW1wYWN0SUQgSW1wYWN0SUQgT2xkUHJpb3JpdHlJRCBQcmlvcml0eUlECiAgICAgICAgRWxlbWVudENoYW5nZWQKICAgICAgICBTYXZlQXR0YWNobWVudCBGaWxlSUQKICAgICAgICBNb3ZlVGltZVR5cGUgTW92ZVRpbWVZZWFyIE1vdmVUaW1lTW9udGggTW92ZVRpbWVEYXkgTW92ZVRpbWVIb3VyCiAgICAgICAgTW92ZVRpbWVNaW51dGUgVGVtcGxhdGVJRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlndXJlZCBjaGFuZ2UgZnJlZXRleHQgZmllbGQgbnVtYmVycwogICAgbXkgQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0Q29uZmlndXJlZEZyZWVUZXh0RmllbGRzKCk7CgogICAgIyBnZXQgY2hhbmdlIGZyZWV0ZXh0IHBhcmFtcwogICAgbXkgJUNoYW5nZUZyZWVUZXh0UGFyYW07CiAgICBOVU1CRVI6CiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICAjIGNvbnNpZGVyIG9ubHkgZnJlZXRleHQgZmllbGRzIHdoaWNoIGFyZSBhY3RpdmF0ZWQgaW4gdGhpcyBmcm9udGVuZAogICAgICAgIG5leHQgTlVNQkVSIGlmICEkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VGcmVlVGV4dH0tPnskTnVtYmVyfTsKCiAgICAgICAgbXkgJEtleSAgID0gJ0NoYW5nZUZyZWVLZXknIC4gJE51bWJlcjsKICAgICAgICBteSAkVmFsdWUgPSAnQ2hhbmdlRnJlZVRleHQnIC4gJE51bWJlcjsKCiAgICAgICAgJENoYW5nZUZyZWVUZXh0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRDaGFuZ2VGcmVlVGV4dFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgfQoKICAgICMgc3RvcmUgdGltZSByZWxhdGVkIGZpZWxkcyBpbiAlR2V0UGFyYW0KICAgIFRJTUVfVFlQRToKICAgIGZvciBteSAkVGltZVR5cGUgKHF3KFJlcXVlc3RlZFRpbWUgTW92ZVRpbWUpKSB7CgogICAgICAgICMgc2tpcCB0aGUgcmVxdWVzdGVkIHRpbWUgaWYgbm90IGNvbmZpZ3VyZWQKICAgICAgICBuZXh0IFRJTUVfVFlQRSBpZiAoICRUaW1lVHlwZSBlcSAnUmVxdWVzdGVkVGltZScgJiYgISRTZWxmLT57Q29uZmlnfS0+e1JlcXVlc3RlZFRpbWV9ICk7CgogICAgICAgIGZvciBteSAkVGltZVBhcnQgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG15ICRQYXJhbU5hbWUgPSAkVGltZVR5cGUgLiAkVGltZVBhcnQ7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciBjYXRlZ29yeQogICAgJFBhcmFte0NhdGVnb3J5SUR9ID0gJEdldFBhcmFte0NhdGVnb3J5SUR9OwogICAgaWYgKCAhJFBhcmFte0NhdGVnb3J5SUR9ICkgewogICAgICAgIG15ICREZWZhdWx0Q2F0ZWdvcnkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6Q2F0ZWdvcnk6OkRlZmF1bHQnKTsKICAgICAgICAkUGFyYW17Q2F0ZWdvcnlJRH0gPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgQ0lQICA9PiAkRGVmYXVsdENhdGVnb3J5LAogICAgICAgICAgICBUeXBlID0+ICdDYXRlZ29yeScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciBpbXBhY3QKICAgICRQYXJhbXtJbXBhY3RJRH0gPSAkR2V0UGFyYW17SW1wYWN0SUR9OwogICAgaWYgKCAhJFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICBteSAkRGVmYXVsdEltcGFjdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpJbXBhY3Q6OkRlZmF1bHQnKTsKICAgICAgICAkUGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgICAgIENJUCAgPT4gJERlZmF1bHRJbXBhY3QsCiAgICAgICAgICAgIFR5cGUgPT4gJ0ltcGFjdCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFJlbWVtYmVyIHRoZSByZWFzb24gd2h5IHNhdmluZyB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGVudHJpZXMgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHRsIHZhbGlkYXRpb24gZXJyb3IgYmxvY2tzLgogICAgbXkgQFZhbGlkYXRpb25FcnJvcnM7CgogICAgIyByZW1lbWJlciB0aGUgbnVtYmVycyBvZiB0aGUgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyB3aXRoIHZhbGlkYXRpb24gZXJyb3JzCiAgICBteSAlQ2hhbmdlRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgZ2V0IG1ldGEgZGF0YSBmb3IgYWxsIGFscmVhZHkgdXBsb2FkZWQgZmlsZXMKICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyByZXNldCBzdWJhY3Rpb24KICAgICMgaWYgYXR0YWNobWVudCB1cGxvYWQgaXMgcmVxdWVzdGVkCiAgICBpZiAoICRHZXRQYXJhbXtTYXZlQXR0YWNobWVudH0gKSB7CgogICAgICAgICMgZ2V0IHVwbG9hZCBkYXRhCiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gID0+ICdBdHRhY2htZW50TmV3JywKICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgZmlsZSB3YXMgYWxyZWFkeSB1cGxvYWRlZAogICAgICAgIG15ICRGaWxlQWxyZWFkeVVwbG9hZGVkID0gMDsKICAgICAgICBmb3IgbXkgJEZpbGVNZXRhRGF0YSAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgIGlmICggJEZpbGVNZXRhRGF0YS0+e0ZpbGVuYW1lfSBlcSAkVXBsb2FkU3R1ZmZ7RmlsZW5hbWV9ICkgewogICAgICAgICAgICAgICAgJEZpbGVBbHJlYWR5VXBsb2FkZWQgPSAxOwoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnRmlsZUFscmVhZHlVcGxvYWRlZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRGaWxlQWxyZWFkeVVwbG9hZGVkICkgewogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBhdHRhY2htZW50IGxpc3QsIGFzIGFuIGF0dGFjaG1lbnQgd2FzIGFkZGVkCiAgICAgICAgICAgIEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntTdWJhY3Rpb259ID0gJ1NhdmVBdHRhY2htZW50JzsKICAgIH0KCiAgICAjIHJlc2V0IHN1YmFjdGlvbgogICAgIyBpZiBhdHRhY2htZW50IHNob3VsZCBiZSBkZWxldGVkCiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlQXR0YWNobWVudCcgLiAkQXR0YWNobWVudC0+e0ZpbGVJRH0gKSApCiAgICAgICAgewoKICAgICAgICAgICAgIyBkZWxldGUgYXR0YWNobWVudAogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJEF0dGFjaG1lbnQtPntGaWxlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgbWFya2VyIHRoYXQgdGhlIGF0dGFjaG1lbnQgbGlzdCBuZWVkcyB0byBiZSByZWxvYWRlZAogICAgICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gPSAnRGVsZXRlQXR0YWNobWVudCc7CiAgICAgICAgfQogICAgfQoKICAgICMgdGhlIFRpY2tldElEIGNhbiBiZSB2YWxpZGF0ZWQgZXZlbiB3aXRob3V0IHRoZSBTdWJhY3Rpb24gJ1NhdmUnLAogICAgIyBhcyBpdCBpcyBwYXNzZWQgYXMgR0VULXBhcmFtIG9yIGluIGEgaGlkZGVuIGZpZWxkLgogICAgaWYgKCAkR2V0UGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJEdldFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRpY2tldCBleGlzdHMKICAgICAgICBpZiAoICElVGlja2V0ICkgewoKICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJUaWNrZXQgd2l0aCBUaWNrZXRJRCAkR2V0UGFyYW17VGlja2V0SUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3Qgb2YgcmVsZXZhbnQgdGlja2V0IHR5cGVzCiAgICAgICAgbXkgJEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlcwogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnKTsKCiAgICAgICAgIyBjaGVjayB0aGUgbGlzdCBvZiByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzCiAgICAgICAgICAgIHx8IHJlZiAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIG5lICdBUlJBWScKICAgICAgICAgICAgfHwgIUB7JEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlc30KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2V0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAiTWlzc2luZyBzeXNjb25maWcgb3B0aW9uICdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnISI7CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVsZXZhbnQgdGlja2V0IHR5cGVzCiAgICAgICAgbXkgJUlzUmVsZXZhbnQgPSBtYXAgeyAkXyA9PiAxIH0gQHskQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzfTsKCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSB0aWNrZXQncyB0eXBlIGlzIHJlbGV2YW50CiAgICAgICAgaWYgKCAhJElzUmVsZXZhbnR7ICRUaWNrZXR7VHlwZX0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgbXkgJE1lc3NhZ2UKICAgICAgICAgICAgICAgID0gIkludmFsaWQgdGlja2V0IHR5cGUgJyRUaWNrZXR7VHlwZX0nIGZvciBkaXJlY3RseSBsaW5raW5nIGEgdGlja2V0IHdpdGggYSBjaGFuZ2UuICIKICAgICAgICAgICAgICAgIC4gJ09ubHkgdGhlIGZvbGxvd2luZyB0aWNrZXQgdHlwZShzKSBhcmUgYWxsb3dlZCBmb3IgdGhpcyBvcGVyYXRpb246ICcKICAgICAgICAgICAgICAgIC4gam9pbiAnLCcsIEB7JEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlc307CgogICAgICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHBlcmZvcm0gdGhlIGFkZGluZwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIHRoZSB0aXRsZSBpcyByZXF1aXJlZAogICAgICAgIGlmICggISRHZXRQYXJhbXtDaGFuZ2VUaXRsZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkVGl0bGUnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBDSVAKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5IEltcGFjdCBQcmlvcml0eSkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyIke1R5cGV9SUQifSB8fCAkR2V0UGFyYW17IiR7VHlwZX1JRCJ9ICF+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWQnIC4gJFR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkQ0lQSXNWYWxpZCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgIElEICAgPT4gJEdldFBhcmFteyIke1R5cGV9SUQifSwKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkQ0lQSXNWYWxpZCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZCcgLiAkVHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgcmVxdWVzdGVkIHRpbWUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVlc3RlZFRpbWV9ICYmICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lVXNlZH0gKSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZVllYXJ9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVxdWVzdGVkVGltZU1vbnRofQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVEYXl9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lSG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGZvcm1hdCBhcyB0aW1lc3RhbXAsIHdoZW4gYWxsIHJlcXVpcmVkIHRpbWUgcGFyYW0gd2VyZSBwYXNzZWQKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lfSA9IHNwcmludGYgJyUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCcsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVZZWFyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZU1vbnRofSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZU1pbnV0ZX07CgogICAgICAgICAgICAgICAgIyBzYW5pdHkgY2hlY2sgb2YgdGhlIGFzc2VtYmxlZCB0aW1lc3RhbXAKICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBkbyBub3Qgc2F2ZSB3aGVuIHRpbWUgaXMgaW52YWxpZAogICAgICAgICAgICAgICAgaWYgKCAhJFN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRSZXF1ZXN0ZWRUaW1lJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGl0IHdhcyBpbmRpY2F0ZWQgdGhhdCB0aGUgcmVxdWVzdGVkIHRpbWUgc2hvdWxkIGJlIHNldCwKICAgICAgICAgICAgICAgICMgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGUgcmVxdWlyZWQgdGltZSBwYXJhbXMgaXMgbWlzc2luZwogICAgICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRSZXF1ZXN0ZWRUaW1lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgcmVxdWlyZWQgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcykgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VGcmVlVGV4dH0tPnskTnVtYmVyfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57Q2hhbmdlRnJlZVRleHR9LT57JE51bWJlcn0gPT0gMgogICAgICAgICAgICAgICAgJiYgJENoYW5nZUZyZWVUZXh0UGFyYW17ICdDaGFuZ2VGcmVlVGV4dCcgLiAkTnVtYmVyIH0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhlIGNoYW5nZSBmcmVldGV4dCBmaWVsZCBudW1iZXIgd2l0aCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgJENoYW5nZUZyZWVUZXh0VmFsaWRhdGlvbkVycm9yc3skTnVtYmVyfSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIGlucHV0IHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgaWYgKCAhQFZhbGlkYXRpb25FcnJvcnMgJiYgISVDaGFuZ2VGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnMgKSB7CiAgICAgICAgICAgIG15ICVBZGRpdGlvbmFsUGFyYW07CgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVlc3RlZFRpbWV9ICkgewogICAgICAgICAgICAgICAgJEFkZGl0aW9uYWxQYXJhbXtSZXF1ZXN0ZWRUaW1lfSA9ICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICRHZXRQYXJhbXtKdXN0aWZpY2F0aW9ufSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJEdldFBhcmFte0NoYW5nZVRpdGxlfSwKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICAgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgICAgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICVBZGRpdGlvbmFsUGFyYW0sCiAgICAgICAgICAgICAgICAlQ2hhbmdlRnJlZVRleHRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIGlmICgkQ2hhbmdlSUQpIHsKCiAgICAgICAgICAgICAgICAjIGlmIHRoZSBjaGFuZ2UgYWRkIG1hc2sgd2FzIGNhbGxlZCBmcm9tIHRoZSB0aWNrZXQgem9vbQogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGxpbmsgdGlja2V0IHdpdGggbmV3bHkgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICBteSAkTGlua1N1Y2Nlc3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgbGluayBjb3VsZCBub3QgYmUgYWRkZWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGlua1N1Y2Nlc3MgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlID0gIkNoYW5nZSB3aXRoIENoYW5nZUlEICRDaGFuZ2VJRCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJidXQgYSBsaW5rIHRvIFRpY2tldCB3aXRoIFRpY2tldElEICRHZXRQYXJhbXtUaWNrZXRJRH0gY291bGQgbm90IGJlIGNyZWF0ZWQhIjsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgbW92ZSBhdHRhY2htZW50cyBmcm9tIGNhY2hlIHRvIHZpcnR1YWwgZnMKICAgICAgICAgICAgICAgIG15IEBDYWNoZWRBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRDYWNoZWRBdHRhY2htZW50IChAQ2FjaGVkQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQ2FjaGVkQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIGZpbGUgZnJvbSBjYWNoZSBpZiBtb3ZlIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ2FjaGVkQXR0YWNobWVudC0+e0ZpbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2Fubm90IG1vdmUgRmlsZSBmcm9tIENhY2hlIHRvIFZpcnR1YWxGUycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIoJHskQ2FjaGVkQXR0YWNobWVudH17RmlsZW5hbWV9KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gem9vbSBtYXNrIG9mIHRoZSBuZXcgY2hhbmdlLCB3aGVuIGFkZGluZyB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tJkNoYW5nZUlEPSRDaGFuZ2VJRCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIGFkZGluZyBmYWlsZWQKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ1dhcyBub3QgYWJsZSB0byBhZGQgY2hhbmdlIScsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGNoYW5nZSBmcm9tIHRlbXBsYXRlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlRnJvbVRlbXBsYXRlJyApIHsKCiAgICAgICAgbXkgJE5ld1RpbWU7CgogICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIHRpbWUgdHlwZQogICAgICAgIG15ICRNb3ZlVGltZVR5cGUgPSAkR2V0UGFyYW17TW92ZVRpbWVUeXBlfTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICFkZWZpbmVkICRNb3ZlVGltZVR5cGUKICAgICAgICAgICAgfHwgKCAkTW92ZVRpbWVUeXBlIG5lICdQbGFubmVkU3RhcnRUaW1lJyAmJiAkTW92ZVRpbWVUeXBlIG5lICdQbGFubmVkRW5kVGltZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFRpbWVUeXBlJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIGNvbXBsZXRlbmVzcyBvZiB0aGUgdGltZSBwYXJhbWV0ZXIgbGlzdCwKICAgICAgICAjIG9ubHkgaG91ciBhbmQgbWludXRlIGFyZSBhbGxvd2VkIHRvIGJlICcwJwogICAgICAgIGlmICgKICAgICAgICAgICAgISRHZXRQYXJhbXtNb3ZlVGltZVllYXJ9CiAgICAgICAgICAgIHx8ICEkR2V0UGFyYW17TW92ZVRpbWVNb250aH0KICAgICAgICAgICAgfHwgISRHZXRQYXJhbXtNb3ZlVGltZURheX0KICAgICAgICAgICAgfHwgIWRlZmluZWQgJEdldFBhcmFte01vdmVUaW1lSG91cn0KICAgICAgICAgICAgfHwgIWRlZmluZWQgJEdldFBhcmFte01vdmVUaW1lTWludXRlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZE1vdmVUaW1lJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBzeXN0ZW0gdGltZSBmcm9tIHRoZSBpbnB1dCwgaWYgaXQgY2FuJ3QgYmUgZGV0ZXJtaW5lZCB3ZSBoYXZlIGEgdmFsaWRhdGlvbiBlcnJvcgogICAgICAgIGlmICggIUBWYWxpZGF0aW9uRXJyb3JzICkgewoKICAgICAgICAgICAgIyBmb3JtYXQgYXMgdGltZXN0YW1wCiAgICAgICAgICAgIG15ICRQbGFubmVkVGltZSA9IHNwcmludGYgJyUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCcsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVZZWFyfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZU1vbnRofSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZURheX0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVIb3VyfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZU1pbnV0ZX07CgogICAgICAgICAgICAjIHNhbml0eSBjaGVjayBvZiB0aGUgYXNzZW1ibGVkIHRpbWVzdGFtcAogICAgICAgICAgICAkTmV3VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQbGFubmVkVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISROZXdUaW1lICkgewogICAgICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRNb3ZlVGltZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgd2hldGhlciBhIHRlbXBsYXRlIHdhcyBzZWxlY3RlZAogICAgICAgIGlmICggISRHZXRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRUZW1wbGF0ZSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICFAVmFsaWRhdGlvbkVycm9ycyApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGNoYW5nZSBiYXNlZCBvbiB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlRGVTZXJpYWxpemUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICksCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTmV3VGltZUluRXBvY2hlID0+ICROZXdUaW1lLAogICAgICAgICAgICAgICAgTW92ZVRpbWVUeXBlICAgID0+ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGFuZ2UgY291bGQgbm90IGJlIGNyZWF0ZWQKICAgICAgICAgICAgaWYgKCAhJENoYW5nZUlEICkgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIGFkZGluZyBmYWlsZWQKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ1dhcyBub3QgYWJsZSB0byBjcmVhdGUgY2hhbmdlIGZyb20gdGVtcGxhdGUhJywKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgdGhlIGNoYW5nZSBhZGQgbWFzayB3YXMgY2FsbGVkIGZyb20gdGhlIHRpY2tldCB6b29tCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgICAgICAgICAjIGxpbmsgdGlja2V0IHdpdGggbmV3bHkgY3JlYXRlZCBjaGFuZ2UKICAgICAgICAgICAgICAgIG15ICRMaW5rU3VjY2VzcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBsaW5rIGNvdWxkIG5vdCBiZSBhZGRlZAogICAgICAgICAgICAgICAgaWYgKCAhJExpbmtTdWNjZXNzICkgewoKICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAiQ2hhbmdlIHdpdGggQ2hhbmdlSUQgJENoYW5nZUlEIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQsICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiYnV0IGEgbGluayB0byBUaWNrZXQgd2l0aCBUaWNrZXRJRCAkR2V0UGFyYW17VGlja2V0SUR9IGNvdWxkIG5vdCBiZSBjcmVhdGVkISI7CgogICAgICAgICAgICAgICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gem9vbSBtYXNrLCB3aGVuIGFkZGluZyB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbSZDaGFuZ2VJRD0kQ2hhbmdlSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBzYXZlIGF0dGFjaG1lbnQgc3ViYWN0aW9uCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZUF0dGFjaG1lbnQnICkgewoKICAgICAgICAjIG5vdGhpbmcgdG8gZG8KICAgICAgICAjIGF0dGFjaG1lbnRzIHdlcmUgYWxyZWFkeSBzYXZlZCBhYm92ZQogICAgfQoKICAgICMgaGFuZGxlIGF0dGFjaG1lbnQgZGVsZXRpb24KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGVBdHRhY2htZW50JyApIHsKCiAgICAgICAgIyByZWxvYWQgdGhlIGF0dGFjaG1lbnQgbGlzdCwKICAgICAgICAjIGFzIGF0IGxlYXN0IG9uZSBhdHRhY2htZW50IHdhcyBkZWxldGVkIGFib3ZlCiAgICAgICAgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaGFuZGxlIGF0dGFjaG1lbnQgZG93bmxvYWRzCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWRBdHRhY2htZW50JyApIHsKCiAgICAgICAgIyBnZXQgbWV0YS1kYXRhIGFuZCBjb250ZW50IG9mIHRoZSBjYWNoZWQgYXR0YWNobWVudHMKICAgICAgICBteSBAQ2FjaGVkQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRhdGEgZm9yIHJlcXVlc3RlZCBhdHRhY2htZW50CiAgICAgICAgbXkgKCRBdHRhY2htZW50RGF0YSkgPSBncmVwIHsgJF8tPntGaWxlSUR9ID09ICRHZXRQYXJhbXtGaWxlSUR9IH0gQENhY2hlZEF0dGFjaG1lbnRzOwoKICAgICAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgKCRHZXRQYXJhbXtGaWxlSUR9KSEgTWF5IGJlIGFuIGF0dGFjayEhISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgJXskQXR0YWNobWVudERhdGF9LAogICAgICAgICAgICBUeXBlID0+ICdhdHRhY2htZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgaGFuZGxlIEFKQVhVcGRhdGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgIyBnZXQgcHJpb3JpdGllcwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICAgICAgVHlwZSAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VsZWN0ZWQgcHJpb3JpdHkKICAgICAgICBteSAkU2VsZWN0ZWRQcmlvcml0eSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBJbXBhY3RJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBqc29uCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2VsZWN0ZWRQcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4ganNvbgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCB0ZW1wbGF0ZSBkcm9wZG93bgogICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQ29tbWVudExlbmd0aCA9PiAxNSwKICAgICAgICBUZW1wbGF0ZVR5cGUgID0+ICdJVFNNQ2hhbmdlJywKICAgICk7CiAgICBteSAkVGVtcGxhdGVTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgICA9PiAnVGVtcGxhdGVJRCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRUZW1wbGF0ZUxpc3QsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgICMgYnVpbGQgZHJvcC1kb3duIHdpdGggdGltZSB0eXBlcwogICAgbXkgJE1vdmVUaW1lVHlwZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgIHsgS2V5ID0+ICdQbGFubmVkU3RhcnRUaW1lJywgVmFsdWUgPT4gJ1BsYW5uZWRTdGFydFRpbWUnIH0sCiAgICAgICAgICAgIHsgS2V5ID0+ICdQbGFubmVkRW5kVGltZScsICAgVmFsdWUgPT4gJ1BsYW5uZWRFbmRUaW1lJyB9LAogICAgICAgIF0sCiAgICAgICAgTmFtZSA9PiAnTW92ZVRpbWVUeXBlJywKICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9IHx8ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICk7CgogICAgIyB0aW1lIHBlcmlvZCB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoZSBHVUkKICAgIG15ICVUaW1lUGVyaW9kID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OlRpbWVQZXJpb2QnKSB9OwoKICAgICMgYWRkIHNlbGVjdGlvbiBmb3IgdGhlIHRpbWUKICAgIG15ICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVHZXRQYXJhbSwKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFByZWZpeCA9PiAnTW92ZVRpbWUnLAogICAgICAgICVUaW1lUGVyaW9kLAogICAgKTsKCiAgICAjIHJlbW92ZSBBSkFYLUxvYWRpbmcgaW1hZ2VzIGluIGRhdGUgc2VsZWN0aW9uIGZpZWxkcyB0byBhdm9pZCBqaXR0ZXIgZWZmZWN0CiAgICAkTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlbW92ZUFKQVhMb2FkaW5nSW1hZ2UoCiAgICAgICAgSFRNTFN0cmluZyA9PiAkTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcsCiAgICApOwoKICAgICMgc2hvdyBibG9jayB3aXRoIHRlbXBsYXRlIGRyb3Bkb3duCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRlbXBsYXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBUZW1wbGF0ZVNlbGVjdGlvblN0cmluZyAgICAgPT4gJFRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBNb3ZlVGltZVR5cGVTZWxlY3Rpb25TdHJpbmcgPT4gJE1vdmVUaW1lVHlwZVNlbGVjdGlvblN0cmluZywKICAgICAgICAgICAgTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcgICAgID0+ICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgdmFsaWRhdGlvbiBlcnJvcnMgaW4gQ2hhbmdlVGVtcGxhdGUgYmxvY2sKICAgIG15ICVWYWxpZGF0aW9uRXJyb3JOYW1lczsKICAgIEBWYWxpZGF0aW9uRXJyb3JOYW1lc3tAVmFsaWRhdGlvbkVycm9yc30gPSAoMSkgeCBAVmFsaWRhdGlvbkVycm9yczsKICAgIGZvciBteSAkQ2hhbmdlVGVtcGxhdGVWYWxpZGF0aW9uRXJyb3IgKHF3KEludmFsaWRNb3ZlVGltZVR5cGUgSW52YWxpZE1vdmVUaW1lIEludmFsaWRUZW1wbGF0ZSkpCiAgICB7CiAgICAgICAgaWYgKCAkVmFsaWRhdGlvbkVycm9yTmFtZXN7JENoYW5nZVRlbXBsYXRlVmFsaWRhdGlvbkVycm9yfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJENoYW5nZVRlbXBsYXRlVmFsaWRhdGlvbkVycm9yLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAnQWRkJywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CgogICAgICAgICMgdGltZSBwZXJpb2QgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgR1VJCiAgICAgICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgICAgICMgYWRkIHNlbGVjdGlvbiBmb3IgdGhlIHRpbWUKICAgICAgICBteSAkVGltZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICA9PiAnUmVxdWVzdGVkVGltZScsCiAgICAgICAgICAgIFJlcXVlc3RlZFRpbWVPcHRpb25hbCA9PiAxLAogICAgICAgICAgICAlVGltZVBlcmlvZCwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBmaWVsZHMKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXF1ZXN0ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnUmVxdWVzdGVkVGltZVN0cmluZycgPT4gJFRpbWVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBkcm9wZG93biBmb3IgdGhlIGNhdGVnb3J5CiAgICAjIGFsbCBjYXRlZ29yaWVzIGFyZSBzZWxlY3RhYmxlCiAgICAjIHdoZW4gdGhlIGNhdGVnb3J5IGlzIGNoYW5nZWQsIGEgbmV3IHByaW9yaXR5IGlzIHByb3Bvc2VkCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdDYXRlZ29yeScsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkUGFyYW17Q2F0ZWdvcnlTZWxlY3Rpb25TdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRDYXRlZ29yaWVzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgIEFqYXggICAgICAgPT4gewogICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICAgICAgJ0ltcGFjdElEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBkcm9wZG93biBmb3IgdGhlIGltcGFjdAogICAgIyBhbGwgaW1wYWN0cyBhcmUgc2VsZWN0YWJsZQogICAgIyB3aGVuIHRoZSBpbXBhY3QgaXMgY2hhbmdlZCwgYSBuZXcgcHJpb3JpdHkgaXMgcHJvcG9zZWQKICAgIG15ICRJbXBhY3RzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICBUeXBlICAgPT4gJ0ltcGFjdCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkUGFyYW17SW1wYWN0U2VsZWN0aW9uU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkSW1wYWN0cywKICAgICAgICBOYW1lICAgICAgID0+ICdJbXBhY3RJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgIEFqYXggICAgICAgPT4gewogICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICAgICAgJ0ltcGFjdElEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBkcm9wZG93biBmb3IgcHJpb3JpdHksCiAgICAjIGFsbCBwcmlvcml0aWVzIGFyZSBzZWxlY3RhYmxlCiAgICAjIHRoZSBkZWZhdWx0IHZhbHVlIG1pZ2h0IGRlcGVuZCBvbiBjYXRlZ29yeSBhbmQgaW1wYWN0CiAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdQcmlvcml0eScsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAkU2VsZWN0ZWRQcmlvcml0eSA9ICRHZXRQYXJhbXtQcmlvcml0eUlEfQogICAgICAgIHx8ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgSW1wYWN0SUQgICA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICk7CiAgICAkUGFyYW17UHJpb3JpdHlTZWxlY3Rpb25TdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkUHJpb3JpdHksCiAgICApOwoKICAgICMgZ2V0IHRoZSBjaGFuZ2UgZnJlZXRleHQgY29uZmlnIGFuZCBmaWxsdXAgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIGRlZmF1bHRzIChpZiBjb25maWd1cmVkKQogICAgbXkgJUNoYW5nZUZyZWVUZXh0Q29uZmlnOwogICAgTlVNQkVSOgogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KENoYW5nZUZyZWVLZXkgQ2hhbmdlRnJlZVRleHQpKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0cyBmb3IgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyBpZiBwYWdlIGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICAgICAgICAgJENoYW5nZUZyZWVUZXh0UGFyYW17ICRUeXBlIC4gJE51bWJlciB9CiAgICAgICAgICAgICAgICAgICAgfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAkVHlwZSAuICROdW1iZXIgLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBjb25maWcKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAkVHlwZSAuICROdW1iZXIgKTsKCiAgICAgICAgICAgIG5leHQgVFlQRSBpZiAhJENvbmZpZzsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIHJlZiAkQ29uZmlnIG5lICdIQVNIJzsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIGNoYW5nZSBmcmVldGV4dCBjb25maWcKICAgICAgICAgICAgJENoYW5nZUZyZWVUZXh0Q29uZmlneyAkVHlwZSAuICROdW1iZXIgfSA9ICRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdGhlIGNoYW5nZSBmcmVldGV4dCBIVE1MCiAgICBteSAlQ2hhbmdlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEZyZWVUZXh0SFRNTCgKICAgICAgICBDb25maWcgICAgICAgICAgICAgICAgICAgPT4gXCVDaGFuZ2VGcmVlVGV4dENvbmZpZywKICAgICAgICBDaGFuZ2VEYXRhICAgICAgICAgICAgICAgPT4gXCVDaGFuZ2VGcmVlVGV4dFBhcmFtLAogICAgICAgIENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcyA9PiBcQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcywKICAgICk7CgogICAgIyBzaG93IGNoYW5nZSBmcmVldGV4dCBmaWVsZHMKICAgIG15ICRDaGFuZ2VGcmVlVGV4dFNob3duOwogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIGZyZWV0ZXh0IGZpZWxkIHNob3VsZCBiZSBzaG93biBpbiB0aGlzIGZyb250ZW5kCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VGcmVlVGV4dH0tPnskTnVtYmVyfSApIHsKCiAgICAgICAgICAgICMgcmVtZW1iZXIgdGhhdCBhdCBsZWFzdCBvbmUgZnJlZXRleHQgZmllbGQgaXMgc2hvd24KICAgICAgICAgICAgJENoYW5nZUZyZWVUZXh0U2hvd24gPSAxOwoKICAgICAgICAgICAgIyBzaG93IHNpbmdsZSBjaGFuZ2UgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgY2hhbmdlIGZyZWV0ZXh0IHZhbGlkYXRpb24gZXJyb3IgZm9yIHNpbmdsZSBjaGFuZ2UgZnJlZXRleHQgZmllbGQKICAgICAgICAgICAgaWYgKCAkQ2hhbmdlRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkQ2hhbmdlRnJlZVRleHQnIC4gJE51bWJlciwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUNoYW5nZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFsbCBjaGFuZ2UgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlS2V5RmllbGQgID0+ICRDaGFuZ2VGcmVlVGV4dEhUTUx7ICdDaGFuZ2VGcmVlS2V5RmllbGQnIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0RmllbGQgPT4gJENoYW5nZUZyZWVUZXh0SFRNTHsgJ0NoYW5nZUZyZWVUZXh0RmllbGQnIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBhbGwgY2hhbmdlIGZyZWV0ZXh0IHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgICAgIGlmICggJENoYW5nZUZyZWVUZXh0VmFsaWRhdGlvbkVycm9yc3skTnVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52YWxpZENoYW5nZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUNoYW5nZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgc3BhY2UgYmV0d2VlbiBwcmlvcml0eSBhbmQgY2hhbmdlIGZyZWV0ZXh0IGlmIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgYXJlIHNob3duCiAgICBpZiAoJENoYW5nZUZyZWVUZXh0U2hvd24pIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlRnJlZVRleHRTcGFjZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBjaGFuZ2UgZnJlZXRleHQgamF2YSBzY3JpcHQgY2hlY2sKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZENoYW5nZUZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgIG5leHQgTlVNQkVSIGlmICEkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VGcmVlVGV4dH0tPnskTnVtYmVyfTsKCiAgICAgICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgY2hhbmdlIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0NoYW5nZUZyZWVUZXh0fS0+eyROdW1iZXJ9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRnJlZUtleUZpZWxkICA9PiAnQ2hhbmdlRnJlZUtleScgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0RmllbGQgPT4gJ0NoYW5nZUZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcwogICAgZm9yIG15ICRCbG9ja05hbWUgKEBWYWxpZGF0aW9uRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAkQmxvY2tOYW1lICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlQWRkJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgYWRkIENBQiB0ZW1wbGF0ZSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlLnBtLHYgMS4zIDIwMTAvMDIvMDMgMTI6MTY6MDMgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlQ0FCVGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIENoYW5nZUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UKICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gY2hhbmdlIGZvdW5kIGZvciBjaGFuZ2UgSUQgJENoYW5nZUlELiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoVGVtcGxhdGVOYW1lIENvbW1lbnQgVmFsaWRJRCkpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIFJlbWVtYmVyIHRoZSByZWFzb24gd2h5IHNhdmluZyB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGl0ZW1zIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgYWRkIGEgdGVtcGxhdGUKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRUZW1wbGF0ZScgKSB7CgogICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIHRlbXBsYXRlIG5hbWUKICAgICAgICBpZiAoICEkR2V0UGFyYW17VGVtcGxhdGVOYW1lfSApIHsKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRUZW1wbGF0ZU5hbWUnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhQFZhbGlkYXRpb25FcnJvcnMgKSB7CgogICAgICAgICAgICAjIHNlcmlhbGl6ZSB0aGUgY2hhbmdlCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUNvbnRlbnQgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0NBQicsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUNvbnRlbnQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJUaGUgQ0FCIG9mIGNoYW5nZSAnJENoYW5nZUlEJyBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgc2VyaWFsaXplZCBjaGFuZ2UKICAgICAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEdldFBhcmFte1RlbXBsYXRlTmFtZX0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJEdldFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAnQ0FCJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICA9PiAkVGVtcGxhdGVDb250ZW50LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGFkZCB0aGUgdGVtcGxhdGUuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXZlcnl0aGluZyB3ZW50IHdlbGwsIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zJkNoYW5nZUlEPSRDaGFuZ2VJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgbm8gc3ViYWN0aW9uLAogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICdUZW1wbGF0ZScsCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICBteSAkVmFsaWRTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCksCiAgICAgICAgfSwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtWYWxpZElEfSB8fCAoICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpIClbMF0sCiAgICAgICAgU29ydCAgICAgICA9PiAnTnVtZXJpY0tleScsCiAgICApOwoKICAgICMgYWRkIHRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzCiAgICBmb3IgbXkgJEJsb2NrTmFtZSAoQFZhbGlkYXRpb25FcnJvcnMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICRCbG9ja05hbWUgKTsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVmFsaWRTZWxlY3Rpb25TdHJpbmcgPT4gJFZhbGlkU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgICA9PiAkQ2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgPT4gJENoYW5nZS0+e0NoYW5nZVRpdGxlfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUNvbmRpdGlvbi5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IGNvbmRpdGlvbiBvdmVydmlldyBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbi5wbSx2IDEuNSAyMDEwLzAyLzA0IDIzOjU2OjM4IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSB0aGlzIHBhZ2UgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KENoYW5nZUlEIENvbmRpdGlvbklEIEFkZENvbmRpdGlvbikpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJEdldFBhcmFte0NoYW5nZUlEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIENoYW5nZUlEID0+ICRHZXRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZURhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkR2V0UGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgaXMgZm91bmQKICAgIGlmICggISRDaGFuZ2VEYXRhICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDaGFuZ2UgJyRHZXRQYXJhbXtDaGFuZ2VJRH0nIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgIyBhZGQgY29uZGl0aW9uIGJ1dHRvbiB3YXMgcHJlc3NlZAogICAgaWYgKCAkR2V0UGFyYW17QWRkQ29uZGl0aW9ufSApIHsKCiAgICAgICAgIyByZWRpcmVjdCB0byBjb25kaXRpb24gZWRpdCBtYXNrCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQ7Q2hhbmdlSUQ9JEdldFBhcmFte0NoYW5nZUlEfTtDb25kaXRpb25JRD1ORVciLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYWxsIGNvbmRpdGlvbiBpZHMgZm9yIHRoZSBnaXZlbiBjaGFuZ2UgaWQsIGluY2x1ZGluZyBpbnZhbGlkIGNvbmRpdGlvbnMKICAgIG15ICRDb25kaXRpb25JRHNSZWYgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkNvbmRpdGlvbkxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJEdldFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBWYWxpZCAgICA9PiAwLAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBhIGNvbmRpdGlvbiBzaG91bGQgYmUgZGVsZXRlZAogICAgZm9yIG15ICRDb25kaXRpb25JRCAoIEB7JENvbmRpdGlvbklEc1JlZn0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZWxldGVDb25kaXRpb25JRDo6JyAuICRDb25kaXRpb25JRCApICkgewoKICAgICAgICAgICAgIyBkZWxldGUgdGhlIGNvbmRpdGlvbgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uRGVsZXRlKAogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBkZWxldGUgQ29uZGl0aW9uSUQgJENvbmRpdGlvbklEISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07Q2hhbmdlSUQ9JEdldFBhcmFte0NoYW5nZUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb25seSBzaG93IHRoZSB0YWJsZSBoZWFkbGluZSBpZiB0aGVyZSBjb25kaXRpb25zIHRvIGJlIHNob3duCiAgICBpZiAoIEB7JENvbmRpdGlvbklEc1JlZn0gKSB7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7JENoYW5nZURhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICBmb3IgbXkgJENvbmRpdGlvbklEICggQHskQ29uZGl0aW9uSURzUmVmfSApIHsKCiAgICAgICAgIyBzZXQgb3V0cHV0IG9iamVjdAogICAgICAgICRDc3NDbGFzcyA9ICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJyA/ICdzZWFyY2hwYXNzaXZlJyA6ICdzZWFyY2hhY3RpdmUnOwoKICAgICAgICAjIGdldCBjb25kaXRpb24gZGF0YQogICAgICAgIG15ICRDb25kaXRpb25EYXRhID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25HZXQoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJvdwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICBWYWxpZCAgICA9PiAkVmFsaWRMaXN0eyAkQ29uZGl0aW9uRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAleyRDb25kaXRpb25EYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICdPdmVydmlldycsCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUNvbmRpdGlvbicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2VEYXRhfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCBjb25kaXRpb24gZWRpdCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQucG0sdiAxLjM3IDIwMTAvMDcvMDIgMjM6MjY6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjM3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiAgICAgICAgcXcoCiAgICAgICAgQ2hhbmdlSUQgQ29uZGl0aW9uSUQgTmFtZSBDb21tZW50IEV4cHJlc3Npb25Db25qdW5jdGlvbiBWYWxpZElECiAgICAgICAgU2F2ZSBBZGRBY3Rpb24gQWRkRXhwcmVzc2lvbiBOZXdFeHByZXNzaW9uIE5ld0FjdGlvbiBFbGVtZW50Q2hhbmdlZCBVcGRhdGVEaXZOYW1lKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENoYW5nZUlEIENvbmRpdGlvbklEKSkgewogICAgICAgIGlmICggISRHZXRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vICROZWVkZWQgaXMgZ2l2ZW4hIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJEdldFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRHZXRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGNoYW5nZSBleGlzdHMKICAgIGlmICggISRDaGFuZ2VEYXRhICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDaGFuZ2UgJyRHZXRQYXJhbXtDaGFuZ2VJRH0nIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CgogICAgbXkgJEV4cHJlc3Npb25JRHNSZWYgPSBbXTsKICAgIG15ICRBY3Rpb25JRHNSZWYgICAgID0gW107CgogICAgIyBvbmx5IGdldCBleHByZXNzaW9uIGxpc3QgYW5kIGFjdGlvbiBsaXN0IGlmIGNvbmRpdGlvbiBleGlzdHMgYWxyZWFkeQogICAgaWYgKCAkR2V0UGFyYW17Q29uZGl0aW9uSUR9IG5lICdORVcnICkgewoKICAgICAgICAjIGdldCBhbGwgZXhwcmVzc2lvbiBpZHMgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaWQKICAgICAgICAkRXhwcmVzc2lvbklEc1JlZiA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbkxpc3QoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRHZXRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhbGwgYWN0aW9uIGlkcyBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbiBpZAogICAgICAgICRBY3Rpb25JRHNSZWYgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkFjdGlvbkxpc3QoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRHZXRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgUmVtZW1iZXIgdGhlIHJlYXNvbiB3aHkgc2F2aW5nIHdhcyBub3QgYXR0ZW1wdGVkLgogICAgIyBUaGVzZSBlbnRyaWVzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNvbmRpdGlvbiBzYXZlIChhbHNvIGFkZC9kZWxldGUgZXhwcmVzc2lvbiBhbmQgYWRkL2RlbGV0ZSBhY3Rpb24pCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIHVwZGF0ZSBvbmx5IGlmIENvbmRpdGlvbk5hbWUgaXMgZ2l2ZW4KICAgICAgICBpZiAoICEkR2V0UGFyYW17TmFtZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkTmFtZSc7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGFsbCBwYXNzZWQgZGF0YSBpcyB2YWxpZAogICAgICAgIGlmICggIUBWYWxpZGF0aW9uRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgYSBuZXcgY29uZGl0aW9uCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NvbmRpdGlvbklEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBjb25kaXRpb24KICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDb25kaXRpb25JRH0gPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkNvbmRpdGlvbkFkZCgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25Db25qdW5jdGlvbiA9PiAkR2V0UGFyYW17RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0NvbmRpdGlvbklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdDb3VsZCBub3QgY3JlYXRlIG5ldyBjb25kaXRpb24hJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXBkYXRlIGFuIGV4aXN0aW5nIGNvbmRpdGlvbgogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY29uZGl0aW9uCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICAgICAgICAgICA9PiAkR2V0UGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbkNvbmp1bmN0aW9uID0+ICRHZXRQYXJhbXtFeHByZXNzaW9uQ29uanVuY3Rpb259LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIENvbmRpdGlvbklEICRHZXRQYXJhbXtDb25kaXRpb25JRH0hIiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSBhbGwgZXhpc3RpbmcgZXhwcmVzc2lvbiBmaWVsZHMKICAgICAgICAgICAgZm9yIG15ICRFeHByZXNzaW9uSUQgKCBAeyRFeHByZXNzaW9uSURzUmVmfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBleHByZXNzaW9uIGZpZWxkcwogICAgICAgICAgICAgICAgbXkgJUV4cHJlc3Npb25EYXRhOwogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoT2JqZWN0SUQgU2VsZWN0b3IgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCBDb21wYXJlVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJEV4cHJlc3Npb25EYXRheyRGaWVsZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdFeHByZXNzaW9uSUQ6OicgLiAkRXhwcmVzc2lvbklEIC4gJzo6JyAuICRGaWVsZCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZXhpc3RpbmcgZXhwcmVzc2lvbiBpcyBjb21wbGV0ZQogICAgICAgICAgICAgICAgIyAoYWxsIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCwgQ29tcGFyZVZhbHVlIGNhbiBiZSBlbXB0eSkKICAgICAgICAgICAgICAgIG15ICRGaWVsZHNPayA9IDE7CiAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQpKSB7CgogICAgICAgICAgICAgICAgICAgICMgbmV3IGV4cHJlc3Npb24gaXMgbm90IGNvbXBsZXRlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEV4cHJlc3Npb25EYXRheyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZHNPayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIGV4aXN0aW5nIGV4cHJlc3Npb24gb25seSBpZiBhbGwgZmllbGRzIGFyZSBjb21wbGV0ZQogICAgICAgICAgICAgICAgaWYgKCRGaWVsZHNPaykgewoKICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5FeHByZXNzaW9uVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgID0+ICRFeHByZXNzaW9uRGF0YXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEICA9PiAkRXhwcmVzc2lvbkRhdGF7QXR0cmlidXRlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvcklEICAgPT4gJEV4cHJlc3Npb25EYXRhe09wZXJhdG9ySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJEV4cHJlc3Npb25EYXRhe1NlbGVjdG9yfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRFeHByZXNzaW9uRGF0YXtDb21wYXJlVmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgdXBkYXRlIEV4cHJlc3Npb25JRCAkRXhwcmVzc2lvbklEISIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG5ldyBleHByZXNzaW9uIGZpZWxkcwogICAgICAgICAgICBteSAlRXhwcmVzc2lvbkRhdGE7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQgQ29tcGFyZVZhbHVlKSkgewogICAgICAgICAgICAgICAgJEV4cHJlc3Npb25EYXRheyRGaWVsZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0V4cHJlc3Npb25JRDo6TkVXOjonIC4gJEZpZWxkLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBuZXcgZXhwcmVzc2lvbiBpcyBjb21wbGV0ZQogICAgICAgICAgICAjIChhbGwgcmVxdWlyZWQgZmllbGRzIG11c3QgYmUgZmlsbGVkLCBDb21wYXJlVmFsdWUgY2FuIGJlIGVtcHR5KQogICAgICAgICAgICBteSAkRmllbGRzT2sgPSAxOwogICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoT2JqZWN0SUQgU2VsZWN0b3IgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCkpIHsKCiAgICAgICAgICAgICAgICAjIG5ldyBleHByZXNzaW9uIGlzIG5vdCBjb21wbGV0ZQogICAgICAgICAgICAgICAgaWYgKCAhJEV4cHJlc3Npb25EYXRheyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEZpZWxkc09rID0gMDsKICAgICAgICAgICAgICAgICAgICBsYXN0IEZJRUxEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBuZXcgZXhwcmVzc2lvbgogICAgICAgICAgICBpZiAoJEZpZWxkc09rKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgbmV3IGV4cHJlc3Npb24KICAgICAgICAgICAgICAgIG15ICRFeHByZXNzaW9uSUQgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25BZGQoCiAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRHZXRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgID0+ICRFeHByZXNzaW9uRGF0YXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgID0+ICRFeHByZXNzaW9uRGF0YXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JJRCAgID0+ICRFeHByZXNzaW9uRGF0YXtPcGVyYXRvcklEfSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJEV4cHJlc3Npb25EYXRhe1NlbGVjdG9yfSwKICAgICAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJEV4cHJlc3Npb25EYXRhe0NvbXBhcmVWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJEV4cHJlc3Npb25JRCApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGFkZCBuZXcgRXhwcmVzc2lvbiEiLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgYWxsIGV4aXN0aW5nIGFjdGlvbiBmaWVsZHMKICAgICAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIEB7JEFjdGlvbklEc1JlZn0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgYWN0aW9uIGZpZWxkcwogICAgICAgICAgICAgICAgbXkgJUFjdGlvbkRhdGE7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhPYmplY3RJRCBTZWxlY3RvciBBdHRyaWJ1dGVJRCBPcGVyYXRvcklEIEFjdGlvblZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICRBY3Rpb25EYXRheyRGaWVsZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdBY3Rpb25JRDo6JyAuICRBY3Rpb25JRCAuICc6OicgLiAkRmllbGQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGV4aXN0aW5nIGFjdGlvbiBpcyBjb21wbGV0ZQogICAgICAgICAgICAgICAgIyAoYWxsIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCwgQWN0aW9uVmFsdWUgY2FuIGJlIGVtcHR5KQogICAgICAgICAgICAgICAgbXkgJEZpZWxkc09rID0gMTsKICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoT2JqZWN0SUQgU2VsZWN0b3IgQXR0cmlidXRlSUQgT3BlcmF0b3JJRCkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBuZXcgYWN0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgICAgICAgICAgICAgICAgIGlmICggISRBY3Rpb25EYXRheyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZHNPayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIGV4aXN0aW5nIGFjdGlvbiBvbmx5IGlmIGFsbCBmaWVsZHMgYXJlIGNvbXBsZXRlCiAgICAgICAgICAgICAgICBpZiAoJEZpZWxkc09rKSB7CgogICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIHRoZSBhY3Rpb24KICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+QWN0aW9uVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25JRCAgICA9PiAkQWN0aW9uSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgID0+ICRBY3Rpb25EYXRhe09iamVjdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJEFjdGlvbkRhdGF7QXR0cmlidXRlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvcklEICA9PiAkQWN0aW9uRGF0YXtPcGVyYXRvcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJEFjdGlvbkRhdGF7U2VsZWN0b3J9LAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25WYWx1ZSA9PiAkQWN0aW9uRGF0YXtBY3Rpb25WYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IHVwZGF0ZSBBY3Rpb25JRCAkQWN0aW9uSUQhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgbmV3IGFjdGlvbiBmaWVsZHMKICAgICAgICAgICAgbXkgJUFjdGlvbkRhdGE7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQgQWN0aW9uVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkQWN0aW9uRGF0YXskRmllbGR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdBY3Rpb25JRDo6TkVXOjonIC4gJEZpZWxkLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBuZXcgYWN0aW9uIGlzIGNvbXBsZXRlCiAgICAgICAgICAgICMgKGFsbCByZXF1aXJlZCBmaWVsZHMgbXVzdCBiZSBmaWxsZWQsIEFjdGlvblZhbHVlIGNhbiBiZSBlbXB0eSkKICAgICAgICAgICAgJEZpZWxkc09rID0gMTsKICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KE9iamVjdElEIFNlbGVjdG9yIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQpKSB7CgogICAgICAgICAgICAgICAgIyBuZXcgYWN0aW9uIGlzIG5vdCBjb21wbGV0ZQogICAgICAgICAgICAgICAgaWYgKCAhJEFjdGlvbkRhdGF7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAkRmllbGRzT2sgPSAwOwogICAgICAgICAgICAgICAgICAgIGxhc3QgRklFTEQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG5ldyBhY3Rpb24KICAgICAgICAgICAgaWYgKCRGaWVsZHNPaykgewoKICAgICAgICAgICAgICAgICMgYWRkIG5ldyBhY3Rpb24KICAgICAgICAgICAgICAgIG15ICRBY3Rpb25JRCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+QWN0aW9uQWRkKAogICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRHZXRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgPT4gJEFjdGlvbkRhdGF7T2JqZWN0SUR9LAogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+ICRBY3Rpb25EYXRhe0F0dHJpYnV0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvcklEICA9PiAkQWN0aW9uRGF0YXtPcGVyYXRvcklEfSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciAgICA9PiAkQWN0aW9uRGF0YXtTZWxlY3Rvcn0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uVmFsdWUgPT4gJEFjdGlvbkRhdGF7QWN0aW9uVmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJEFjdGlvbklEICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgYWRkIG5ldyBBY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBqdXN0IHRoZSBzYXZlIGJ1dHRvbiB3YXMgcHJlc3NlZCwgcmVkaXJlY3QgdG8gY29uZGl0aW9uIG92ZXJ2aWV3CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1NhdmV9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb247Q2hhbmdlSUQ9JEdldFBhcmFte0NoYW5nZUlEfSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGV4cHJlc3Npb24gYWRkIGJ1dHRvbiB3YXMgcHJlc3NlZAogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtBZGRFeHByZXNzaW9ufSApIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgdGhlIGVkaXQgdmlldyBhZ2FpbiwgYnV0IG5vdyB3aXRoIGEgbmV3IGVtcHR5IGV4cHJlc3Npb24gbGluZQogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0O0NoYW5nZUlEPSRHZXRQYXJhbXtDaGFuZ2VJRH07IgogICAgICAgICAgICAgICAgICAgICAgICAuICJDb25kaXRpb25JRD0kR2V0UGFyYW17Q29uZGl0aW9uSUR9O05ld0V4cHJlc3Npb249MSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFjdGlvbiBhZGQgYnV0dG9uIHdhcyBwcmVzc2VkCiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte0FkZEFjdGlvbn0gKSB7CgogICAgICAgICAgICAgICAgIyBzaG93IHRoZSBlZGl0IHZpZXcgYWdhaW4sIGJ1dCBub3cgd2l0aCBhIG5ldyBlbXB0eSBhY3Rpb24gbGluZQogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0O0NoYW5nZUlEPSRHZXRQYXJhbXtDaGFuZ2VJRH07IgogICAgICAgICAgICAgICAgICAgICAgICAuICJDb25kaXRpb25JRD0kR2V0UGFyYW17Q29uZGl0aW9uSUR9O05ld0FjdGlvbj0xIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgYW4gZXhwcmVzc2lvbiBzaG91bGQgYmUgZGVsZXRlZAogICAgICAgICAgICBmb3IgbXkgJEV4cHJlc3Npb25JRCAoIEB7JEV4cHJlc3Npb25JRHNSZWZ9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGRlbGV0ZSBidXR0b24gb2YgdGhpcyBleHByZXNzaW9uIHdhcyBwcmVzc2VkCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRGVsZXRlRXhwcmVzc2lvbklEOjonIC4gJEV4cHJlc3Npb25JRAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25EZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgZGVsZXRlIEV4cHJlc3Npb25JRCAkRXhwcmVzc2lvbklEISIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgc2hvdyB0aGUgZWRpdCB2aWV3IGFnYWluCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdDtDaGFuZ2VJRD0kR2V0UGFyYW17Q2hhbmdlSUR9OyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNvbmRpdGlvbklEPSRHZXRQYXJhbXtDb25kaXRpb25JRH0iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgYW4gYWN0aW9uIHNob3VsZCBiZSBkZWxldGVkCiAgICAgICAgICAgIGZvciBteSAkQWN0aW9uSUQgKCBAeyRBY3Rpb25JRHNSZWZ9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGRlbGV0ZSBidXR0b24gb2YgdGhpcyBhY3Rpb24gd2FzIHByZXNzZWQKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlQWN0aW9uSUQ6OicgLiAkQWN0aW9uSUQgKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIGFjdGlvbgogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25EZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgZGVsZXRlIEFjdGlvbklEICRBY3Rpb25JRCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHNob3cgdGhlIGVkaXQgdmlldyBhZ2FpbgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQ7Q2hhbmdlSUQ9JEdldFBhcmFte0NoYW5nZUlEfTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJDb25kaXRpb25JRD0kR2V0UGFyYW17Q29uZGl0aW9uSUR9IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgdGhlIGVkaXQgdmlldyBhZ2FpbgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdDtDaGFuZ2VJRD0kR2V0UGFyYW17Q2hhbmdlSUR9OyIKICAgICAgICAgICAgICAgICAgICAuICJDb25kaXRpb25JRD0kR2V0UGFyYW17Q29uZGl0aW9uSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBoYW5kbGUgQUpBWFVwZGF0ZSAoY2hhbmdlIHRoZSBjb250ZW50IG9mIGRyb3Bkb3dubGlzdHMpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICMgdG8gc3RvcmUgdGhlIEpTT04gb3V0cHV0CiAgICAgICAgbXkgJEpTT047CgogICAgICAgICMgZXhwcmVzc2lvbiBvciBhY3Rpb24gZmllbGQgd2FzIGNoYW5nZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPX4gbXsgXEEgKCBFeHByZXNzaW9uSUQgfCBBY3Rpb25JRCApIDo6ICggXGQrIHwgTkVXICkgfXhtcyApCiAgICAgICAgewoKICAgICAgICAgICAgIyBnZXQgaWQgbmFtZSBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudCAoICdFeHByZXNzaW9uSUQnIG9yICdBY3Rpb25JRCcgKQogICAgICAgICAgICBteSAkSUROYW1lID0gJDE7CgogICAgICAgICAgICAjIGdldCBpZCBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudAogICAgICAgICAgICBteSAkSUQgPSAkMjsKCiAgICAgICAgICAgICMgZ2V0IHZhbHVlIGZpZWxkIG5hbWUKICAgICAgICAgICAgbXkgJFZhbHVlRmllbGROYW1lOwogICAgICAgICAgICBpZiAoICRJRE5hbWUgZXEgJ0V4cHJlc3Npb25JRCcgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWVGaWVsZE5hbWUgPSAnQ29tcGFyZVZhbHVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRJRE5hbWUgZXEgJ0FjdGlvbklEJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZUZpZWxkTmFtZSA9ICdBY3Rpb25WYWx1ZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGV4cHJlc3Npb24gb3IgYWN0aW9uIGZpZWxkcwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhPYmplY3RJRCBTZWxlY3RvciBBdHRyaWJ1dGVJRCBPcGVyYXRvcklEIENvbXBhcmVWYWx1ZSBBY3Rpb25WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskRmllbGR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICRJRE5hbWUgLiAnOjonIC4gJElEIC4gJzo6JyAuICRGaWVsZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG9iamVjdCBzZWxlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT5fR2V0T2JqZWN0U2VsZWN0aW9uKCk7CgogICAgICAgICAgICAjIGdldCBzZWxlY3RvciBzZWxlY3Rpb24gbGlzdAogICAgICAgICAgICBteSAkU2VsZWN0b3JMaXN0ID0gJFNlbGYtPl9HZXRTZWxlY3RvclNlbGVjdGlvbigKICAgICAgICAgICAgICAgIE9iamVjdElEICAgID0+ICRHZXRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkR2V0UGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgICAgICAgICAgJElETmFtZSAgICAgPT4gJElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgYXR0cmlidXRlIHNlbGVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPl9HZXRBdHRyaWJ1dGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiAkR2V0UGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICAgICAgU2VsZWN0b3IgPT4gJEdldFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAgICAgICAgICRJRE5hbWUgID0+ICRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG9wZXJhdG9yIHNlbGVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICRPcGVyYXRvckxpc3QgPSAkU2VsZi0+X0dldE9wZXJhdG9yU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgPT4gJEdldFBhcmFte09iamVjdElEfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+ICRHZXRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgICAgICAgICAkSUROYW1lICAgICA9PiAkSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBhbiBlbXB0eSBzZWxlY3RvciBzZWxlY3Rpb24gaWYgbm8gbGlzdCBpcyBhdmFpbGFibGUgb3Igbm90aGluZyBpcyBzZWxlY3RlZAogICAgICAgICAgICBteSAkUG9zc2libGVOb25lU2VsZWN0b3IgPSAwOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJFNlbGVjdG9yTGlzdAogICAgICAgICAgICAgICAgfHwgIXJlZiAkU2VsZWN0b3JMaXN0IGVxICdIQVNIJwogICAgICAgICAgICAgICAgfHwgISV7JFNlbGVjdG9yTGlzdH0KICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJElETmFtZSAuICc6OicgLiAkSUQgLiAnOjpPYmplY3RJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBvc3NpYmxlTm9uZVNlbGVjdG9yID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgYW4gZW1wdHkgYXR0cmlidXRlIHNlbGVjdGlvbiBpZiBubyBsaXN0IGlzIGF2YWlsYWJsZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIG15ICRQb3NzaWJsZU5vbmVBdHRyaWJ1dGVJRCA9IDA7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkQXR0cmlidXRlTGlzdAogICAgICAgICAgICAgICAgfHwgIXJlZiAkQXR0cmlidXRlTGlzdCBlcSAnSEFTSCcKICAgICAgICAgICAgICAgIHx8ICEleyRBdHRyaWJ1dGVMaXN0fQogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJzo6JyAuICRJRCAuICc6Ok9iamVjdElEJwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJzo6JyAuICRJRCAuICc6OlNlbGVjdG9yJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUG9zc2libGVOb25lQXR0cmlidXRlSUQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBhbiBlbXB0eSBvcGVyYXRvciBzZWxlY3Rpb24gaWYgbm8gbGlzdCBpcyBhdmFpbGFibGUgb3Igbm90aGluZyBpcyBzZWxlY3RlZAogICAgICAgICAgICBteSAkUG9zc2libGVOb25lT3BlcmF0b3JJRCA9IDA7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkT3BlcmF0b3JMaXN0CiAgICAgICAgICAgICAgICB8fCAhcmVmICRPcGVyYXRvckxpc3QgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICB8fCAhJXskT3BlcmF0b3JMaXN0fQogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJzo6JyAuICRJRCAuICc6Ok9iamVjdElEJwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJzo6JyAuICRJRCAuICc6OlNlbGVjdG9yJwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJzo6JyAuICRJRCAuICc6OkF0dHJpYnV0ZUlEJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUG9zc2libGVOb25lT3BlcmF0b3JJRCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgb2JqZWN0IHdhcyBjaGFuZ2VkLCByZXNldCB0aGUgYXR0cmlidXRlIGFuZCBvcGVyYXRvciBsaXN0CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAkSUROYW1lIC4gJzo6JyAuICRJRCAuICc6Ok9iamVjdElEJyApIHsKICAgICAgICAgICAgICAgICRBdHRyaWJ1dGVMaXN0ID0ge307CiAgICAgICAgICAgICAgICAkT3BlcmF0b3JMaXN0ICA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIGpzb24KICAgICAgICAgICAgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkSUROYW1lIC4gJzo6JyAuICRJRCAuICc6Ok9iamVjdElEJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte09iamVjdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJElETmFtZSAuICc6OicgLiAkSUQgLiAnOjpTZWxlY3RvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VsZWN0b3JMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBvc3NpYmxlTm9uZVNlbGVjdG9yID8gJycgOiAkR2V0UGFyYW17U2VsZWN0b3J9LAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZVNlbGVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnOjonIC4gJElEIC4gJzo6QXR0cmlidXRlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEF0dHJpYnV0ZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17QXR0cmlidXRlSUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZUF0dHJpYnV0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnOjonIC4gJElEIC4gJzo6T3BlcmF0b3JJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT3BlcmF0b3JMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte09wZXJhdG9ySUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZU9wZXJhdG9ySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZXR1cm4ganNvbgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaGFuZGxlIEFKQVhVcGRhdGUgKHJlcGxhY2UgdGhlIGZpZWxkIHR5cGUsIGUuZy4gcmVwbGFjZSBhIHRleHQgZmllbGQgd2l0aCBhIHNlbGVjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYQ29udGVudFVwZGF0ZScgKSB7CgogICAgICAgICMgdG8gc3RvcmUgdGhlIEhUTUwgc3RyaW5nIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBicm93c2VyCiAgICAgICAgbXkgJEhUTUxTdHJpbmc7CgogICAgICAgICMgZXhwcmVzc2lvbiBvciBhY3Rpb24gZmllbGQgd2FzIGNoYW5nZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPX4gbXsgXEEgKCBFeHByZXNzaW9uSUQgfCBBY3Rpb25JRCApIDo6ICggXGQrIHwgTkVXICkgfXhtcyApCiAgICAgICAgewoKICAgICAgICAgICAgIyBnZXQgaWQgbmFtZSBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudCAoICdFeHByZXNzaW9uSUQnIG9yICdBY3Rpb25JRCcgKQogICAgICAgICAgICBteSAkSUROYW1lID0gJDE7CgogICAgICAgICAgICAjIGdldCBpZCBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudAogICAgICAgICAgICBteSAkSUQgPSAkMjsKCiAgICAgICAgICAgICMgZ2V0IHZhbHVlIGZpZWxkIG5hbWUKICAgICAgICAgICAgbXkgJFZhbHVlRmllbGROYW1lOwogICAgICAgICAgICBpZiAoICRJRE5hbWUgZXEgJ0V4cHJlc3Npb25JRCcgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWVGaWVsZE5hbWUgPSAnQ29tcGFyZVZhbHVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRJRE5hbWUgZXEgJ0FjdGlvbklEJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZUZpZWxkTmFtZSA9ICdBY3Rpb25WYWx1ZSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGV4cHJlc3Npb24gb3IgYWN0aW9uIGZpZWxkcwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhPYmplY3RJRCBTZWxlY3RvciBBdHRyaWJ1dGVJRCBPcGVyYXRvcklEIENvbXBhcmVWYWx1ZSBBY3Rpb25WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskRmllbGR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICRJRE5hbWUgLiAnOjonIC4gJElEIC4gJzo6JyAuICRGaWVsZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGNvbXBhcmUgdmFsdWUgZmllbGQgdHlwZQogICAgICAgICAgICBteSAkRmllbGRUeXBlID0gJFNlbGYtPl9HZXRDb21wYXJlVmFsdWVGaWVsZFR5cGUoJUdldFBhcmFtKTsKCiAgICAgICAgICAgICMgYnVpbGQgQ29tcGFyZVZhbHVlIHNlbGVjdGlvbgogICAgICAgICAgICBpZiAoICRGaWVsZFR5cGUgZXEgJ1NlbGVjdGlvbicgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgY29tcGFyZSB2YWx1ZSBzZWxlY3Rpb24gbGlzdAogICAgICAgICAgICAgICAgbXkgJENvbXBhcmVWYWx1ZUxpc3QgPSAkU2VsZi0+X0dldENvbXBhcmVWYWx1ZVNlbGVjdGlvbiglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgICMgYWRkIGFuIGVtcHR5IHNlbGVjdGlvbiBpZiBubyBsaXN0IGlzIGF2YWlsYWJsZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UG9zc2libGVOb25lfQogICAgICAgICAgICAgICAgICAgIHx8ICEkUGFyYW17JFZhbHVlRmllbGROYW1lfQogICAgICAgICAgICAgICAgICAgIHx8ICEkQ29tcGFyZVZhbHVlTGlzdAogICAgICAgICAgICAgICAgICAgIHx8ICggcmVmICRDb21wYXJlVmFsdWVMaXN0IGVxICdIQVNIJyAgJiYgISV7JENvbXBhcmVWYWx1ZUxpc3R9ICkKICAgICAgICAgICAgICAgICAgICB8fCAoIHJlZiAkQ29tcGFyZVZhbHVlTGlzdCBlcSAnQVJSQVknICYmICFAeyRDb21wYXJlVmFsdWVMaXN0fSApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQb3NzaWJsZU5vbmUgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgVmFsdWVPcHRpb25TdHJpbmcKICAgICAgICAgICAgICAgICRIVE1MU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvbXBhcmVWYWx1ZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnOjonIC4gJElEIC4gJzo6JyAuICRWYWx1ZUZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFteyRWYWx1ZUZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIEFKQVgtTG9hZGluZyBpbWFnZXMgaW4gc2VsZWN0aW9uIGZpZWxkIHRvIGF2b2lkIGppdHRlciBlZmZlY3QKICAgICAgICAgICAgICAgICRIVE1MU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZW1vdmVBSkFYTG9hZGluZ0ltYWdlKAogICAgICAgICAgICAgICAgICAgIEhUTUxTdHJpbmcgPT4gJEhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIHRleHQgaW5wdXQgZmllbGQKICAgICAgICAgICAgZWxzaWYgKCAkRmllbGRUeXBlIGVxICdUZXh0JyApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGFuIGVtcHR5IGlucHV0IGZpZWxkCiAgICAgICAgICAgICAgICAkSFRNTFN0cmluZyA9ICcnCiAgICAgICAgICAgICAgICAgICAgLiAnPGlucHV0IHR5cGU9InRleHQiICcKICAgICAgICAgICAgICAgICAgICAuICdpZD0iJyAuICRJRE5hbWUgLiAnOjonIC4gJElEIC4gJzo6JyAuICRWYWx1ZUZpZWxkTmFtZSAuICciICcKICAgICAgICAgICAgICAgICAgICAuICduYW1lPSInIC4gJElETmFtZSAuICc6OicgLiAkSUQgLiAnOjonIC4gJFZhbHVlRmllbGROYW1lIC4gJyIgJwogICAgICAgICAgICAgICAgICAgIC4gJ3ZhbHVlPSIiIHNpemU9IjMwIiBtYXhsZW5ndGg9IjI1MCI+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGVycm9yIGZvciB1bmtub3duIGZpZWxkIHR5cGUKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkSFRNTFN0cmluZyA9ICI8c3Bhbj48Yj5FcnJvcjogVW5rbm93biBmaWVsZCB0eXBlICckRmllbGRUeXBlJyE8L2I+PC9zcGFuPiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmV0dXJuIEhUTUwKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSFRNTFN0cmluZywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNvbmRpdGlvbiBlZGl0IHZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBteSAlQ29uZGl0aW9uRGF0YTsKCiAgICAjIGdldCBDb25kaXRpb25JRAogICAgJENvbmRpdGlvbkRhdGF7Q29uZGl0aW9uSUR9ID0gJEdldFBhcmFte0NvbmRpdGlvbklEfTsKCiAgICAjIGlmIHRoaXMgaXMgYW4gZXhpc3RpbmcgY29uZGl0aW9uCiAgICBpZiAoICRDb25kaXRpb25EYXRhe0NvbmRpdGlvbklEfSBuZSAnTkVXJyApIHsKCiAgICAgICAgIyBnZXQgY29uZGl0aW9uIGRhdGEKICAgICAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25HZXQoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25EYXRhe0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbmRpdGlvbiBiZWxvbmdzIHRvIHRoZSBnaXZlbiBjaGFuZ2UKICAgICAgICBpZiAoICRDb25kaXRpb24tPntDaGFuZ2VJRH0gbmUgJEdldFBhcmFte0NoYW5nZUlEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDb25kaXRpb25JRCAkQ29uZGl0aW9uRGF0YXtDb25kaXRpb25JRH0gYmVsb25ncyB0byAiCiAgICAgICAgICAgICAgICAgICAgLiAiIENoYW5nZUlEICRDb25kaXRpb24tPntDaGFuZ2VJRH0gYW5kIG5vdCB0byB0aGUgZ2l2ZW4gJEdldFBhcmFte0NoYW5nZUlEfSEiLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBkYXRhIGZyb20gY29uZGl0aW9uCiAgICAgICAgJUNvbmRpdGlvbkRhdGEgPSAoICVDb25kaXRpb25EYXRhLCAleyRDb25kaXRpb259ICk7CgogICAgICAgICMgc2hvdyBleGlzdGluZyBleHByZXNzaW9ucwogICAgICAgICRTZWxmLT5fRXhwcmVzc2lvbk92ZXJ2aWV3KAogICAgICAgICAgICAleyRDaGFuZ2VEYXRhfSwKICAgICAgICAgICAgJUNvbmRpdGlvbkRhdGEsCiAgICAgICAgICAgIEV4cHJlc3Npb25JRHMgPT4gJEV4cHJlc3Npb25JRHNSZWYsCiAgICAgICAgICAgIE5ld0V4cHJlc3Npb24gPT4gJEdldFBhcmFte05ld0V4cHJlc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBleGlzdGluZyBhY3Rpb25zCiAgICAgICAgJFNlbGYtPl9BY3Rpb25PdmVydmlldygKICAgICAgICAgICAgJXskQ2hhbmdlRGF0YX0sCiAgICAgICAgICAgICVDb25kaXRpb25EYXRhLAogICAgICAgICAgICBBY3Rpb25JRHMgPT4gJEFjdGlvbklEc1JlZiwKICAgICAgICAgICAgTmV3QWN0aW9uID0+ICRHZXRQYXJhbXtOZXdBY3Rpb259LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZXhwcmVzc2lvbiBjb25qdW5jdGlvbiBmcm9tIGNvbmRpdGlvbgogICAgaWYgKCAhJEdldFBhcmFte0V4cHJlc3Npb25Db25qdW5jdGlvbn0gKSB7CiAgICAgICAgJEdldFBhcmFte0V4cHJlc3Npb25Db25qdW5jdGlvbn0gPSAkQ29uZGl0aW9uRGF0YXtFeHByZXNzaW9uQ29uanVuY3Rpb259IHx8ICcnOwogICAgfQoKICAgICMgc2V0IHJhZGlvIGJ1dHRvbnMgZm9yIGV4cHJlc3Npb24gY29uanVuY3Rpb24KICAgIGlmICggJEdldFBhcmFte0V4cHJlc3Npb25Db25qdW5jdGlvbn0gZXEgJ2FsbCcgKSB7CiAgICAgICAgJENvbmRpdGlvbkRhdGF7YWxsc2VsZWN0ZWR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDb25kaXRpb25EYXRhe2FueXNlbGVjdGVkfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmluZwogICAgJENvbmRpdGlvbkRhdGF7VmFsaWRPcHRpb25TdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBOYW1lICAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJENvbmRpdGlvbkRhdGF7VmFsaWRJRH0gfHwgKCAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKSApWzBdLAogICAgICAgIFNvcnQgICAgICAgID0+ICdOdW1lcmljS2V5JywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgKTsKCiAgICAjIGFkZCB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcwogICAgZm9yIG15ICRCbG9ja05hbWUgKEBWYWxpZGF0aW9uRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAkQmxvY2tOYW1lICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZURhdGF9LAogICAgICAgICAgICAlQ29uZGl0aW9uRGF0YSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKIyBzaG93IGV4aXN0aW5nIGV4cHJlc3Npb25zCnN1YiBfRXhwcmVzc2lvbk92ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17RXhwcmVzc2lvbklEc307CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtFeHByZXNzaW9uSURzfSBuZSAnQVJSQVknOwoKICAgIG15IEBFeHByZXNzaW9uSURzID0gQHsgJFBhcmFte0V4cHJlc3Npb25JRHN9IH07CgogICAgIyBhbHNvIHNob3cgYSBuZXcgZW1wdHkgZXhwcmVzc2lvbiBsaW5lCiAgICBpZiAoICRQYXJhbXtOZXdFeHByZXNzaW9ufSApIHsKICAgICAgICBwdXNoIEBFeHByZXNzaW9uSURzLCAnTkVXJzsKICAgIH0KCiAgICByZXR1cm4gaWYgIUBFeHByZXNzaW9uSURzOwoKICAgIEVYUFJFU1NJT05JRDoKICAgIGZvciBteSAkRXhwcmVzc2lvbklEICggc29ydCB7ICRhIGNtcCAkYiB9IEBFeHByZXNzaW9uSURzICkgewoKICAgICAgICAjIHRvIHN0b3JlIHRoZSBkYXRlIG9mIGFuIGV4cHJlc3Npb24KICAgICAgICBteSAkRXhwcmVzc2lvbkRhdGEgPSB7fTsKCiAgICAgICAgIyBzZXQgZXhwcmVzc2lvbiBpZCB0byAnTkVXJyBmb3IgZnVydGhlciBmdW5jdGlvbiBjYWxscwogICAgICAgIGlmICggJEV4cHJlc3Npb25JRCBlcSAnTkVXJyApIHsKICAgICAgICAgICAgJEV4cHJlc3Npb25EYXRhLT57RXhwcmVzc2lvbklEfSA9ICRFeHByZXNzaW9uSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBkYXRhIGZvciBhbiBleGlzdGluZyBleHByZXNzaW9uCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBjb25kaXRpb24gZGF0YQogICAgICAgICAgICAkRXhwcmVzc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25HZXQoCiAgICAgICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVYUFJFU1NJT05JRCBpZiAhJEV4cHJlc3Npb25EYXRhOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcm93CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwcmVzc2lvbk92ZXJ2aWV3Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRFeHByZXNzaW9uRGF0YX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IG9iamVjdCBzZWxlY3Rpb24KICAgICAgICAkU2VsZi0+X1Nob3dPYmplY3RTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskRXhwcmVzc2lvbkRhdGF9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBzZWxlY29yIHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd1NlbGVjdG9yU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JEV4cHJlc3Npb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYXR0cmlidXRlIHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd0F0dHJpYnV0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRFeHByZXNzaW9uRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IG9wZXJhdG9yIHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd09wZXJhdG9yU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JEV4cHJlc3Npb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgY29tcGFyZSB2YWx1ZSBmaWVsZAogICAgICAgICRTZWxmLT5fU2hvd0NvbXBhcmVWYWx1ZUZpZWxkKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JEV4cHJlc3Npb25EYXRhfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIHNob3cgZXhpc3RpbmcgYWN0aW9ucwpzdWIgX0FjdGlvbk92ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17QWN0aW9uSURzfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0FjdGlvbklEc30gbmUgJ0FSUkFZJzsKCiAgICBteSBAQWN0aW9uSURzID0gQHsgJFBhcmFte0FjdGlvbklEc30gfTsKCiAgICAjIGFsc28gc2hvdyBhIG5ldyBlbXB0eSBhY3Rpb24gbGluZQogICAgaWYgKCAkUGFyYW17TmV3QWN0aW9ufSApIHsKICAgICAgICBwdXNoIEBBY3Rpb25JRHMsICdORVcnOwogICAgfQoKICAgIHJldHVybiBpZiAhQEFjdGlvbklEczsKCiAgICBBY3Rpb25JRDoKICAgIGZvciBteSAkQWN0aW9uSUQgKCBzb3J0IHsgJGEgY21wICRiIH0gQEFjdGlvbklEcyApIHsKCiAgICAgICAgIyB0byBzdG9yZSB0aGUgZGF0ZSBvZiBhbiBhY3Rpb24KICAgICAgICBteSAkQWN0aW9uRGF0YSA9IHt9OwoKICAgICAgICAjIHNldCBhY3Rpb24gaWQgdG8gJ05FVycgZm9yIGZ1cnRoZXIgZnVuY3Rpb24gY2FsbHMKICAgICAgICBpZiAoICRBY3Rpb25JRCBlcSAnTkVXJyApIHsKICAgICAgICAgICAgJEFjdGlvbkRhdGEtPntBY3Rpb25JRH0gPSAkQWN0aW9uSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBkYXRhIGZvciBhbiBleGlzdGluZyBhY3Rpb24KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmRpdGlvbiBkYXRhCiAgICAgICAgICAgICRBY3Rpb25EYXRhID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25HZXQoCiAgICAgICAgICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFjdGlvbklEIGlmICEkQWN0aW9uRGF0YTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJvdwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb2JqZWN0IHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd09iamVjdFNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgc2VsZWNvciBzZWxlY3Rpb24KICAgICAgICAkU2VsZi0+X1Nob3dTZWxlY3RvclNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYXR0cmlidXRlIHNlbGVjdGlvbgogICAgICAgICRTZWxmLT5fU2hvd0F0dHJpYnV0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb3BlcmF0b3Igc2VsZWN0aW9uCiAgICAgICAgJFNlbGYtPl9TaG93T3BlcmF0b3JTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQWN0aW9uRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGNvbXBhcmUgdmFsdWUgZmllbGQKICAgICAgICAkU2VsZi0+X1Nob3dDb21wYXJlVmFsdWVGaWVsZCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRBY3Rpb25EYXRhfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIHNob3cgb2JqZWN0IGRyb3Bkb3duIGZpZWxkCnN1YiBfU2hvd09iamVjdFNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG9iamVjdCBzZWxlY3Rpb24gbGlzdAogICAgbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+X0dldE9iamVjdFNlbGVjdGlvbiglUGFyYW0pOwoKICAgICMgYWRkIGFuIGVtcHR5IHNlbGVjdGlvbiBpZiBubyBsaXN0IGlzIGF2YWlsYWJsZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkCiAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgIGlmICgKICAgICAgICAhJE9iamVjdExpc3QKICAgICAgICB8fCAhcmVmICRPYmplY3RMaXN0IGVxICdIQVNIJwogICAgICAgIHx8ICEleyRPYmplY3RMaXN0fQogICAgICAgIHx8ICEkUGFyYW17T2JqZWN0SUR9CiAgICAgICAgKQogICAgewogICAgICAgICRQb3NzaWJsZU5vbmUgPSAxOwogICAgfQoKICAgICMgbmFtZSBvZiB0aGUgZGl2IHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQKICAgIG15ICRVcGRhdGVEaXZOYW1lOwoKICAgICMgaWQgbmFtZSBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudCAoICdFeHByZXNzaW9uSUQnIG9yICdBY3Rpb25JRCcgKQogICAgbXkgJElETmFtZTsKCiAgICAjIGJsb2NrIG5hbWUgZm9yIHRoZSBvdXRwdXQgbGF5b3V0IGJsb2NrCiAgICBteSAkQmxvY2tOYW1lOwoKICAgICMgZm9yIGV4cHJlc3Npb24gZWxlbWVudHMKICAgIGlmICggJFBhcmFte0V4cHJlc3Npb25JRH0gKSB7CiAgICAgICAgJFVwZGF0ZURpdk5hbWUgPSAiRXhwcmVzc2lvbklEOjokUGFyYW17RXhwcmVzc2lvbklEfTo6Q29tcGFyZVZhbHVlOjpEaXYiOwogICAgICAgICRJRE5hbWUgICAgICAgID0gJ0V4cHJlc3Npb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZSAgICAgPSAnRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudE9iamVjdCc7CiAgICB9CgogICAgIyBmb3IgYWN0aW9uIGVsZW1lbnRzCiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb25JRH0gKSB7CiAgICAgICAgJFVwZGF0ZURpdk5hbWUgPSAiQWN0aW9uSUQ6OiRQYXJhbXtBY3Rpb25JRH06OkFjdGlvblZhbHVlOjpEaXYiOwogICAgICAgICRJRE5hbWUgICAgICAgID0gJ0FjdGlvbklEJzsKICAgICAgICAkQmxvY2tOYW1lICAgICA9ICdBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRPYmplY3QnOwogICAgfQoKICAgICMgYnVpbGQgT25DaGFuZ2Ugc3RyaW5nCiAgICBteSAkT25DaGFuZ2VTdHJpbmcgPSAnJwogICAgICAgIC4gIkFKQVhDb250ZW50VXBkYXRlKCckVXBkYXRlRGl2TmFtZScsICciCiAgICAgICAgLiAnJEVudnsiQmFzZWxpbmsifScKICAgICAgICAuICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgIC4gJyZTdWJhY3Rpb249QUpBWENvbnRlbnRVcGRhdGUnCiAgICAgICAgLiAiJlVwZGF0ZURpdk5hbWU9JFVwZGF0ZURpdk5hbWUiCiAgICAgICAgLiAnJkNoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifScKICAgICAgICAuICcmQ29uZGl0aW9uSUQ9JFFEYXRheyJDb25kaXRpb25JRCJ9JwoKICAgICAgICAuICImIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6T2JqZWN0SUQ9JyArICIKICAgICAgICAuICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6T2JqZWN0SUQnKS52YWx1ZSArICciCgogICAgICAgIC4gIiZFbGVtZW50Q2hhbmdlZD0iIC4gJElETmFtZSAuICI6OiIgLiAkUGFyYW17JElETmFtZX0gLiAiOjpPYmplY3RJRCIKICAgICAgICAuICInKTsgIgoKICAgICAgICAuICJBSkFYVXBkYXRlKCdBSkFYVXBkYXRlJywgJyIgLiAkSUROYW1lIC4gIjo6IiAuICRQYXJhbXskSUROYW1lfSAuICI6Ok9iamVjdElEJywgIgogICAgICAgIC4gIlsgIgogICAgICAgIC4gIidDaGFuZ2VJRCcsICIKICAgICAgICAuICInQ29uZGl0aW9uSUQnLCAiCiAgICAgICAgLiAiJyIgLiAkSUROYW1lIC4gIjo6IiAuICRQYXJhbXskSUROYW1lfSAuICI6Ok9iamVjdElEJywgIgogICAgICAgIC4gIl0sICIKICAgICAgICAuICJbICIKICAgICAgICAuICInIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6T2JqZWN0SUQnLCAiCiAgICAgICAgLiAiJyIgLiAkSUROYW1lIC4gIjo6IiAuICRQYXJhbXskSUROYW1lfSAuICI6OlNlbGVjdG9yJywgIgogICAgICAgIC4gIiciIC4gJElETmFtZSAuICI6OiIgLiAkUGFyYW17JElETmFtZX0gLiAiOjpBdHRyaWJ1dGVJRCcsICIKICAgICAgICAuICInIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6T3BlcmF0b3JJRCcsICIKICAgICAgICAuICJdKTsgIgogICAgICAgIC4gJ3JldHVybiBmYWxzZTsnOwoKICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyaW5nCiAgICBteSAkT2JqZWN0T3B0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnOjonIC4gJFBhcmFteyRJRE5hbWV9IC4gJzo6T2JqZWN0SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIE9uQ2hhbmdlICAgICA9PiAkT25DaGFuZ2VTdHJpbmcsCiAgICApOwoKICAgICMgcmVtb3ZlIEFKQVgtTG9hZGluZyBpbWFnZXMgaW4gc2VsZWN0aW9uIGZpZWxkIHRvIGF2b2lkIGppdHRlciBlZmZlY3QKICAgICRPYmplY3RPcHRpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlbW92ZUFKQVhMb2FkaW5nSW1hZ2UoCiAgICAgICAgSFRNTFN0cmluZyA9PiAkT2JqZWN0T3B0aW9uU3RyaW5nLAogICAgKTsKCiAgICAjIG91dHB1dCBvYmplY3Qgc2VsZWN0aW9uCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZSwKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBPYmplY3RPcHRpb25TdHJpbmcgPT4gJE9iamVjdE9wdGlvblN0cmluZywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKIyBzaG93IHNlbGVjdG9yIGRyb3Bkb3duIGZpZWxkCnN1YiBfU2hvd1NlbGVjdG9yU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VsZWN0b3Igc2VsZWN0aW9uIGxpc3QKICAgIG15ICRTZWxlY3Rvckxpc3QgPSAkU2VsZi0+X0dldFNlbGVjdG9yU2VsZWN0aW9uKCVQYXJhbSk7CgogICAgIyBhZGQgYW4gZW1wdHkgc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgIG15ICRQb3NzaWJsZU5vbmUgPSAwOwogICAgaWYgKAogICAgICAgICEkU2VsZWN0b3JMaXN0CiAgICAgICAgfHwgIXJlZiAkU2VsZWN0b3JMaXN0IGVxICdIQVNIJwogICAgICAgIHx8ICEleyRTZWxlY3Rvckxpc3R9CiAgICAgICAgfHwgISRQYXJhbXtTZWxlY3Rvcn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICB9CgogICAgIyBpZCBuYW1lIG9mIHRoZSBpbnZvbHZlZCBlbGVtZW50ICggJ0V4cHJlc3Npb25JRCcgb3IgJ0FjdGlvbklEJyApCiAgICBteSAkSUROYW1lOwoKICAgICMgYmxvY2sgbmFtZSBmb3IgdGhlIG91dHB1dCBsYXlvdXQgYmxvY2sKICAgIG15ICRCbG9ja05hbWU7CgogICAgIyBmb3IgZXhwcmVzc2lvbiBlbGVtZW50cwogICAgaWYgKCAkUGFyYW17RXhwcmVzc2lvbklEfSApIHsKICAgICAgICAkSUROYW1lICAgID0gJ0V4cHJlc3Npb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZSA9ICdFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50U2VsZWN0b3InOwogICAgfQoKICAgICMgZm9yIGFjdGlvbiBlbGVtZW50cwogICAgZWxzaWYgKCAkUGFyYW17QWN0aW9uSUR9ICkgewogICAgICAgICRJRE5hbWUgICAgPSAnQWN0aW9uSUQnOwogICAgICAgICRCbG9ja05hbWUgPSAnQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50U2VsZWN0b3InOwogICAgfQoKICAgICMgZ2VuZXJhdGUgU2VsZWN0b3JPcHRpb25TdHJpbmcKICAgIG15ICRTZWxlY3Rvck9wdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZWxlY3Rvckxpc3QsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnOjonIC4gJFBhcmFteyRJRE5hbWV9IC4gJzo6U2VsZWN0b3InLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIEFqYXggICAgICAgICA9PiB7CiAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAkSUROYW1lIC4gJzo6JyAuICRQYXJhbXskSUROYW1lfSAuICc6OlNlbGVjdG9yJywKICAgICAgICAgICAgICAgICRJRE5hbWUgLiAnOjonIC4gJFBhcmFteyRJRE5hbWV9IC4gJzo6QXR0cmlidXRlSUQnLAogICAgICAgICAgICAgICAgJElETmFtZSAuICc6OicgLiAkUGFyYW17JElETmFtZX0gLiAnOjpPcGVyYXRvcklEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VJRCcsCiAgICAgICAgICAgICAgICAnQ29uZGl0aW9uSUQnLAogICAgICAgICAgICAgICAgJElETmFtZSAuICc6OicgLiAkUGFyYW17JElETmFtZX0gLiAnOjpPYmplY3RJRCcsCiAgICAgICAgICAgICAgICAkSUROYW1lIC4gJzo6JyAuICRQYXJhbXskSUROYW1lfSAuICc6OlNlbGVjdG9yJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIHJlbW92ZSBBSkFYLUxvYWRpbmcgaW1hZ2VzIGluIHNlbGVjdGlvbiBmaWVsZCB0byBhdm9pZCBqaXR0ZXIgZWZmZWN0CiAgICAkU2VsZWN0b3JPcHRpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlbW92ZUFKQVhMb2FkaW5nSW1hZ2UoCiAgICAgICAgSFRNTFN0cmluZyA9PiAkU2VsZWN0b3JPcHRpb25TdHJpbmcsCiAgICApOwoKICAgICMgb3V0cHV0IHNlbGVjdG9yIHNlbGVjdGlvbgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRCbG9ja05hbWUsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgU2VsZWN0b3JPcHRpb25TdHJpbmcgPT4gJFNlbGVjdG9yT3B0aW9uU3RyaW5nLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIHNob3cgYXR0cmlidXRlIGRyb3Bkb3duIGZpZWxkCnN1YiBfU2hvd0F0dHJpYnV0ZVNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbmFtZSBvZiB0aGUgZGl2IHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQKICAgIG15ICRVcGRhdGVEaXZOYW1lOwoKICAgICMgaWQgbmFtZSBvZiB0aGUgaW52b2x2ZWQgZWxlbWVudCAoICdFeHByZXNzaW9uSUQnIG9yICdBY3Rpb25JRCcgKQogICAgbXkgJElETmFtZTsKCiAgICAjIGJsb2NrIG5hbWUgZm9yIHRoZSBvdXRwdXQgbGF5b3V0IGJsb2NrCiAgICBteSAkQmxvY2tOYW1lOwoKICAgICMgbmFtZSBvZiB0aGUgdmFsdWUgZmllbGQgKCBDb21wYXJlVmFsdWUgb3IgQWN0aW9uVmFsdWUgKQogICAgbXkgJFZhbHVlRmllbGROYW1lOwoKICAgICMgZm9yIGV4cHJlc3Npb24gZWxlbWVudHMKICAgIGlmICggJFBhcmFte0V4cHJlc3Npb25JRH0gKSB7CiAgICAgICAgJFVwZGF0ZURpdk5hbWUgID0gIkV4cHJlc3Npb25JRDo6JFBhcmFte0V4cHJlc3Npb25JRH06OkNvbXBhcmVWYWx1ZTo6RGl2IjsKICAgICAgICAkSUROYW1lICAgICAgICAgPSAnRXhwcmVzc2lvbklEJzsKICAgICAgICAkQmxvY2tOYW1lICAgICAgPSAnRXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudEF0dHJpYnV0ZSc7CiAgICAgICAgJFZhbHVlRmllbGROYW1lID0gJ0NvbXBhcmVWYWx1ZSc7CiAgICB9CgogICAgIyBmb3IgYWN0aW9uIGVsZW1lbnRzCiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb25JRH0gKSB7CiAgICAgICAgJFVwZGF0ZURpdk5hbWUgID0gIkFjdGlvbklEOjokUGFyYW17QWN0aW9uSUR9OjpBY3Rpb25WYWx1ZTo6RGl2IjsKICAgICAgICAkSUROYW1lICAgICAgICAgPSAnQWN0aW9uSUQnOwogICAgICAgICRCbG9ja05hbWUgICAgICA9ICdBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRBdHRyaWJ1dGUnOwogICAgICAgICRWYWx1ZUZpZWxkTmFtZSA9ICdBY3Rpb25WYWx1ZSc7CiAgICB9CgogICAgIyBnZXQgYXR0cmlidXRlIHNlbGVjdGlvbiBsaXN0CiAgICBteSAkQXR0cmlidXRlTGlzdCA9ICRTZWxmLT5fR2V0QXR0cmlidXRlU2VsZWN0aW9uKAogICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgU2VsZWN0b3IgPT4gJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAkSUROYW1lICA9PiAkUGFyYW17JElETmFtZX0sCiAgICApOwoKICAgICMgYWRkIGFuIGVtcHR5IHNlbGVjdGlvbiBpZiBubyBsaXN0IGlzIGF2YWlsYWJsZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkCiAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgIGlmICgKICAgICAgICAhJEF0dHJpYnV0ZUxpc3QKICAgICAgICB8fCAhcmVmICRBdHRyaWJ1dGVMaXN0IGVxICdIQVNIJwogICAgICAgIHx8ICEleyRBdHRyaWJ1dGVMaXN0fQogICAgICAgIHx8ICEkUGFyYW17QXR0cmlidXRlSUR9CiAgICAgICAgKQogICAgewogICAgICAgICRQb3NzaWJsZU5vbmUgPSAxOwogICAgfQoKICAgICMgYnVpbGQgT25DaGFuZ2Ugc3RyaW5nCiAgICBteSAkT25DaGFuZ2VTdHJpbmcgPSAnJwogICAgICAgIC4gIkFKQVhDb250ZW50VXBkYXRlKCckVXBkYXRlRGl2TmFtZScsICciCiAgICAgICAgLiAnJEVudnsiQmFzZWxpbmsifScKICAgICAgICAuICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgIC4gJyZTdWJhY3Rpb249QUpBWENvbnRlbnRVcGRhdGUnCiAgICAgICAgLiAiJlVwZGF0ZURpdk5hbWU9JFVwZGF0ZURpdk5hbWUiCiAgICAgICAgLiAnJkNoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifScKICAgICAgICAuICcmQ29uZGl0aW9uSUQ9JFFEYXRheyJDb25kaXRpb25JRCJ9JwoKICAgICAgICAuICImIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6T2JqZWN0SUQ9JyArICIKICAgICAgICAuICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6T2JqZWN0SUQnKS52YWx1ZSArICciCgogICAgICAgIC4gIiYiIC4gJElETmFtZSAuICI6OiIgLiAkUGFyYW17JElETmFtZX0gLiAiOjpTZWxlY3Rvcj0nICsgIgogICAgICAgIC4gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCciIC4gJElETmFtZSAuICI6OiIgLiAkUGFyYW17JElETmFtZX0gLiAiOjpTZWxlY3RvcicpLnZhbHVlICsgJyIKCiAgICAgICAgLiAiJiIgLiAkSUROYW1lIC4gIjo6IiAuICRQYXJhbXskSUROYW1lfSAuICI6OkF0dHJpYnV0ZUlEPScgIgogICAgICAgIC4gIisgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJyIKICAgICAgICAuICRJRE5hbWUgLiAiOjoiCiAgICAgICAgLiAkUGFyYW17JElETmFtZX0KICAgICAgICAuICI6OkF0dHJpYnV0ZUlEJykudmFsdWUgKyAnIgoKICAgICAgICAuICImIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6T3BlcmF0b3JJRD0nICsgIgogICAgICAgIC4gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCciCiAgICAgICAgLiAkSUROYW1lIC4gIjo6IgogICAgICAgIC4gJFBhcmFteyRJRE5hbWV9CiAgICAgICAgLiAiOjpPcGVyYXRvcklEJykudmFsdWUgKyAnIgoKICAgICAgICAuICImIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6IiAuICRWYWx1ZUZpZWxkTmFtZSAuICI9JyArICIKICAgICAgICAuICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnIgogICAgICAgIC4gJElETmFtZSAuICI6OiIKICAgICAgICAuICRQYXJhbXskSUROYW1lfQogICAgICAgIC4gIjo6IiAuICRWYWx1ZUZpZWxkTmFtZSAuICInKS52YWx1ZSArICciCgogICAgICAgIC4gIiZFbGVtZW50Q2hhbmdlZD0iIC4gJElETmFtZSAuICI6OiIgLiAkUGFyYW17JElETmFtZX0gLiAiOjpBdHRyaWJ1dGVJRCIKICAgICAgICAuICInKTsgIgoKICAgICAgICAuICJBSkFYVXBkYXRlKCdBSkFYVXBkYXRlJywgJyIgLiAkSUROYW1lIC4gIjo6IiAuICRQYXJhbXskSUROYW1lfSAuICI6OkF0dHJpYnV0ZUlEJywgIgogICAgICAgIC4gIlsgIgogICAgICAgIC4gIidDaGFuZ2VJRCcsICIKICAgICAgICAuICInQ29uZGl0aW9uSUQnLCAiCiAgICAgICAgLiAiJyIgLiAkSUROYW1lIC4gIjo6IiAuICRQYXJhbXskSUROYW1lfSAuICI6Ok9iamVjdElEJywgIgogICAgICAgIC4gIiciIC4gJElETmFtZSAuICI6OiIgLiAkUGFyYW17JElETmFtZX0gLiAiOjpTZWxlY3RvcicsICIKICAgICAgICAuICInIiAuICRJRE5hbWUgLiAiOjoiIC4gJFBhcmFteyRJRE5hbWV9IC4gIjo6QXR0cmlidXRlSUQnICIKICAgICAgICAuICJdLCAiCiAgICAgICAgLiAiWyAiCiAgICAgICAgLiAiJyIgLiAkSUROYW1lIC4gIjo6IiAuICRQYXJhbXskSUROYW1lfSAuICI6OkF0dHJpYnV0ZUlEJywgIgogICAgICAgIC4gIiciIC4gJElETmFtZSAuICI6OiIgLiAkUGFyYW17JElETmFtZX0gLiAiOjpPcGVyYXRvcklEJywgIgogICAgICAgIC4gIl0pOyAiCiAgICAgICAgLiAncmV0dXJuIGZhbHNlOyc7CgogICAgIyBnZW5lcmF0ZSBBdHRyaWJ1dGVPcHRpb25TdHJpbmcKICAgIG15ICRBdHRyaWJ1dGVPcHRpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkQXR0cmlidXRlTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJElETmFtZSAuICc6OicgLiAkUGFyYW17JElETmFtZX0gLiAnOjpBdHRyaWJ1dGVJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgUG9zc2libGVOb25lID0+ICRQb3NzaWJsZU5vbmUsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgT25DaGFuZ2UgICAgID0+ICRPbkNoYW5nZVN0cmluZywKICAgICk7CgogICAgIyByZW1vdmUgQUpBWC1Mb2FkaW5nIGltYWdlcyBpbiBkYXRlIHNlbGVjdGlvbiBmaWVsZHMgdG8gYXZvaWQgaml0dGVyIGVmZmVjdAogICAgJEF0dHJpYnV0ZU9wdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVtb3ZlQUpBWExvYWRpbmdJbWFnZSgKICAgICAgICBIVE1MU3RyaW5nID0+ICRBdHRyaWJ1dGVPcHRpb25TdHJpbmcsCiAgICApOwoKICAgICMgb3V0cHV0IGF0dHJpYnV0ZSBzZWxlY3Rpb24KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEF0dHJpYnV0ZU9wdGlvblN0cmluZyA9PiAkQXR0cmlidXRlT3B0aW9uU3RyaW5nLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgojIHNob3cgb3BlcmF0b3IgZHJvcGRvd24gZmllbGQKc3ViIF9TaG93T3BlcmF0b3JTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGlkIG5hbWUgb2YgdGhlIGludm9sdmVkIGVsZW1lbnQgKCAnRXhwcmVzc2lvbklEJyBvciAnQWN0aW9uSUQnICkKICAgIG15ICRJRE5hbWU7CgogICAgIyBibG9jayBuYW1lIGZvciB0aGUgb3V0cHV0IGxheW91dCBibG9jawogICAgbXkgJEJsb2NrTmFtZTsKCiAgICAjIGZvciBleHByZXNzaW9uIGVsZW1lbnRzCiAgICBpZiAoICRQYXJhbXtFeHByZXNzaW9uSUR9ICkgewogICAgICAgICRJRE5hbWUgICAgPSAnRXhwcmVzc2lvbklEJzsKICAgICAgICAkQmxvY2tOYW1lID0gJ0V4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRPcGVyYXRvcic7CiAgICB9CgogICAgIyBmb3IgYWN0aW9uIGVsZW1lbnRzCiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb25JRH0gKSB7CiAgICAgICAgJElETmFtZSAgICA9ICdBY3Rpb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZSA9ICdBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRPcGVyYXRvcic7CiAgICB9CgogICAgIyBnZXQgb3BlcmF0b3Igc2VsZWN0aW9uIGxpc3QKICAgIG15ICRPcGVyYXRvckxpc3QgPSAkU2VsZi0+X0dldE9wZXJhdG9yU2VsZWN0aW9uKAogICAgICAgIE9iamVjdElEICAgID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgQXR0cmlidXRlSUQgPT4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICAkSUROYW1lICAgICA9PiAkUGFyYW17JElETmFtZX0sCiAgICApOwoKICAgICMgYWRkIGFuIGVtcHR5IHNlbGVjdGlvbiBpZiBubyBsaXN0IGlzIGF2YWlsYWJsZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkCiAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgIGlmICgKICAgICAgICAhJE9wZXJhdG9yTGlzdAogICAgICAgIHx8ICFyZWYgJE9wZXJhdG9yTGlzdCBlcSAnSEFTSCcKICAgICAgICB8fCAhJXskT3BlcmF0b3JMaXN0fQogICAgICAgIHx8ICEkUGFyYW17T3BlcmF0b3JJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBPcGVyYXRvck9wdGlvblN0cmluZwogICAgbXkgJE9wZXJhdG9yT3B0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJE9wZXJhdG9yTGlzdCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJElETmFtZSAuICc6OicgLiAkUGFyYW17JElETmFtZX0gLiAnOjpPcGVyYXRvcklEJywKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte09wZXJhdG9ySUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIEFqYXggICAgICAgICA9PiB7CiAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAkSUROYW1lIC4gJzo6JyAuICRQYXJhbXskSUROYW1lfSAuICc6Ok9wZXJhdG9ySUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUlEJywKICAgICAgICAgICAgICAgICdDb25kaXRpb25JRCcsCiAgICAgICAgICAgICAgICAkSUROYW1lIC4gJzo6JyAuICRQYXJhbXskSUROYW1lfSAuICc6Ok9iamVjdElEJywKICAgICAgICAgICAgICAgICRJRE5hbWUgLiAnOjonIC4gJFBhcmFteyRJRE5hbWV9IC4gJzo6U2VsZWN0b3InLAogICAgICAgICAgICAgICAgJElETmFtZSAuICc6OicgLiAkUGFyYW17JElETmFtZX0gLiAnOjpBdHRyaWJ1dGVJRCcsCiAgICAgICAgICAgICAgICAkSUROYW1lIC4gJzo6JyAuICRQYXJhbXskSUROYW1lfSAuICc6Ok9wZXJhdG9ySUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgcmVtb3ZlIEFKQVgtTG9hZGluZyBpbWFnZXMgaW4gc2VsZWN0aW9uIGZpZWxkIHRvIGF2b2lkIGppdHRlciBlZmZlY3QKICAgICRPcGVyYXRvck9wdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVtb3ZlQUpBWExvYWRpbmdJbWFnZSgKICAgICAgICBIVE1MU3RyaW5nID0+ICRPcGVyYXRvck9wdGlvblN0cmluZywKICAgICk7CgogICAgIyBvdXRwdXQgb3BlcmF0b3Igc2VsZWN0aW9uCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZSwKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBPcGVyYXRvck9wdGlvblN0cmluZyA9PiAkT3BlcmF0b3JPcHRpb25TdHJpbmcsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCiMgc2hvdyBjb21wYXJlIHZhbHVlIGZpZWxkCnN1YiBfU2hvd0NvbXBhcmVWYWx1ZUZpZWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29tcGFyZSB2YWx1ZSBmaWVsZCB0eXBlCiAgICBteSAkRmllbGRUeXBlID0gJFNlbGYtPl9HZXRDb21wYXJlVmFsdWVGaWVsZFR5cGUoJVBhcmFtKTsKCiAgICAjIGlkIG5hbWUgb2YgdGhlIGludm9sdmVkIGVsZW1lbnQgKCAnRXhwcmVzc2lvbklEJyBvciAnQWN0aW9uSUQnICkKICAgIG15ICRJRE5hbWU7CgogICAgIyBibG9jayBuYW1lcyBmb3IgdGhlIG91dHB1dCBsYXlvdXQgYmxvY2sKICAgIG15ICRCbG9ja05hbWVUZXh0OwogICAgbXkgJEJsb2NrTmFtZVNlbGVjdGlvbjsKCiAgICBteSAkVmFsdWVGaWVsZE5hbWU7CgogICAgIyBmb3IgZXhwcmVzc2lvbiBlbGVtZW50cwogICAgaWYgKCAkUGFyYW17RXhwcmVzc2lvbklEfSApIHsKICAgICAgICAkSUROYW1lICAgICAgICAgICAgID0gJ0V4cHJlc3Npb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZVRleHQgICAgICA9ICdFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50Q29tcGFyZVZhbHVlVGV4dCc7CiAgICAgICAgJEJsb2NrTmFtZVNlbGVjdGlvbiA9ICdFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50Q29tcGFyZVZhbHVlU2VsZWN0aW9uJzsKICAgICAgICAkVmFsdWVGaWVsZE5hbWUgICAgID0gJ0NvbXBhcmVWYWx1ZSc7CiAgICB9CgogICAgIyBmb3IgYWN0aW9uIGVsZW1lbnRzCiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb25JRH0gKSB7CiAgICAgICAgJElETmFtZSAgICAgICAgICAgICA9ICdBY3Rpb25JRCc7CiAgICAgICAgJEJsb2NrTmFtZVRleHQgICAgICA9ICdBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRBY3Rpb25WYWx1ZVRleHQnOwogICAgICAgICRCbG9ja05hbWVTZWxlY3Rpb24gPSAnQWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50QWN0aW9uVmFsdWVTZWxlY3Rpb24nOwogICAgICAgICRWYWx1ZUZpZWxkTmFtZSAgICAgPSAnQWN0aW9uVmFsdWUnOwogICAgfQoKICAgICMgY29tcGFyZSB2YWx1ZSBpcyBhIHRleHQgZmllbGQKICAgIGlmICggJEZpZWxkVHlwZSBlcSAnVGV4dCcgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lVGV4dCwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbXBhcmUgdmFsdWUgaXMgYSBzZWxlY3Rpb24gZmllbGQKICAgIGVsc2lmICggJEZpZWxkVHlwZSBlcSAnU2VsZWN0aW9uJyApIHsKCiAgICAgICAgIyBnZXQgY29tcGFyZSB2YWx1ZSBzZWxlY3Rpb24gbGlzdAogICAgICAgIG15ICRDb21wYXJlVmFsdWVMaXN0ID0gJFNlbGYtPl9HZXRDb21wYXJlVmFsdWVTZWxlY3Rpb24oJVBhcmFtKTsKCiAgICAgICAgIyBhZGQgYW4gZW1wdHkgc2VsZWN0aW9uIGlmIG5vIGxpc3QgaXMgYXZhaWxhYmxlIG9yIG5vdGhpbmcgaXMgc2VsZWN0ZWQKICAgICAgICBteSAkUG9zc2libGVOb25lID0gMDsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRQYXJhbXtQb3NzaWJsZU5vbmV9CiAgICAgICAgICAgIHx8ICEkUGFyYW17JFZhbHVlRmllbGROYW1lfQogICAgICAgICAgICB8fCAhJENvbXBhcmVWYWx1ZUxpc3QKICAgICAgICAgICAgfHwgKCByZWYgJENvbXBhcmVWYWx1ZUxpc3QgZXEgJ0hBU0gnICAmJiAhJXskQ29tcGFyZVZhbHVlTGlzdH0gKQogICAgICAgICAgICB8fCAoIHJlZiAkQ29tcGFyZVZhbHVlTGlzdCBlcSAnQVJSQVknICYmICFAeyRDb21wYXJlVmFsdWVMaXN0fSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQb3NzaWJsZU5vbmUgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBWYWx1ZU9wdGlvblN0cmluZwogICAgICAgIG15ICRWYWx1ZU9wdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ29tcGFyZVZhbHVlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJRE5hbWUgLiAnOjonIC4gJFBhcmFteyRJRE5hbWV9IC4gJzo6JyAuICRWYWx1ZUZpZWxkTmFtZSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXskVmFsdWVGaWVsZE5hbWV9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBvc3NpYmxlTm9uZSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgQUpBWC1Mb2FkaW5nIGltYWdlcyBpbiBzZWxlY3Rpb24gZmllbGQgdG8gYXZvaWQgaml0dGVyIGVmZmVjdAogICAgICAgICRWYWx1ZU9wdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVtb3ZlQUpBWExvYWRpbmdJbWFnZSgKICAgICAgICAgICAgSFRNTFN0cmluZyA9PiAkVmFsdWVPcHRpb25TdHJpbmcsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgc2VsZWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lU2VsZWN0aW9uLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFZhbHVlT3B0aW9uU3RyaW5nID0+ICRWYWx1ZU9wdGlvblN0cmluZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgY29tcGFyZSB2YWx1ZSBpcyBhIGRhdGUgZmllbGQKICAgIGVsc2lmICggJEZpZWxkVHlwZSBlcSAnRGF0ZScgKSB7CgogICAgICAgICMgVE9ETyA6IEltcGxlbWVudCBkYXRlIHNlbGVjdGlvbiBsYXRlciEKICAgIH0KCiAgICAjIGNvbXBhcmUgdmFsdWUgaXMgYW4gYXV0b2NvbXBsZXRlIGZpZWxkCiAgICBlbHNpZiAoICRGaWVsZFR5cGUgZXEgJ0F1dG9jb21wbGV0ZScgKSB7CgogICAgICAgICMgVE9ETyA6IEltcGxlbWVudCBhdXRvY29tcGxldGUgc2VsZWN0aW9uIGxhdGVyIQogICAgfQoKICAgICMgc2hvdyBlbXB0eSBibG9jayBpZiBmaWVsZCB0eXBlIGlzIHVua25vd24KICAgIGVsc2UgewoKICAgICAgICAjIG91dHB1dCBlbXB0eSBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJEJsb2NrTmFtZVNlbGVjdGlvbiwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyBnZXQgY29tcGFyZSB2YWx1ZSBmaWVsZCB0eXBlCnN1YiBfR2V0Q29tcGFyZVZhbHVlRmllbGRUeXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgZGVmYXVsdCBmaWVsZCB0eXBlCiAgICBteSAkRmllbGRUeXBlID0gJ1NlbGVjdGlvbic7CgogICAgIyBpZiBhbiBhdHRyaWJ1dGUgaXMgc2V0CiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGVJRH0gKSB7CgogICAgICAgICMgbG9va3VwIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgaWYgKCAhJEF0dHJpYnV0ZU5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBdHRyaWJ1dGVJRCAkUGFyYW17QXR0cmlidXRlSUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBmaWVsZCB0eXBlCiAgICAgICAgJEZpZWxkVHlwZSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uQ29tcGFyZVZhbHVlRmllbGRUeXBlKAogICAgICAgICAgICBPYmplY3RJRCAgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiAkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIGlmICEkRmllbGRUeXBlOwogICAgfQoKICAgICMgV29ya2Fyb3VuZCBmb3Igbm90IHlldCBpbXBsZW1lbnRlZCBmaWVsZCB0eXBlcwogICAgIyBUT0RPOiBpbXBsZW1lbnQgdGhlc2UgZmllbGQgdHlwZXMgbGF0ZXIhCiAgICBpZiAoICRGaWVsZFR5cGUgZXEgJ0RhdGUnICkgewogICAgICAgICRGaWVsZFR5cGUgPSAnVGV4dCc7CiAgICB9CiAgICBlbHNpZiAoICRGaWVsZFR5cGUgZXEgJ0F1dG9jb21wbGV0ZScgKSB7CiAgICAgICAgJEZpZWxkVHlwZSA9ICdTZWxlY3Rpb24nOwogICAgfQoKICAgIHJldHVybiAkRmllbGRUeXBlOwp9CgojIGdldCBvYmplY3QgZHJvcGRvd24gZmllbGQgZGF0YQpzdWIgX0dldE9iamVjdFNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICBteSAkT2JqZWN0TGlzdCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T2JqZWN0TGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJE9iamVjdExpc3Q7Cn0KCiMgZ2V0IHNlbGVjdG9yIGRyb3Bkb3duIGZpZWxkIGRhdGEKc3ViIF9HZXRTZWxlY3RvclNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxlY3Rvckxpc3QgPSB7fTsKCiAgICAjIGlmIGFuIG9iamVjdCBpcyBzZXQKICAgIGlmICggJFBhcmFte09iamVjdElEfSApIHsKCiAgICAgICAgIyBnZXQgc2VsZWN0b3IgbGlzdAogICAgICAgICRTZWxlY3Rvckxpc3QgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdFNlbGVjdG9yTGlzdCgKICAgICAgICAgICAgT2JqZWN0SUQgICAgID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgICAgIEFjdGlvbklEICAgICA9PiAkUGFyYW17QWN0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxlY3Rvckxpc3Q7Cn0KCiMgZ2V0IGF0dHJpYnV0ZSBzZWxlY3Rpb24gbGlzdCBkYXRhCnN1YiBfR2V0QXR0cmlidXRlU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0byBzdG9yZSB0aGUgYXR0cml1dGVzCiAgICBteSAlQXR0cmlidXRlczsKCiAgICAjIGlmIGEgc2VsZWN0b3IgaXMgc2V0CiAgICBpZiAoICRQYXJhbXtTZWxlY3Rvcn0gKSB7CgogICAgICAgICMgZ2V0IGxpc3Qgb2YgYWxsIGF0dHJpYnV0ZQogICAgICAgIG15ICRBbGxBdHRyaWJ1dGVzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BdHRyaWJ1dGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgbG9va3VwIG9iamVjdCBuYW1lCiAgICAgICAgbXkgJE9iamVjdE5hbWUgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdExvb2t1cCgKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgaWYgKCAhJE9iamVjdE5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPYmplY3RJRCAkUGFyYW17T2JqZWN0SUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGUgbWFwcGluZyBmcm9tIHN5c2NvbmZpZwogICAgICAgIG15ICRPYmplY3RBdHRyaWJ1dGVNYXBwaW5nOwoKICAgICAgICAjIGdldCBtYXBwaW5nIGNvbmZpZyBmb3IgZXhwcmVzc2lvbnMgb3IgYWN0aW9ucwogICAgICAgIGlmICggJFBhcmFte0V4cHJlc3Npb25JRH0gKSB7CiAgICAgICAgICAgICRPYmplY3RBdHRyaWJ1dGVNYXBwaW5nID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSAuICc6Ok1hcHBpbmc6OkV4cHJlc3Npb246Ok9iamVjdDo6QXR0cmlidXRlJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17QWN0aW9uSUR9ICkgewogICAgICAgICAgICAkT2JqZWN0QXR0cmlidXRlTWFwcGluZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgJE9iamVjdE5hbWUgLiAnOjpNYXBwaW5nOjpBY3Rpb246Ok9iamVjdDo6QXR0cmlidXRlJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIGNoYW5nZSBhbmQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgICAgIG15ICRDaGFuZ2VGcmVlVGV4dE1heE51bWJlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpGcmVlVGV4dDo6TWF4TnVtYmVyJyk7CiAgICAgICAgbXkgJFdvcmtPcmRlckZyZWVUZXh0TWF4TnVtYmVyCiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXInKTsKCiAgICAgICAgIyBnZXQgdGhlIHZhbGlkIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QKICAgICAgICBBVFRSSUJVVEVJRDoKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZUlEICgga2V5cyAleyRBbGxBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgYXR0cmlidXRlIGlzIGluIHRoZSBtYXBwaW5nCiAgICAgICAgICAgIGlmICggJE9iamVjdEF0dHJpYnV0ZU1hcHBpbmctPnsgJEFsbEF0dHJpYnV0ZXMtPnskQXR0cmlidXRlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkQXR0cmlidXRlc3skQXR0cmlidXRlSUR9ID0gJEFsbEF0dHJpYnV0ZXMtPnskQXR0cmlidXRlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZ2V0IGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgICAgICAgICBteSAkQXR0cmlidXRlTmFtZSA9ICRBbGxBdHRyaWJ1dGVzLT57JEF0dHJpYnV0ZUlEfTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGl0IGlzIGEgY2hhbmdlIG9yIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZAogICAgICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlTmFtZSA9fiBteyBcQSAoKENoYW5nZXxXb3JrT3JkZXIpIEZyZWUgKEtleXxUZXh0KSkgKFxkKykgfXhtcyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdGhlIElEIGZyb20gdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrIHRoZSBtYXBwaW5nCiAgICAgICAgICAgICAgICAgICAgJEF0dHJpYnV0ZU5hbWUgPSAkMTsKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZSAgICAgICAgPSAkMjsKICAgICAgICAgICAgICAgICAgICBteSAkRmllbGROdW1iZXIgPSAkNDsKCiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3QgdXNlIGZpZWxkcyB3aXRoIGEgaGlnaGVyIG51bWJlciB0aGFuIHRoZSBtYXggbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVHlwZSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEVJRCBpZiAkRmllbGROdW1iZXIgPiAkQ2hhbmdlRnJlZVRleHRNYXhOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlcicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFSUQgaWYgJEZpZWxkTnVtYmVyID4gJFdvcmtPcmRlckZyZWVUZXh0TWF4TnVtYmVyOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgbWFwcGluZyB3aXRob3V0IElELCBidXQgYWRkIHRoZSB0aGUgZmllbGQgd2l0aCBJRAogICAgICAgICAgICAgICAgICAgIGlmICggJE9iamVjdEF0dHJpYnV0ZU1hcHBpbmctPnskQXR0cmlidXRlTmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBdHRyaWJ1dGVzeyRBdHRyaWJ1dGVJRH0gPSAkQWxsQXR0cmlidXRlcy0+eyRBdHRyaWJ1dGVJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHZhbHVlcyAlQXR0cmlidXRlcyApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlICdJRCcgYXQgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIG5pY2VyIGRpc3BsYXkKICAgICAgICAgICAgJEF0dHJpYnV0ZSA9fiBzeyBJRCBceiB9e314bXM7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUF0dHJpYnV0ZXM7Cn0KCiMgZ2V0IG9wZXJhdG9yIGxpc3QgZGF0YQpzdWIgX0dldE9wZXJhdG9yU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0byBzdG9yZSB0aGUgb3BlcmF0b3JzCiAgICBteSAlT3BlcmF0b3JzOwoKICAgICMgaWYgYW4gYXRyaWJ1dGUgaXMgc2V0CiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGVJRH0gKSB7CgogICAgICAgICMgbG9va3VwIG9iamVjdCBuYW1lCiAgICAgICAgbXkgJE9iamVjdE5hbWUgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdExvb2t1cCgKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgaWYgKCAhJE9iamVjdE5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPYmplY3RJRCAkUGFyYW17T2JqZWN0SUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgbXkgJEF0dHJpYnV0ZU5hbWUgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gJFBhcmFte0F0dHJpYnV0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgaWYgKCAhJEF0dHJpYnV0ZU5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBdHRyaWJ1dGVJRCAkUGFyYW17QXR0cmlidXRlSUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3Qgb2YgYWxsIG9wZXJhdG9ycwogICAgICAgIG15ICRBbGxPcGVyYXRvcnMgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9wZXJhdG9yTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgb3BlcmF0b3IgbWFwcGluZyBmcm9tIHN5c2NvbmZpZwogICAgICAgIG15ICRNYXBwaW5nQ29uZmlnOwoKICAgICAgICAjIGdldCBtYXBwaW5nIGNvbmZpZyBmb3IgZXhwcmVzc2lvbnMgb3IgYWN0aW9ucwogICAgICAgIGlmICggJFBhcmFte0V4cHJlc3Npb25JRH0gKSB7CiAgICAgICAgICAgICRNYXBwaW5nQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSAuICc6Ok1hcHBpbmc6OkV4cHJlc3Npb246OkF0dHJpYnV0ZTo6T3BlcmF0b3InCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0FjdGlvbklEfSApIHsKICAgICAgICAgICAgJE1hcHBpbmdDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICRPYmplY3ROYW1lIC4gJzo6TWFwcGluZzo6QWN0aW9uOjpBdHRyaWJ1dGU6Ok9wZXJhdG9yJwogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgdGhlIElEIGZyb20gY2hhbmdlIG9yIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgICAgICAkQXR0cmlidXRlTmFtZSA9fiBzeyBcQSAoKCBDaGFuZ2UgfCBXb3JrT3JkZXIgKSBGcmVlICggS2V5IHwgVGV4dCApKSAoIFxkKyApIH17JDF9eG1zOwoKICAgICAgICBteSAkQXR0cmlidXRlT3BlcmF0b3JNYXBwaW5nOwogICAgICAgIGlmICgkTWFwcGluZ0NvbmZpZykgewogICAgICAgICAgICAkQXR0cmlidXRlT3BlcmF0b3JNYXBwaW5nID0gJE1hcHBpbmdDb25maWctPnskQXR0cmlidXRlTmFtZX0gfHwge307CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGxvd2VkIG9wZXJhdG9ycyBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZQogICAgICAgIE9QRVJBVE9SSUQ6CiAgICAgICAgZm9yIG15ICRPcGVyYXRvcklEICgga2V5cyAleyRBbGxPcGVyYXRvcnN9ICkgewoKICAgICAgICAgICAgIyBnZXQgb3BlcmF0b3IgbmFtZQogICAgICAgICAgICBteSAkT3BlcmF0b3JOYW1lID0gJEFsbE9wZXJhdG9ycy0+eyRPcGVyYXRvcklEfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgb3BlcmF0b3IgaXMgYWxsb3dlZCBmb3IgdGhpcyBhdHRyaWJ1dGUKICAgICAgICAgICAgbmV4dCBPUEVSQVRPUklEIGlmICEkQXR0cmlidXRlT3BlcmF0b3JNYXBwaW5nLT57JE9wZXJhdG9yTmFtZX07CgogICAgICAgICAgICAjIHJlbWVtYmVyIHRoZSBvcGVyYXRvcgogICAgICAgICAgICAkT3BlcmF0b3JzeyRPcGVyYXRvcklEfSA9ICRPcGVyYXRvck5hbWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJU9wZXJhdG9yczsKfQoKIyBnZXQgY29tcGFyZSB2YWx1ZSBsaXN0CnN1YiBfR2V0Q29tcGFyZVZhbHVlU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0byBzdG9yZSB0aGUgY29tcGFyZSB2YWx1ZSBsaXN0CiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9IHt9OwoKICAgICMgaWYgYW4gYXR0cmlidXRlIGlzIHNldAogICAgaWYgKCAkUGFyYW17QXR0cmlidXRlSUR9ICkgewoKICAgICAgICAjIGxvb2t1cCBhdHRyaWJ1dGUgbmFtZQogICAgICAgIG15ICRBdHRyaWJ1dGVOYW1lID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+ICRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgIGlmICggISRBdHRyaWJ1dGVOYW1lICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQXR0cmlidXRlSUQgJFBhcmFte0F0dHJpYnV0ZUlEfSBkb2VzIG5vdCBleGlzdCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb21wYXJlIHZhbHVlIGxpc3QKICAgICAgICAkQ29tcGFyZVZhbHVlTGlzdCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T2JqZWN0Q29tcGFyZVZhbHVlTGlzdCgKICAgICAgICAgICAgT2JqZWN0SUQgICAgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICBBdHRyaWJ1dGVOYW1lID0+ICRBdHRyaWJ1dGVOYW1lLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkQ29tcGFyZVZhbHVlTGlzdDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUVkaXQucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCBjaGFuZ2UgZWRpdCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUVkaXQucG0sdiAxLjQ4IDIwMTAvMDYvMjkgMTM6Mzc6MDEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01DaGFuZ2VDSVBBbGxvY2F0ZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNDggJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01DaGFuZ2VDSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIENoYW5nZUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgY2hhbmdlIGlzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDaGFuZ2UgJyRDaGFuZ2VJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSB0aGlzIHBhZ2UgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KAogICAgICAgIENoYW5nZVRpdGxlIERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24gVGlja2V0SUQKICAgICAgICBPbGRDYXRlZ29yeUlEIENhdGVnb3J5SUQgT2xkSW1wYWN0SUQgSW1wYWN0SUQgT2xkUHJpb3JpdHlJRCBQcmlvcml0eUlECiAgICAgICAgRWxlbWVudENoYW5nZWQgU2F2ZUF0dGFjaG1lbnQgRmlsZUlECiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWd1cmVkIGNoYW5nZSBmcmVldGV4dCBmaWVsZCBudW1iZXJzCiAgICBteSBAQ29uZmlndXJlZENoYW5nZUZyZWVUZXh0RmllbGRzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXRDb25maWd1cmVkRnJlZVRleHRGaWVsZHMoKTsKCiAgICAjIGdldCBjaGFuZ2UgZnJlZXRleHQgcGFyYW1zCiAgICBteSAlQ2hhbmdlRnJlZVRleHRQYXJhbTsKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZENoYW5nZUZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgICMgY29uc2lkZXIgb25seSBmcmVldGV4dCBmaWVsZHMgd2hpY2ggYXJlIGFjdGl2YXRlZCBpbiB0aGlzIGZyb250ZW5kCiAgICAgICAgbmV4dCBOVU1CRVIgaWYgISRTZWxmLT57Q29uZmlnfS0+e0NoYW5nZUZyZWVUZXh0fS0+eyROdW1iZXJ9OwoKICAgICAgICBteSAkS2V5ICAgPSAnQ2hhbmdlRnJlZUtleScgLiAkTnVtYmVyOwogICAgICAgIG15ICRWYWx1ZSA9ICdDaGFuZ2VGcmVlVGV4dCcgLiAkTnVtYmVyOwoKICAgICAgICAkQ2hhbmdlRnJlZVRleHRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJENoYW5nZUZyZWVUZXh0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyBzdG9yZSB0aW1lIHJlbGF0ZWQgZmllbGRzIGluICVHZXRQYXJhbQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1ZXN0ZWRUaW1lfSApIHsKICAgICAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBVc2VkKSkgewogICAgICAgICAgICBteSAkUGFyYW1OYW1lID0gJ1JlcXVlc3RlZFRpbWUnIC4gJFRpbWVQYXJ0OwogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBwZXJmb3JtaW5nIHRoZSBzdWJhY3Rpb24gd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICAjIFRoZSBlbnRyaWVzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgcmVtZW1iZXIgdGhlIG51bWJlcnMgb2YgdGhlIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgd2l0aCB2YWxpZGF0aW9uIGVycm9ycwogICAgbXkgJUNoYW5nZUZyZWVUZXh0VmFsaWRhdGlvbkVycm9yczsKCiAgICAjIGlmIGF0dGFjaG1lbnQgdXBsb2FkIGlzIHJlcXVlc3RlZAogICAgaWYgKCAkR2V0UGFyYW17U2F2ZUF0dGFjaG1lbnR9ICkgewogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICdTYXZlQXR0YWNobWVudCc7CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgJUF0dGFjaG1lbnRzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICApOwoKICAgICMgY2hlY2sgaWYgYXR0YWNobWVudCBzaG91bGQgYmUgZGVsZXRlZAogICAgZm9yIG15ICRBdHRhY2htZW50SUQgKCBrZXlzICVBdHRhY2htZW50cyApIHsKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0RlbGV0ZUF0dGFjaG1lbnQnIC4gJEF0dGFjaG1lbnRJRCApICkgewogICAgICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gPSAnRGVsZXRlQXR0YWNobWVudCc7CiAgICAgICAgfQogICAgfQoKICAgICMga2VlcCBDaGFuZ2VTdGF0ZUlEIG9ubHkgaWYgY29uZmlndXJlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VTdGF0ZX0gKSB7CiAgICAgICAgJEdldFBhcmFte0NoYW5nZVN0YXRlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbmdlU3RhdGVJRCcgKTsKICAgIH0KCiAgICAjIHVwZGF0ZSBjaGFuZ2UKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBjaGVjayB0aGUgdGl0bGUKICAgICAgICBpZiAoICEkR2V0UGFyYW17Q2hhbmdlVGl0bGV9ICkgewogICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFRpdGxlJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgQ0lQCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhDYXRlZ29yeSBJbXBhY3QgUHJpb3JpdHkpKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsiJHtUeXBlfUlEIn0gfHwgJEdldFBhcmFteyIke1R5cGV9SUQifSAhfiBteyBcQSBcZCsgXHogfXhtcyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkJyAuICRUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJENJUElzVmFsaWQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICRHZXRQYXJhbXsiJHtUeXBlfUlEIn0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJENJUElzVmFsaWQgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWQnIC4gJFR5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIHJlcXVlc3RlZCB0aW1lCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1ZXN0ZWRUaW1lfSAmJiAkR2V0UGFyYW17UmVxdWVzdGVkVGltZVVzZWR9ICkgewoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVZZWFyfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNb250aH0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lRGF5fQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17UmVxdWVzdGVkVGltZUhvdXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBmb3JtYXQgYXMgdGltZXN0YW1wLCB3aGVuIGFsbCByZXF1aXJlZCB0aW1lIHBhcmFtcyB3ZXJlIHBhc3NlZAogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWV9ID0gc3ByaW50ZiAnJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwJywKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZVllYXJ9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lRGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVxdWVzdGVkVGltZUhvdXJ9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lTWludXRlfTsKCiAgICAgICAgICAgICAgICAjIHNhbml0eSBjaGVjayBvZiB0aGUgYXNzZW1ibGVkIHRpbWVzdGFtcAogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1JlcXVlc3RlZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBzYXZlIHdoZW4gdGltZSBpcyBpbnZhbGlkCiAgICAgICAgICAgICAgICBpZiAoICEkU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFJlcXVlc3RlZFRpbWUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgaXQgd2FzIGluZGljYXRlZCB0aGF0IHRoZSByZXF1ZXN0ZWQgdGltZSBzaG91bGQgYmUgc2V0LAogICAgICAgICAgICAgICAgIyBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZSByZXF1aXJlZCB0aW1lIHBhcmFtcyBpcyBtaXNzaW5nCiAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFJlcXVlc3RlZFRpbWUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciByZXF1aXJlZCBjaGFuZ2UgZnJlZXRleHQgZmllbGRzIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZENoYW5nZUZyZWVUZXh0RmllbGRzKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0NoYW5nZUZyZWVUZXh0fS0+eyROdW1iZXJ9CiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VGcmVlVGV4dH0tPnskTnVtYmVyfSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkQ2hhbmdlRnJlZVRleHRQYXJhbXsgJ0NoYW5nZUZyZWVUZXh0JyAuICROdW1iZXIgfSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0aGUgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkIG51bWJlciB3aXRoIHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgICAgICAgICAkQ2hhbmdlRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gaW5wdXQgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICBpZiAoICFAVmFsaWRhdGlvbkVycm9ycyAmJiAhJUNoYW5nZUZyZWVUZXh0VmFsaWRhdGlvbkVycm9ycyApIHsKCiAgICAgICAgICAgICMgc2V0dGluZyBvZiBjaGFuZ2Ugc3RhdGUgYW5kIHJlcXVlc3RlZCB0aW1lIGlzIGNvbmZpZ3VyYWJsZQogICAgICAgICAgICBteSAlQWRkaXRpb25hbFBhcmFtOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0NoYW5nZVN0YXRlfSApIHsKICAgICAgICAgICAgICAgICRBZGRpdGlvbmFsUGFyYW17Q2hhbmdlU3RhdGVJRH0gPSAkR2V0UGFyYW17Q2hhbmdlU3RhdGVJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1ZXN0ZWRUaW1lfSApIHsKICAgICAgICAgICAgICAgICRBZGRpdGlvbmFsUGFyYW17UmVxdWVzdGVkVGltZX0gPSAkR2V0UGFyYW17UmVxdWVzdGVkVGltZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZUNoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlVXBkYXRlKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICRHZXRQYXJhbXtKdXN0aWZpY2F0aW9ufSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJEdldFBhcmFte0NoYW5nZVRpdGxlfSwKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICAgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgICAgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICVBZGRpdGlvbmFsUGFyYW0sCiAgICAgICAgICAgICAgICAlQ2hhbmdlRnJlZVRleHRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQ291bGRVcGRhdGVDaGFuZ2UpIHsKCiAgICAgICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gJFNlbGYtPntMYXN0Q2hhbmdlVmlld30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJXYXMgbm90IGFibGUgdG8gdXBkYXRlIENoYW5nZSAkQ2hhbmdlSUQhIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgQUpBWFVwZGF0ZSwgb25seSBmb3Igc2V0dGluZyB0aGUgcHJpb3JpdHkKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIHByaW9yaXRpZXMKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgICAgIFR5cGUgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcHJvcG9zZSBhIHByaW9yaXR5LCBiYXNlZCBvbiB0aGUgY2F0ZWdvcnkgYW5kIHRoZSBpbXBhY3QgdGhlIHByb3Bvc2VkIHAgc2VsZWN0ZWQgcHJpb3JpdHkKICAgICAgICBteSAkUHJvcG9zZWRQcmlvcml0eSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBJbXBhY3RJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBqc29uCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUHJvcG9zZWRQcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4ganNvbgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgYXR0YWNobWVudCBhY3Rpb25zCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZUF0dGFjaG1lbnQnICkgewogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAiQXR0YWNobWVudE5ldyIsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpbGUgd2FzIGFscmVhZHkgdXBsb2FkZWQKICAgICAgICBteSAkRmlsZUFscmVhZHlVcGxvYWRlZCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudEV4aXN0cygKICAgICAgICAgICAgRmlsZW5hbWUgPT4gJFVwbG9hZFN0dWZme0ZpbGVuYW1lfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB3cml0ZSB0byB2aXJ0dWFsIGZzCiAgICAgICAgaWYgKCAkVXBsb2FkU3R1ZmZ7RmlsZW5hbWV9ICYmICEkRmlsZUFscmVhZHlVcGxvYWRlZCApIHsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnRmlsZUFscmVhZHlVcGxvYWRlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVsb2FkIGF0dGFjaG1lbnQgbGlzdAogICAgICAgICAgICAlQXR0YWNobWVudHMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ZpbGVBbHJlYWR5VXBsb2FkZWQnOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGVBdHRhY2htZW50JyApIHsKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJRCAoIGtleXMgJUF0dGFjaG1lbnRzICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0RlbGV0ZUF0dGFjaG1lbnQnIC4gJEF0dGFjaG1lbnRJRCApICkgewoKICAgICAgICAgICAgICAgICMgZGVsZXRlIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgICA9PiAkQXR0YWNobWVudElELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhdHRhY2htZW50IGxpc3QKICAgICAgICAgICAgICAgICVBdHRhY2htZW50cyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gPSAnRGVsZXRlQXR0YWNobWVudCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgYXR0YWNobWVudCBkb3dubG9hZHMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZEF0dGFjaG1lbnQnICkgewoKICAgICAgICAjIGdldCBkYXRhIGZvciBhdHRhY2htZW50CiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBdHRhY2htZW50R2V0KAogICAgICAgICAgICBGaWxlSUQgPT4gJEdldFBhcmFte0ZpbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgICAgIGlmICggISRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkR2V0UGFyYW17RmlsZUlEfSkhIE1heSBiZSBhbiBhdHRhY2shISEiLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgVHlwZSA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBhbGwga2V5cyBmcm9tICVHZXRQYXJhbSB3aGVuIGl0IGlzIG5vIFN1YmFjdGlvbgogICAgZWxzZSB7CiAgICAgICAgJUdldFBhcmFtID0gKCk7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Q2hhbmdlU3RhdGV9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Q2hhbmdlU3RhdGVJRH0gPSAkQ2hhbmdlLT57Q2hhbmdlU3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVlc3RlZFRpbWV9ICYmICRDaGFuZ2UtPntSZXF1ZXN0ZWRUaW1lfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHJlcXVlc3RlZCB0aW1lIGZyb20gdGhlIGNoYW5nZQogICAgICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDaGFuZ2UtPntSZXF1ZXN0ZWRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUgKTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBwYXJhbWV0ZXIgaGFzaCBmb3IgQnVpbGREYXRlU2VsZWN0aW9uKCkKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVVc2VkfSAgID0gMTsKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVNaW51dGV9ID0gJE1pbnV0ZTsKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVIb3VyfSAgID0gJEhvdXI7CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lRGF5fSAgICA9ICREYXk7CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXF1ZXN0ZWRUaW1lTW9udGh9ICA9ICRNb250aDsKICAgICAgICAgICAgJEdldFBhcmFte1JlcXVlc3RlZFRpbWVZZWFyfSAgID0gJFllYXI7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Q2hhbmdlU3RhdGV9ICkgewoKICAgICAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgbGlzdAogICAgICAgIG15ICRDaGFuZ2VQb3NzaWJsZVN0YXRlcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgZHJvcC1kb3duIHdpdGggY2hhbmdlIHN0YXRlcwogICAgICAgIG15ICRTdGF0ZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJENoYW5nZVBvc3NpYmxlU3RhdGVzLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17Q2hhbmdlU3RhdGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHN0YXRlIGRyb3Bkb3duCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlU2VsZWN0aW9uU3RyaW5nID0+ICRTdGF0ZVNlbGVjdGlvblN0cmluZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICdFZGl0JywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CgogICAgICAgICMgdGltZSBwZXJpb2QgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGUgR1VJCiAgICAgICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgICAgICMgYWRkIHNlbGVjdGlvbiBmb3IgdGhlIHRpbWUKICAgICAgICBteSAkVGltZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICA9PiAnUmVxdWVzdGVkVGltZScsCiAgICAgICAgICAgIFJlcXVlc3RlZFRpbWVPcHRpb25hbCA9PiAxLAogICAgICAgICAgICAlVGltZVBlcmlvZCwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBmaWVsZHMKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXF1ZXN0ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnUmVxdWVzdGVkVGltZVN0cmluZycgPT4gJFRpbWVTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBkcm9wZG93biBmb3IgdGhlIGNhdGVnb3J5CiAgICAjIGFsbCBjYXRlZ29yaWVzIGFyZSBzZWxlY3RhYmxlCiAgICAjIHdoZW4gdGhlIGNhdGVnb3J5IGlzIGNoYW5nZWQsIGEgbmV3IHByaW9yaXR5IGlzIHByb3Bvc2VkCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdDYXRlZ29yeScsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICAkUGFyYW17Q2F0ZWdvcnlTZWxlY3Rpb25TdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRDYXRlZ29yaWVzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9IHx8ICRDaGFuZ2UtPntDYXRlZ29yeUlEfSwKICAgICAgICBBamF4ICAgICAgID0+IHsKICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VJRCcsCiAgICAgICAgICAgICAgICAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgICAgICAnSW1wYWN0SUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY3JlYXRlIGRyb3Bkb3duIGZvciB0aGUgaW1wYWN0CiAgICAjIGFsbCBpbXBhY3RzIGFyZSBzZWxlY3RhYmxlCiAgICAjIHdoZW4gdGhlIGltcGFjdCBpcyBjaGFuZ2VkLCBhIG5ldyBwcmlvcml0eSBpcyBwcm9wb3NlZAogICAgbXkgJEltcGFjdHMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgIFR5cGUgICA9PiAnSW1wYWN0JywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRQYXJhbXtJbXBhY3RTZWxlY3Rpb25TdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRJbXBhY3RzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0ltcGFjdElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0gfHwgJENoYW5nZS0+e0ltcGFjdElEfSwKICAgICAgICBBamF4ICAgICAgID0+IHsKICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VJRCcsCiAgICAgICAgICAgICAgICAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgICAgICAnSW1wYWN0SUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY3JlYXRlIGRyb3Bkb3duIGZvciBwcmlvcml0eSwKICAgICMgYWxsIHByaW9yaXRpZXMgYXJlIHNlbGVjdGFibGUKICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICBUeXBlICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRQYXJhbXtQcmlvcml0eVNlbGVjdGlvblN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0gfHwgJENoYW5nZS0+e1ByaW9yaXR5SUR9LAogICAgKTsKCiAgICAjIGdldCB0aGUgY2hhbmdlIGZyZWV0ZXh0IGNvbmZpZyBhbmQgZmlsbHVwIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgZnJvbSBjaGFuZ2UgZGF0YQogICAgbXkgJUNoYW5nZUZyZWVUZXh0Q29uZmlnOwogICAgTlVNQkVSOgogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KENoYW5nZUZyZWVLZXkgQ2hhbmdlRnJlZVRleHQpKSB7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2UgZnJlZXRleHQgZmllbGRzIGZyb20gY2hhbmdlIGlmIHBhZ2UgaXMgbG9hZGVkIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgICAgICAgICAkQ2hhbmdlRnJlZVRleHRQYXJhbXsgJFR5cGUgLiAkTnVtYmVyIH0gfHw9ICRDaGFuZ2UtPnsgJFR5cGUgLiAkTnVtYmVyIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZwogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRUeXBlIC4gJE51bWJlciApOwoKICAgICAgICAgICAgbmV4dCBUWVBFIGlmICEkQ29uZmlnOwogICAgICAgICAgICBuZXh0IFRZUEUgaWYgcmVmICRDb25maWcgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgY2hhbmdlIGZyZWV0ZXh0IGNvbmZpZwogICAgICAgICAgICAkQ2hhbmdlRnJlZVRleHRDb25maWd7ICRUeXBlIC4gJE51bWJlciB9ID0gJENvbmZpZzsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0aGUgY2hhbmdlIGZyZWV0ZXh0IEhUTUwKICAgIG15ICVDaGFuZ2VGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRnJlZVRleHRIVE1MKAogICAgICAgIENvbmZpZyAgICAgICAgICAgICAgICAgICA9PiBcJUNoYW5nZUZyZWVUZXh0Q29uZmlnLAogICAgICAgIENoYW5nZURhdGEgICAgICAgICAgICAgICA9PiBcJUNoYW5nZUZyZWVUZXh0UGFyYW0sCiAgICAgICAgQ29uZmlndXJlZEZyZWVUZXh0RmllbGRzID0+IFxAQ29uZmlndXJlZENoYW5nZUZyZWVUZXh0RmllbGRzLAogICAgKTsKCiAgICAjIHNob3cgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcwogICAgbXkgJENoYW5nZUZyZWVUZXh0U2hvd247CiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgZnJlZXRleHQgZmllbGQgc2hvdWxkIGJlIHNob3duIGluIHRoaXMgZnJvbnRlbmQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0NoYW5nZUZyZWVUZXh0fS0+eyROdW1iZXJ9ICkgewoKICAgICAgICAgICAgIyByZW1lbWJlciB0aGF0IGF0IGxlYXN0IG9uZSBmcmVldGV4dCBmaWVsZCBpcyBzaG93bgogICAgICAgICAgICAkQ2hhbmdlRnJlZVRleHRTaG93biA9IDE7CgogICAgICAgICAgICAjIHNob3cgc2luZ2xlIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBjaGFuZ2UgZnJlZXRleHQgdmFsaWRhdGlvbiBlcnJvciBmb3Igc2luZ2xlIGNoYW5nZSBmcmVldGV4dCBmaWVsZAogICAgICAgICAgICBpZiAoICRDaGFuZ2VGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnN7JE51bWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludmFsaWRDaGFuZ2VGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYWxsIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXlGaWVsZCAgPT4gJENoYW5nZUZyZWVUZXh0SFRNTHsgJ0NoYW5nZUZyZWVLZXlGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHRGaWVsZCA9PiAkQ2hhbmdlRnJlZVRleHRIVE1MeyAnQ2hhbmdlRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGFsbCBjaGFuZ2UgZnJlZXRleHQgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgaWYgKCAkQ2hhbmdlRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkQ2hhbmdlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBzcGFjZSBiZXR3ZWVuIGNoYW5nZSBmcmVldGV4dCBhbmQgY2hhbmdlIHN0YXRlIGlmIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgYXJlIHNob3duCiAgICBpZiAoJENoYW5nZUZyZWVUZXh0U2hvd24pIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlRnJlZVRleHRTcGFjZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBjaGFuZ2UgZnJlZXRleHQgamF2YSBzY3JpcHQgY2hlY2sKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZENoYW5nZUZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgIG5leHQgTlVNQkVSIGlmICEkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VGcmVlVGV4dH0tPnskTnVtYmVyfTsKCiAgICAgICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgY2hhbmdlIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0NoYW5nZUZyZWVUZXh0fS0+eyROdW1iZXJ9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRnJlZUtleUZpZWxkICA9PiAnQ2hhbmdlRnJlZUtleScgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0RmllbGQgPT4gJ0NoYW5nZUZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcwogICAgZm9yIG15ICRCbG9ja05hbWUgKEBWYWxpZGF0aW9uRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAkQmxvY2tOYW1lICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5USUQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnRJRCAoIGtleXMgJUF0dGFjaG1lbnRzICkgewoKICAgICAgICAjIGdldCBpbmZvIGFib3V0IGZpbGUKICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgIEZpbGVJRCA9PiAkQXR0YWNobWVudElELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZm9yIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24KICAgICAgICBuZXh0IEFUVEFDSE1FTlRJRCBpZiAhJEF0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIHNob3cgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAgICAgJXskQXR0YWNobWVudERhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01DaGFuZ2VFZGl0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUhpc3RvcnkucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCBjaGFuZ2UgaGlzdG9yeSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUhpc3RvcnkucG0sdiAxLjQ2IDIwMTAvMDQvMjcgMjA6MzM6NTAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VIaXN0b3J5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5Owp1c2UgS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlsczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNDYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0hpc3RvcnlPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgY2hhbmdlIGlkCiAgICBteSAkQ2hhbmdlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFuZ2VJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJENoYW5nZUlEICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3Qgc2hvdyBoaXN0b3J5LCBhcyBubyBDaGFuZ2VJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGluZm9ybWF0aW9uCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2hhbmdlICckQ2hhbmdlSUQnIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgU3RvcmUgTGFzdFNjcmVlbkhpc3RvcnksIGZvciBiYWNrbGlua3MgaW4gSGlzdG9yeVpvb20KICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkhpc3RvcnknLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IGhpc3RvcnkgZW50cmllcwogICAgbXkgJEhpc3RvcnlFbnRyaWVzUmVmID0gJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+Q2hhbmdlSGlzdG9yeUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKSB8fCBbXTsKCiAgICAjIGdldCBvcmRlciBkaXJlY3Rpb24KICAgIG15IEBIaXN0b3J5TGluZXMgPSBAeyRIaXN0b3J5RW50cmllc1JlZn07CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6SGlzdG9yeU9yZGVyJykgZXEgJ3JldmVyc2UnICkgewogICAgICAgIEBIaXN0b3J5TGluZXMgPSByZXZlcnNlIEB7JEhpc3RvcnlFbnRyaWVzUmVmfTsKICAgIH0KCiAgICAjIG1heCBsZW5ndGggb2Ygc3RyaW5ncwogICAgbXkgJE1heExlbmd0aCA9IDMwOwoKICAgICMgY3JlYXRlIHRhYmxlCiAgICBteSAkQ291bnRlciA9IDE7CiAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoQEhpc3RvcnlMaW5lcykgewogICAgICAgICRDb3VudGVyKys7CgogICAgICAgICMgZGF0YSBmb3IgYSBzaW5nbGUgcm93LCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZHRsCiAgICAgICAgbXkgJURhdGEgPSAleyRIaXN0b3J5RW50cnl9OwoKICAgICAgICAjIGRldGVybWluZSB3aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIG15ICRIaXN0b3J5VHlwZSA9ICRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZX07CiAgICAgICAgaWYgKAogICAgICAgICAgICAkSGlzdG9yeVR5cGUgPX4gbXsKICAgICAgICAgICAgICAgIFxBCiAgICAgICAgICAgICAgICAoPzogKD86IENoYW5nZSB8IENoYW5nZUNBQiB8IFdvcmtPcmRlciApIFVwZGF0ZSApCiAgICAgICAgICAgICAgICB8ICg/OiAoPzogQ29uZGl0aW9uIHwgRXhwcmVzc2lvbiB8IEFjdGlvbiApICg/OiBBZGQgfCBVcGRhdGUgfCBEZWxldGUgfCBEZWxldGVBbGwgfCBFeGVjdXRlICkgKQogICAgICAgICAgICAgICAgXHoKICAgICAgICAgICAgfXhtcwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBUaGUgZGlzcGxheWVkIGZpZWxkbmFtZSBtaWdodCBiZSBjaGFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgbG9vcAogICAgICAgICAgICBteSAkRGlzcGxheWVkRmllbGRuYW1lID0gJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX07CgogICAgICAgICAgICAjIHNldCBkZWZhdWx0IHZhbHVlcyBmb3Igc29tZSBrZXlzCiAgICAgICAgICAgIGZvciBteSAkQ29udGVudE5ld09yT2xkIChxdyhDb250ZW50TmV3IENvbnRlbnRPbGQpKSB7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSApIHsKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPSAnLSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gfHw9ICcnOwoKICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGUgSUQgZmllbGRzLCB3ZSByZXBsYWNlIElEIHdpdGggaXRzIHRleHR1YWwgdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkVHlwZSkgPSAkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSA9fiBtewogICAgICAgICAgICAgICAgICAgICAgICAgICAgXEEgICAgICAgICAgIyBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICMgc3RhcnQgY2FwdHVyZSBvZiAkVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5IHwgSW1wYWN0IHwgUHJpb3JpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENoYW5nZVN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXb3JrT3JkZXJTdGF0ZSB8IFdvcmtPcmRlclR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdvcmtPcmRlckFnZW50IHwgQ2hhbmdlQnVpbGRlciB8IENoYW5nZU1hbmFnZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPYmplY3QgfCBBdHRyaWJ1dGUgfCBPcGVyYXRvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgIyBlbmQgY2FwdHVyZSBvZiAkVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgIyBwcm9jZXNzaW5nIG9ubHkgZm9yIHRoZSAnSUQnIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICB9eG1zCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0aW9uTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFR5cGUgZXEgJ1dvcmtPcmRlclN0YXRlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVHlwZSBlcSAnV29ya09yZGVyVHlwZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJUeXBlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgPT4gJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdDaGFuZ2VTdGF0ZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHlwZSAgICBlcSAnV29ya09yZGVyQWdlbnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFR5cGUgZXEgJ0NoYW5nZUJ1aWxkZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFR5cGUgZXEgJ0NoYW5nZU1hbmFnZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbG9naW4gbmFtZXMgYXJlIG5vdCB0byBiZSB0cmFuc2xhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRyYW5zbGF0aW9uTmVlZGVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHlwZSAgICBlcSAnQ2F0ZWdvcnknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFR5cGUgZXEgJ0ltcGFjdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkVHlwZSBlcSAnUHJpb3JpdHknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVHlwZSBlcSAnVmFsaWQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ09iamVjdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5PYmplY3RMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElEID0+ICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdBdHRyaWJ1dGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+QXR0cmlidXRlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVHlwZSBlcSAnT3BlcmF0b3InICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlVua25vd24gdHlwZSAnJFR5cGUnIGVuY291bnRlcmVkISIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFLmcuIHRoZSB1c2VybmFtZXMgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRlZFZhbHVlID0gJFRyYW5zbGF0aW9uTmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9IHNwcmludGYgJyVzIChJRD0lcyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUcmFuc2xhdGVkVmFsdWUsICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9ICctJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29udGVudCBoYXMgY2hhbmdlZCwgc28gY2hhbmdlIHRoZSBkaXNwbGF5ZWQgZmllbGRuYW1lIGFzIHdlbGwKICAgICAgICAgICAgICAgICAgICAgICAgJERpc3BsYXllZEZpZWxkbmFtZSA9ICRUeXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRIaXN0b3J5RW50cnktPntGaWVsZG5hbWV9IGVxICdDQUJDdXN0b21lcnMnICkgewoKICAgICAgICAgICAgICAgICAgICAgICMgQ29udGVudE5ldyBhbmQgQ29udGVudE9sZCBjb250YWluIGEgJyUlJyBzZXBlcmF0ZWQgbGlzdCBvZiBjdXN0b21lciB1c2VyIGlkcwogICAgICAgICAgICAgICAgICAgICAgIyByZWZvcm1hdCBpdCBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9fiBzeyAlICUgfXssfXhtc2c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gZXEgJ0NBQkFnZW50cycgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIENvbnRlbnROZXcgYW5kIENvbnRlbnRPbGQgY29udGFpbiBhICclJScgc2VwZXJhdGVkIGxpc3Qgb2YgdXNlciBpZHMKICAgICAgICAgICAgICAgICAgICAgICAgIyBsb29rIHVwIHRoZSBsb2dpbiBuYW1lcyBmcm9tIHRoZSB1c2VyIGlkcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3JtYXQgaXQgYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdAogICAgICAgICAgICAgICAgICAgICAgICBteSBAVXNlcklEcyA9IHNwbGl0IG0vJSUvLCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH07CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBVc2VyTG9naW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1hcCB7ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMb29rdXAoIFVzZXJJRCA9PiAkXyApIH0gQFVzZXJJRHM7CiAgICAgICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9IGpvaW4gJywnLCBAVXNlckxvZ2luczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBIVE1MIGJyZWFrcyB3aXRoIHNpbmdsZSBzcGFjZQogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9fiBzeyA8IGJyIFxzKiAvPyA+IH17IH14bXNnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRyYW5zbGF0ZSBmaWVsZG5hbWUgZm9yIGRpc3BsYXkKICAgICAgICAgICAgJERpc3BsYXllZEZpZWxkbmFtZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgJERpc3BsYXllZEZpZWxkbmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdHJpbSBzdHJpbmdzIHRvIGEgbWF4IGxlbmd0aCBvZiAkTWF4TGVuZ3RoCiAgICAgICAgICAgIG15ICRDb250ZW50TmV3ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSB8fCAnLScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDb250ZW50T2xkID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfSB8fCAnLScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgWy4uLl0gZm9yIHRvbyBsb25nIHN0cmluZ3MKICAgICAgICAgICAgZm9yIG15ICRDb250ZW50ICggJENvbnRlbnROZXcsICRDb250ZW50T2xkICkgewogICAgICAgICAgICAgICAgaWYgKCAkQ29udGVudCAmJiAoIGxlbmd0aCAkQ29udGVudCA+ICRNYXhMZW5ndGggKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udGVudCA9IHN1YnN0ciggJENvbnRlbnQsIDAsICRNYXhMZW5ndGggKSAuICdbLi4uXSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IGRlc2NyaXB0aW9uCiAgICAgICAgICAgICREYXRhe0NvbnRlbnR9ID0gam9pbiAnJSUnLCAkRGlzcGxheWVkRmllbGRuYW1lIHx8ICcnLCAkQ29udGVudE5ldywgJENvbnRlbnRPbGQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fTsKICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSB0ZXh0CiAgICAgICAgaWYgKCAkRGF0YXtDb250ZW50fSApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgJSUKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPX4gc3sgXEEgJSUgfXt9eG1zZzsKCiAgICAgICAgICAgICMgc3BsaXQgdGhlIGNvbnRlbnQgYnkgJSUKICAgICAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0KCAvJSUvLCAkRGF0YXtDb250ZW50fSApOwoKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPSAnJzsKCiAgICAgICAgICAgICMgY2xlYW4gdGhlIHZhbHVlcwogICAgICAgICAgICBmb3IgbXkgJFZhbHVlIChAVmFsdWVzKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NvbnRlbnR9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0NvbnRlbnR9IC49ICciLCAnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICREYXRhe0NvbnRlbnR9IC49IHFxeyIkVmFsdWV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdlIG5lZWQgYXQgbGVhc3QgYSBkb3VibGUgcXVvdGUKICAgICAgICAgICAgaWYgKCAhJERhdGF7Q29udGVudH0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICciICc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZm9yIHdoYXQgaXRlbSB0eXBlIGlzIHRoaXMgaGlzdG9yeSBlbnRyeQogICAgICAgICAgICBteSAkSGlzdG9yeUl0ZW1UeXBlID0gJ0NoYW5nZSc7CiAgICAgICAgICAgIGlmICggJEhpc3RvcnlUeXBlID1+IG17IFxBIFdvcmtPcmRlciB9eG1zICkgewogICAgICAgICAgICAgICAgJEhpc3RvcnlJdGVtVHlwZSA9ICdXb3JrT3JkZXInOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciB3b3Jrb3JkZXIgZW50cmllcyB0aGF0IHN0aWxsIGV4aXN0cywgc2hvdyB3b3Jrb3JkZXJpZAogICAgICAgICAgICBteSAkSGlzdG9yeUVudHJ5VHlwZSA9ICREYXRhe0hpc3RvcnlUeXBlfTsKICAgICAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5LT57V29ya09yZGVySUR9ICkgewogICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeVR5cGUgLj0gJ1dpdGhXb3JrT3JkZXJJRCc7CiAgICAgICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICciJyAuICRIaXN0b3J5RW50cnktPntXb3JrT3JkZXJJRH0gLiAnIiwgJyAuICREYXRhe0NvbnRlbnR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBjb25kaXRpb24gYWRkIHdpdGggaWQKICAgICAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5VHlwZSBlcSAnQ29uZGl0aW9uQWRkJyAmJiAhJEhpc3RvcnlFbnRyeS0+e0ZpZWxkbmFtZX0gKSB7CiAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5VHlwZSAuPSAnSUQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhhbmRsZSBleHByZXNzaW9uIGFkZCB3aXRoIGlkCiAgICAgICAgICAgIGlmICggJEhpc3RvcnlFbnRyeVR5cGUgZXEgJ0V4cHJlc3Npb25BZGQnICYmICEkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSApIHsKICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnlUeXBlIC49ICdJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGxlIGFjdGlvbiBhZGQgd2l0aCBpZAogICAgICAgICAgICBpZiAoICRIaXN0b3J5RW50cnlUeXBlIGVxICdBY3Rpb25BZGQnICYmICEkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSApIHsKICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnlUeXBlIC49ICdJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGFuZGxlIGFjdGlvbiBleGVjdXRlCiAgICAgICAgICAgIGlmICggJEhpc3RvcnlFbnRyeVR5cGUgZXEgJ0FjdGlvbkV4ZWN1dGUnICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGNvbnRlbnQgZWxlbWVudHMKICAgICAgICAgICAgICAgIG15IEBBY3Rpb25FeGVjdXRlRGF0YSA9IHNwbGl0IC8sLywgJERhdGF7Q29udGVudH07CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHJlc3VsdAogICAgICAgICAgICAgICAgbXkgJEFjdGlvbkV4ZWN1dGVSZXN1bHQKICAgICAgICAgICAgICAgICAgICA9ICggJEFjdGlvbkV4ZWN1dGVEYXRhWzFdID1+IG17ICggdW5zdWNjZXNzZnVsbHkgfCBzdWNjZXNzZnVsbHkgKSB9eG1zIClbMF07CgogICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgcmVzdWx0CiAgICAgICAgICAgICAgICAkQWN0aW9uRXhlY3V0ZURhdGFbMV0gPSAnICInIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeVR5cGUgLiAnOjonIC4gJEFjdGlvbkV4ZWN1dGVSZXN1bHQsCiAgICAgICAgICAgICAgICApIC4gJyInOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGNvbnRlbnQgZm9yIHRyYW5zbGF0aW9uCiAgICAgICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9IGpvaW4gJywnLCBAQWN0aW9uRXhlY3V0ZURhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyAnbmljZScgb3V0cHV0IHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9uCiAgICAgICAgICAgICMgc2FtcGxlIGlucHV0OgogICAgICAgICAgICAjIENoYW5nZUhpc3Rvcnk6OkNoYW5nZUxpbmtBZGQiLCAiVGlja2V0IiwgIjEKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICRIaXN0b3J5SXRlbVR5cGUgLiAnSGlzdG9yeTo6JyAuICRIaXN0b3J5RW50cnlUeXBlIC4gJyIsICcgLiAkRGF0YXtDb250ZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIG5vdCBuZWVkZWQgcGxhY2UgaG9sZGVyCiAgICAgICAgICAgICREYXRhe0NvbnRlbnR9ID1+IHN7ICUgcyB9e314bXNnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXBhcmF0ZSBlYWNoIHNlYXJjaHJlc3VsdCBsaW5lIGJ5IHVzaW5nIHNldmVyYWwgY3NzCiAgICAgICAgJERhdGF7Y3NzfSA9ICRDb3VudGVyICUgMiA/ICdzZWFyY2hwYXNzaXZlJyA6ICdzZWFyY2hhY3RpdmUnOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGEgJ21vcmUgaW5mbycgbGluawogICAgICAgIGlmICgKICAgICAgICAgICAgKCAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30gJiYgbGVuZ3RoKCAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30gKSA+ICRNYXhMZW5ndGggKQogICAgICAgICAgICB8fCAoICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfSAmJiBsZW5ndGgoICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfSApID4gJE1heExlbmd0aCApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGlzIGl0IGEgQ2hhbmdlSGlzdG9yeVpvb20gb3IgYSBXb3JrT3JkZXJIaXN0b3J5Wm9vbT8KICAgICAgICAgICAgbXkgJFpvb21UeXBlID0gJ0NoYW5nZSc7CgogICAgICAgICAgICBpZiAoICRIaXN0b3J5VHlwZSA9fiBteyBcQSBXb3JrT3JkZXIgfXhtcyAmJiAkSGlzdG9yeUVudHJ5LT57V29ya09yZGVySUR9ICkgewogICAgICAgICAgICAgICAgJFpvb21UeXBlID0gJ1dvcmtPcmRlcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBoaXN0b3J5em9vbSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSGlzdG9yeVpvb20nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgWm9vbVR5cGUgPT4gJFpvb21UeXBlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZG9uJ3Qgc2hvdyBhIGxpbmsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hpc3Rvcnlab29tRGFzaCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgbGluayB0byB3b3Jrb3JkZXIgZm9yIFdvcmtPcmRlckFkZCBldmVudCAtIGlmIHRoZSB3b3Jrb3JkZXIgc3RpbGwgZXhpc3RzCiAgICAgICAgaWYgKCAkSGlzdG9yeUVudHJ5LT57SGlzdG9yeVR5cGV9ID1+IG17IFxBIFdvcmtPcmRlciB9eG1zICYmICRIaXN0b3J5RW50cnktPntXb3JrT3JkZXJJRH0gKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgbGluawogICAgICAgICAgICBpZiAoJFdvcmtPcmRlcikgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJab29tJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRvbid0IHNob3cgYW55IGxpbmsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Rhc2gnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAnQ2hhbmdlSGlzdG9yeScsCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZUhpc3RvcnknLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgY2hhbmdlIGhpc3Rvcnkgem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tLnBtLHYgMS43IDIwMTAvMDEvMzEgMTM6NTE6MDEgbWFlIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnktPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIGNoYW5nZSBpZAogICAgbXkgJEhpc3RvcnlFbnRyeUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnSGlzdG9yeUVudHJ5SUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRIaXN0b3J5RW50cnlJRCApIHsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IHNob3cgaGlzdG9yeSB6b29tLCBubyBIaXN0b3J5RW50cnlJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGhpc3RvcnkgZW50cmllcwogICAgbXkgJEhpc3RvcnlFbnRyeSA9ICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlFbnRyeUdldCgKICAgICAgICBIaXN0b3J5RW50cnlJRCA9PiAkSGlzdG9yeUVudHJ5SUQsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkSGlzdG9yeUVudHJ5ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJIaXN0b3J5RW50cnkgJyRIaXN0b3J5RW50cnlJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkSGlzdG9yeUVudHJ5LT57Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGluZm9ybWF0aW9uCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJEhpc3RvcnlFbnRyeS0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNoYW5nZSAnJEhpc3RvcnlFbnRyeS0+e0NoYW5nZUlEfScgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGRhc2ggKCctJykgd2hlbiB0aGUgZmllbGQgaXMgZW1wdHkKICAgIGZvciBteSAkRmllbGQgKHF3KENvbnRlbnROZXcgQ29udGVudE9sZCkpIHsKICAgICAgICAkSGlzdG9yeUVudHJ5LT57JEZpZWxkfSB8fD0gJy0nCiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gJ0NoYW5nZUhpc3Rvcnlab29tJywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgaGFuZGxlIGNvbmRpdGlvbiB1cGRhdGUKICAgIGlmICggJEhpc3RvcnlFbnRyeS0+e0hpc3RvcnlUeXBlfSBlcSAnQ29uZGl0aW9uVXBkYXRlJyApIHsKICAgICAgICAkSGlzdG9yeUVudHJ5LT57Q29udGVudE5ld30gPX4gc3sgXEEgXGQrICUlICguKykgXHogfXskMX14bXM7CiAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnRPbGR9ID1+IHN7IFxBIFxkKyAlJSAoLispIFx6IH17JDF9eG1zOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskSGlzdG9yeUVudHJ5fSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucy5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IGNoYW5nZSBpbnZvbHZlZCBwZXJzb25zIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zLnBtLHYgMS4zNyAyMDEwLzA1LzEyIDE2OjIzOjQ0IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMzcgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBDaGFuZ2VJRAogICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbmdlSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDaGFuZ2VJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgaXMgZm91bmQKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNoYW5nZSAnJENoYW5nZUlEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGFsbCBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiAgICAgICAgcXcoQ2hhbmdlQnVpbGRlciBDaGFuZ2VNYW5hZ2VyIE5ld0NBQk1lbWJlciBDQUJUZW1wbGF0ZQogICAgICAgIEV4cGFuZEJ1aWxkZXIxIEV4cGFuZEJ1aWxkZXIyIEV4cGFuZE1hbmFnZXIxIEV4cGFuZE1hbmFnZXIyCiAgICAgICAgRXhwYW5kQ0FCTWVtYmVyMSBFeHBhbmRDQUJNZW1iZXIyIENBQk1lbWJlclR5cGUgQ0FCTWVtYmVySUQKICAgICAgICBDaGFuZ2VCdWlsZGVySUQgQ2hhbmdlTWFuYWdlcklEIFNlbGVjdGVkVXNlcjEgU2VsZWN0ZWRVc2VyMgogICAgICAgIE1lbWJlcklEIENsZWFyQ0FCTWVtYmVyIENsZWFyVXNlcjEgQ2xlYXJVc2VyMgogICAgICAgIEFkZENBQk1lbWJlciBBZGRDQUJUZW1wbGF0ZSBUZW1wbGF0ZUlEKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIFJlbWVtYmVyIHRoZSByZWFzb24gd2h5IHNhdmluZyB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGVudHJpZXMgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHRsIHZhbGlkYXRpb24gZXJyb3IgYmxvY2tzLgogICAgbXkgQFZhbGlkYXRpb25FcnJvcnM7CgogICAgIyB0aGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgdXNlciByZXF1ZXN0cyB3aGVuIGF1dG9jb21wbGV0aW9uIGlzIHR1cm5lZCBvZmYKICAgICMgJUV4cGFuZEluZm8gZ2V0cyBpbmZvIGFib3V0IGNob3NlbiB1c2VyIGFuZCBhbGwgYXZhaWxhYmxlIHVzZXJzCiAgICBteSAlRXhwYW5kSW5mbzsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CgogICAgICAgICMgY2hhbmdlIG1hbmFnZXIgYW5kIGNoYW5nZSBidWlsZGVyIGFyZSByZXF1aXJlZCBmb3IgYW4gdXBkYXRlCiAgICAgICAgbXkgJUVycm9yQWxsUmVxdWlyZWQgPSAkU2VsZi0+X0NoZWNrQ2hhbmdlTWFuYWdlckFuZENoYW5nZUJ1aWxkZXIoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGlzIGEgInNlYXJjaCB1c2VyIiBidXR0b24gY2xpY2tlZAogICAgICAgIG15ICRFeHBhbmRVc2VyID0gJEdldFBhcmFte0V4cGFuZEJ1aWxkZXIxfSB8fCAkR2V0UGFyYW17RXhwYW5kQnVpbGRlcjJ9CiAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtFeHBhbmRNYW5hZ2VyMX0gICB8fCAkR2V0UGFyYW17RXhwYW5kTWFuYWdlcjJ9CiAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtFeHBhbmRDQUJNZW1iZXIxfSB8fCAkR2V0UGFyYW17RXhwYW5kQ0FCTWVtYmVyMn07CgogICAgICAgICMgaXMgYSAiY2xlYXIgdXNlciIgYnV0dG9uIGNsaWNrZWQKICAgICAgICBteSAkQ2xlYXJVc2VyID0gJEdldFBhcmFte0NsZWFyVXNlcjF9IHx8ICRHZXRQYXJhbXtDbGVhclVzZXIyfSB8fCAkR2V0UGFyYW17Q2xlYXJDQUJNZW1iZXJ9OwoKICAgICAgICAjIGlzIGNhYiBtZW1iZXIgZGVsZXRlIHJlcXVlc3RlZAogICAgICAgIG15ICVEZWxldGVNZW1iZXIgPSAkU2VsZi0+X0lzTWVtYmVyRGVsZXRpb24oCiAgICAgICAgICAgIENoYW5nZSA9PiAkQ2hhbmdlLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIGNoYW5nZQogICAgICAgIGlmICggJEdldFBhcmFte0FkZENBQk1lbWJlcn0gJiYgJEdldFBhcmFte05ld0NBQk1lbWJlcn0gKSB7CgogICAgICAgICAgICAjIGFkZCBhIG1lbWJlcgogICAgICAgICAgICBteSAlQ0FCVXBkYXRlSW5mbyA9ICRTZWxmLT5fSXNOZXdDQUJNZW1iZXJPaygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIENoYW5nZSA9PiAkQ2hhbmdlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiBtZW1iZXIgaXMgdmFsaWQKICAgICAgICAgICAgaWYgKCVDQUJVcGRhdGVJbmZvKSB7CgogICAgICAgICAgICAgICAgIyB1cGRhdGUgY2hhbmdlIENBQgogICAgICAgICAgICAgICAgbXkgJENvdWxkVXBkYXRlQ0FCID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VDQUJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgJUNBQlVwZGF0ZUluZm8sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgaWYgdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICBpZiAoJENvdWxkVXBkYXRlQ0FCKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IG5ldyBjaGFuZ2UgZGF0YSBhcyBhIG1lbWJlciB3YXMgYWRkZWQKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBkaXNwbGF5IGEgbmFtZSBpbiBhdXRvY29tcGxldGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAjIGFuZCBkbyBub3Qgc2V0IHZhbHVlcyBpbiBoaWRkZW4gZmllbGRzIGFzIHRoZQogICAgICAgICAgICAgICAgICAgICMgdXNlciB3YXMgYWxyZWFkeSBhZGRlZAogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBAR2V0UGFyYW17cXcoTmV3Q0FCTWVtYmVyIENBQk1lbWJlclR5cGUgQ0FCTWVtYmVySUQpfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJXYXMgbm90IGFibGUgdG8gdXBkYXRlIENoYW5nZSBDQUIgZm9yIENoYW5nZSAkQ2hhbmdlSUQhIiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBtZW1iZXIgaXMgaW52YWxpZAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52YWxpZENBQk1lbWJlcicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEdldFBhcmFte0FkZENBQlRlbXBsYXRlfSApIHsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RlbXBsYXRlSUR9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIENBQiBiYXNlZCBvbiB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgICAgIG15ICRDcmVhdGVkSUQgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVEZVNlcmlhbGl6ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byBpbnZvbHZlZCBwZXJzb24sIHdoZW4gYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucyZDaGFuZ2VJRD0kQ2hhbmdlSUQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBub3RpZnkgYWJvdXQgdGhlIG1pc3NpbmcgdGVtcGxhdGUgaWQKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRUZW1wbGF0ZSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkRXhwYW5kVXNlcikgewoKICAgICAgICAgICAgIyBnZXQgdXNlciBpbmZvIHdoZW4gYXV0b2NvbXBsZXRpb24gaXMgdHVybmVkIG9mZgogICAgICAgICAgICAlRXhwYW5kSW5mbyA9ICRTZWxmLT5fR2V0RXhwYW5kSW5mbyglR2V0UGFyYW0pOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJENsZWFyVXNlcikgewoKICAgICAgICAgICAgIyB3aGljaCBmaWVsZHMgdG8gY2xlYXIKICAgICAgICAgICAgbXkgJUZpZWxkTWFwID0gKAogICAgICAgICAgICAgICAgQ2xlYXJVc2VyMSAgICAgPT4gW3F3KENoYW5nZU1hbmFnZXIgU2VsZWN0ZWRVc2VyMSldLAogICAgICAgICAgICAgICAgQ2xlYXJVc2VyMiAgICAgPT4gW3F3KENoYW5nZU1hbmFnZXIgU2VsZWN0ZWRVc2VyMildLAogICAgICAgICAgICAgICAgQ2xlYXJDQUJNZW1iZXIgPT4gW3F3KE5ld0NBQk1lbWJlciBDQUJNZW1iZXJJRCBDQUJNZW1iZXJUeXBlKV0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFjdHVhbGx5IGNsZWFyIHRoZSBmaWVsZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZAogICAgICAgICAgICBteSAkRmllbGRzID0gJEZpZWxkTWFweyRDbGVhclVzZXJ9IHx8IFtdOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskRmllbGRzfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskRmllbGR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCVEZWxldGVNZW1iZXIpIHsKCiAgICAgICAgICAgICMgZmluZCB1c2VycyB3aG8gYXJlIHN0aWxsIG1lbWJlciBvZiBDQUIKICAgICAgICAgICAgbXkgJFR5cGUgPSAkRGVsZXRlTWVtYmVye1R5cGV9OwogICAgICAgICAgICBteSBAU3RpbGxNZW1iZXJzID0gZ3JlcCB7ICRfIG5lICREZWxldGVNZW1iZXJ7SUR9IH0gQHsgJENoYW5nZS0+eyRUeXBlfSB9OwoKICAgICAgICAgICAgIyB1cGRhdGUgQ2hhbmdlQ0FCCiAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZUNBQk1lbWJlciA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0FCVXBkYXRlKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICRUeXBlICAgID0+IFxAU3RpbGxNZW1iZXJzLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBzdWNjZXNzZnVsIHVwZGF0ZQogICAgICAgICAgICBpZiAoICEkQ291bGRVcGRhdGVDQUJNZW1iZXIgKSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldhcyBub3QgYWJsZSB0byB1cGRhdGUgQ2hhbmdlIENBQiBmb3IgQ2hhbmdlICRDaGFuZ2VJRCEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgbmV3IGNoYW5nZSBkYXRhIGFzIGEgbWVtYmVyIHdhcyByZW1vdmVkCiAgICAgICAgICAgICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggISVFcnJvckFsbFJlcXVpcmVkICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgY2hhbmdlCiAgICAgICAgICAgIG15ICRDYW5VcGRhdGVDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVVwZGF0ZSgKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJEdldFBhcmFte1NlbGVjdGVkVXNlcjF9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRHZXRQYXJhbXtTZWxlY3RlZFVzZXIyfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIHN1Y2Nlc3NmdWwgdXBkYXRlCiAgICAgICAgICAgIGlmICgkQ2FuVXBkYXRlQ2hhbmdlKSB7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byBjaGFuZ2Ugem9vbSBtYXNrCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAkU2VsZi0+e0xhc3RDaGFuZ2VWaWV3fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldhcyBub3QgYWJsZSB0byB1cGRhdGUgQ2hhbmdlICRDaGFuZ2VJRCEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoJUVycm9yQWxsUmVxdWlyZWQpIHsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlIGZvciBjaGFuZ2UgYnVpbGRlcgogICAgICAgICAgICBpZiAoICRFcnJvckFsbFJlcXVpcmVke0NoYW5nZUJ1aWxkZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkQ2hhbmdlQnVpbGRlcicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSBmb3IgY2hhbmdlIG1hbmFnZXIKICAgICAgICAgICAgaWYgKCAkRXJyb3JBbGxSZXF1aXJlZHtDaGFuZ2VNYW5hZ2VyfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52YWxpZENoYW5nZU1hbmFnZXInLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcyBpZiBpdCBpcyBub3QgJ1NhdmUnIHN1YmFjdGlvbgogICAgZWxzZSB7CgogICAgICAgICMgaW5pdGlhbGl6ZSB2YXJpYWJsZXMKICAgICAgICBteSAkQ2hhbmdlTWFuYWdlciA9ICcnOwogICAgICAgIG15ICRDaGFuZ2VCdWlsZGVyID0gJyc7CgogICAgICAgICMgZ2V0IGNoYW5nZW1hbmFnZXIgc3RyaW5nCiAgICAgICAgaWYgKCAkQ2hhbmdlLT57Q2hhbmdlTWFuYWdlcklEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZW1hbmFnZXIgZGF0YQogICAgICAgICAgICBteSAlQ2hhbmdlTWFuYWdlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDaGFuZ2VNYW5hZ2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVDaGFuZ2VNYW5hZ2VyKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCBzdHJpbmcgdG8gZGlzcGxheQogICAgICAgICAgICAgICAgJENoYW5nZU1hbmFnZXIgPSBzcHJpbnRmICciJXMgJXMiIDwlcz4nLAogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VNYW5hZ2Vye1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VNYW5hZ2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZU1hbmFnZXJ7VXNlckVtYWlsfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2hhbmdlYnVpbGRlciBzdHJpbmcKICAgICAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgY2hhbmdlYnVpbGRlciBkYXRhCiAgICAgICAgICAgIG15ICVDaGFuZ2VCdWlsZGVyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJENoYW5nZS0+e0NoYW5nZUJ1aWxkZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJUNoYW5nZUJ1aWxkZXIpIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIHN0cmluZyB0byBkaXNwbGF5CiAgICAgICAgICAgICAgICAkQ2hhbmdlQnVpbGRlciA9IHNwcmludGYgJyIlcyAlcyIgPCVzPicsCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZUJ1aWxkZXJ7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICAgICAgJENoYW5nZUJ1aWxkZXJ7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlQnVpbGRlcntVc2VyRW1haWx9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGZpbGwgR2V0UGFyYW0gaGFzaAogICAgICAgICVHZXRQYXJhbSA9ICgKICAgICAgICAgICAgU2VsZWN0ZWRVc2VyMSA9PiAkQ2hhbmdlLT57Q2hhbmdlTWFuYWdlcklEfSwKICAgICAgICAgICAgU2VsZWN0ZWRVc2VyMiA9PiAkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfSwKICAgICAgICAgICAgQ2hhbmdlTWFuYWdlciA9PiAkQ2hhbmdlTWFuYWdlciwKICAgICAgICAgICAgQ2hhbmdlQnVpbGRlciA9PiAkQ2hhbmdlQnVpbGRlciwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhbGwgYWdlbnQgbWVtYmVycyBvZiBDQUIKICAgIFVTRVJJRDoKICAgIGZvciBteSAkVXNlcklEICggQHsgJENoYW5nZS0+e0NBQkFnZW50c30gfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBuZXh0IGlmIG5vIHVzZXIgZGF0YSBjYW4gYmUgZm91bmQKICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJVVzZXI7CgogICAgICAgICMgZGlzcGxheSBjYWIgbWVtYmVyIGluZm8KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBZ2VudENBQicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVVzZXIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWxsIGN1c3RvbWVyIG1lbWJlcnMgb2YgQ0FCCiAgICBDVVNUT01FUkxPR0lOOgogICAgZm9yIG15ICRDdXN0b21lckxvZ2luICggQHsgJENoYW5nZS0+e0NBQkN1c3RvbWVyc30gfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciAgPT4gJEN1c3RvbWVyTG9naW4sCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBuZXh0IGlmIG5vIHVzZXIgZGF0YSBjYW4gYmUgZm91bmQKICAgICAgICBuZXh0IENVU1RPTUVSTE9HSU4gaWYgISVDdXN0b21lclVzZXI7CgogICAgICAgICMgZGlzcGxheSBjYWIgbWVtYmVyIGluZm8KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckNBQicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUN1c3RvbWVyVXNlciwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgY2hhbmdlYnVpbGRlciBhbmQgY2hhbmdlbWFuYWdlciBzZWFyY2ggYXV0b2NvbXBsZXRlIGZpZWxkCiAgICBteSAkVXNlckF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlJyk7CiAgICBpZiAoICRVc2VyQXV0b0NvbXBsZXRlQ29uZmlnLT57QWN0aXZlfSApIHsKCiAgICAgICAgIyBhZGQgY29kZSBuZWVkZWQgZm9yIGF1dG9jb21wbGV0aW9uIChBZ2VudElUU01Vc2VyU2VhcmNoLmR0bCkKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVc2VyU2VhcmNoQXV0b0NvbXBsZXRlJywKICAgICAgICApOwoKICAgICAgICAjIGNvZGUgYW5kIHJldHVybiBibG9ja3MgZm9yIGNoYW5nZSBidWlsZGVyIGFuZCBjaGFuZ2UgbWFuYWdlciAoQWdlbnRJVFNNVXNlclNlYXJjaC5kdGwpCiAgICAgICAgZm9yIG15ICRJbnB1dE5yICggMSAuLiAyICkgewoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJTZWFyY2hBdXRvQ29tcGxldGVDb2RlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIG1pblF1ZXJ5TGVuZ3RoID0+ICRVc2VyQXV0b0NvbXBsZXRlQ29uZmlnLT57TWluUXVlcnlMZW5ndGh9IHx8IDIsCiAgICAgICAgICAgICAgICAgICAgcXVlcnlEZWxheSAgICAgPT4gJFVzZXJBdXRvQ29tcGxldGVDb25maWctPntRdWVyeURlbGF5fSAgICAgfHwgMC4xLAogICAgICAgICAgICAgICAgICAgIHR5cGVBaGVhZCAgICAgID0+ICRVc2VyQXV0b0NvbXBsZXRlQ29uZmlnLT57VHlwZUFoZWFkfSAgICAgIHx8ICdmYWxzZScsCiAgICAgICAgICAgICAgICAgICAgbWF4UmVzdWx0c0Rpc3BsYXllZCA9PiAkVXNlckF1dG9Db21wbGV0ZUNvbmZpZy0+e01heFJlc3VsdHNEaXNwbGF5ZWR9IHx8IDIwLAogICAgICAgICAgICAgICAgICAgIElucHV0TnIgPT4gJElucHV0TnIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJTZWFyY2hBdXRvQ29tcGxldGVSZXR1cm5FbGVtZW50cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJbnB1dE5yID0+ICRJbnB1dE5yLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYmxvY2tzIGluIEFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucy5wbQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiVXNlclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0JElucHV0TnIiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiVXNlclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCRJbnB1dE5yIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzaG93IHVzZXJzZWFyY2ggYnV0dG9ucyBmb3IgY2hhbmdlIG1hbmFnZXIgYW5kIGNoYW5nZSBidWlsZGVyCiAgICAgICAgZm9yIG15ICRJbnB1dE5yICggMSAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiU2VhcmNoVXNlckJ1dHRvbiRJbnB1dE5yIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0ZW1wbGF0ZSBkcm9wZG93bgogICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQ29tbWVudExlbmd0aCA9PiAxNSwKICAgICAgICBUZW1wbGF0ZVR5cGUgID0+ICdDQUInLAogICAgKTsKICAgIG15ICRUZW1wbGF0ZURyb3BEb3duID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlbXBsYXRlSUQnLAogICAgICAgIERhdGEgICAgICAgICA9PiAkVGVtcGxhdGVMaXN0LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgYmxvY2sgd2l0aCB0ZW1wbGF0ZSBkcm9wZG93bgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDQUJUZW1wbGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENBQlRlbXBsYXRlU3RyZyA9PiAkVGVtcGxhdGVEcm9wRG93biwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgdmFsaWRhdGlvbiBlcnJvcnMgaW4gQ0FCVGVtcGxhdGUgYmxvY2sKICAgIG15ICVWYWxpZGF0aW9uRXJyb3JOYW1lczsKICAgIEBWYWxpZGF0aW9uRXJyb3JOYW1lc3tAVmFsaWRhdGlvbkVycm9yc30gPSAoMSkgeCBAVmFsaWRhdGlvbkVycm9yczsKICAgIGZvciBteSAkQ2hhbmdlVGVtcGxhdGVWYWxpZGF0aW9uRXJyb3IgKHF3KEludmFsaWRUZW1wbGF0ZSkpIHsKICAgICAgICBpZiAoICRWYWxpZGF0aW9uRXJyb3JOYW1lc3skQ2hhbmdlVGVtcGxhdGVWYWxpZGF0aW9uRXJyb3J9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQ2hhbmdlVGVtcGxhdGVWYWxpZGF0aW9uRXJyb3IsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgQ0FCIG1lbWJlciBzZWFyY2ggYXV0b2NvbXBsZXRlIGZpZWxkCiAgICBteSAkQ0FCTWVtYmVyQXV0b0NvbXBsZXRlQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZScpOwogICAgaWYgKCAkQ0FCTWVtYmVyQXV0b0NvbXBsZXRlQ29uZmlnLT57QWN0aXZlfSApIHsKCiAgICAgICAgIyBnZW5lcmFsIGJsb2NrcwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBDQUJNZW1iZXIKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDQUJNZW1iZXJTZWFyY2hBdXRvQ29tcGxldGVDb2RlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBtaW5RdWVyeUxlbmd0aCA9PiAkQ0FCTWVtYmVyQXV0b0NvbXBsZXRlQ29uZmlnLT57TWluUXVlcnlMZW5ndGh9IHx8IDIsCiAgICAgICAgICAgICAgICBxdWVyeURlbGF5ICAgICA9PiAkQ0FCTWVtYmVyQXV0b0NvbXBsZXRlQ29uZmlnLT57UXVlcnlEZWxheX0gICAgIHx8IDAuMSwKICAgICAgICAgICAgICAgIHR5cGVBaGVhZCAgICAgID0+ICRDQUJNZW1iZXJBdXRvQ29tcGxldGVDb25maWctPntUeXBlQWhlYWR9ICAgICAgfHwgJ2ZhbHNlJywKICAgICAgICAgICAgICAgIG1heFJlc3VsdHNEaXNwbGF5ZWQgPT4gJENBQk1lbWJlckF1dG9Db21wbGV0ZUNvbmZpZy0+e01heFJlc3VsdHNEaXNwbGF5ZWR9IHx8IDIwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhbCBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZVJldHVybicsCiAgICAgICAgKTsKCiAgICAgICAgIyBDQUIgbWVtYmVyCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ0FCTWVtYmVyU2VhcmNoQXV0b0NvbXBsZXRlUmV0dXJuRWxlbWVudHMnLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0JywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHNob3cgdXNlcnNlYXJjaCBidXR0b25zIGZvciBDQUIgbWVtYmVyCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoQ0FCTWVtYmVyQnV0dG9uJywKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2aWdhdGlvbgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICdJbnZvbHZlZCBQZXJzb25zJywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUV4cGFuZEluZm8sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfSXNNZW1iZXJEZWxldGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZG8gbm90IGRldGVjdCBkZWxldGlvbiB3aGVuIG5vIHN1YmFjdGlvbiBpcyBnaXZlbgogICAgcmV0dXJuIGlmICEkU2VsZi0+e1N1YmFjdGlvbn07CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiBpZiAhJFBhcmFte0NoYW5nZX07CgogICAgIyBpbmZvIGFib3V0IHdoYXQgdG8gZGVsZXRlCiAgICBteSAlRGVsZXRlSW5mbzsKCiAgICAjIGNoZWNrIHBvc3NpYmxlIGFnZW50IGlkcwogICAgQUdFTlRJRDoKICAgIGZvciBteSAkQWdlbnRJRCAoIEB7ICRQYXJhbXtDaGFuZ2V9LT57Q0FCQWdlbnRzfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlQ0FCQWdlbnQnIC4gJEFnZW50SUQgKSApIHsKCiAgICAgICAgICAgICMgc2F2ZSBpbmZvCiAgICAgICAgICAgICVEZWxldGVJbmZvID0gKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ0FCQWdlbnRzJywKICAgICAgICAgICAgICAgIElEICAgPT4gJEFnZW50SUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBsYXN0IEFHRU5USUQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISVEZWxldGVJbmZvICkgewoKICAgICAgICAjIGNoZWNrIHBvc3NpYmxlIGN1c3RvbWVyIGlkcwogICAgICAgIENVU1RPTUVSSUQ6CiAgICAgICAgZm9yIG15ICRDdXN0b21lcklEICggQHsgJFBhcmFte0NoYW5nZX0tPntDQUJDdXN0b21lcnN9IH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlQ0FCQ3VzdG9tZXInIC4gJEN1c3RvbWVySUQgKSApIHsKCiAgICAgICAgICAgICAgICAjIHNhdmUgaW5mbwogICAgICAgICAgICAgICAgJURlbGV0ZUluZm8gPSAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnQ0FCQ3VzdG9tZXJzJywKICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBsYXN0IENVU1RPTUVSSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVEZWxldGVJbmZvOwp9CgpzdWIgX0NoZWNrQ2hhbmdlTWFuYWdlckFuZENoYW5nZUJ1aWxkZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFRoZSBoYXNoIHdpdGggdGhlIGVycm9yIGluZm8gd2lsbCBiZSByZXR1cm5lZC4KICAgIG15ICVFcnJvcnM7CgogICAgUk9MRToKICAgIGZvciBteSAkUm9sZSAocXcoQ2hhbmdlQnVpbGRlciBDaGFuZ2VNYW5hZ2VyKSkgewoKICAgICAgICAjIHRoZSBmaWVsZHMgaW4gLmR0bCBoYXZlIGEgbnVtYmVyIGF0IHRoZSBlbmQKICAgICAgICBteSAkS2V5ID0gJFJvbGUgZXEgJ0NoYW5nZU1hbmFnZXInID8gMSA6IDI7CgogICAgICAgICMgY2hlY2sgdGhlIHJvbGUKICAgICAgICBpZiAoICEkUGFyYW17JFJvbGV9IHx8ICEkUGFyYW17ICdTZWxlY3RlZFVzZXInIC4gJEtleSB9ICkgewogICAgICAgICAgICAkRXJyb3JzeyRSb2xlfSA9IDE7CiAgICAgICAgICAgIG5leHQgUk9MRTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17ICdTZWxlY3RlZFVzZXInIC4gJEtleSB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlcnJvciBpZiB1c2VyIGRvZXMgbm90IGV4aXN0CiAgICAgICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgICAgICRFcnJvcnN7JFJvbGV9ID0gMTsKICAgICAgICAgICAgbmV4dCBST0xFOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBoYXMgYmVlbiBtYW51YWxseSBlZGl0ZWQuCiAgICAgICAgIyBMb29rIGZvciBleGFjdCBtYXRjaCBhdCBiZWdpbm5pbmcsCiAgICAgICAgIyBhcyAkVXNlcntVc2VyTGFzdG5hbWV9IG1pZ2h0IGNvbnRhaW4gYSB0cmFpbGluZyAnb3V0IG9mIG9mZmljZScgbm90ZS4KICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIHdvbid0IGNhdGNoIGRlbGV0aW9ucyBvZiAkUGFyYW17JFJvbGV9IGF0IHRoZSBlbmQuCiAgICAgICAgbXkgJENoZWNrU3RyaW5nID0gc3ByaW50ZiAnIiVzICVzIiA8JXM+JywKICAgICAgICAgICAgJFVzZXJ7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICRVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICRVc2Vye1VzZXJFbWFpbH07CiAgICAgICAgaWYgKCBpbmRleCggJENoZWNrU3RyaW5nLCAkUGFyYW17JFJvbGV9ICkgIT0gMCApIHsKICAgICAgICAgICAgJEVycm9yc3skUm9sZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUVycm9ycwp9CgpzdWIgX0lzTmV3Q0FCTWVtYmVyT2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17Q2hhbmdlfTsKCiAgICAjIFRoZSBtZW1iZXIgaW5mbyB3aWxsIGJlIHJldHVybmVkLgogICAgbXkgJU1lbWJlckluZm87CgogICAgIyBDQUJDdXN0b21lcnMgb3IgQ0FCQWdlbnRzPwogICAgbXkgJE1lbWJlclR5cGUgPSAkUGFyYW17Q0FCTWVtYmVyVHlwZX07CgogICAgIyBjdXJyZW50IG1lbWJlcnMKICAgIG15IEBDdXJyZW50TWVtYmVyczsKCiAgICAjIGFuIGFnZW50IGlzIHJlcXVlc3RlZCB0byBiZSBhZGRlZAogICAgaWYgKCAkTWVtYmVyVHlwZSBlcSAnQ0FCQWdlbnRzJyApIHsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte0NBQk1lbWJlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJVVzZXIpIHsKCiAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCB1c2VycwogICAgICAgICAgICBVU0VSSUQ6CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggQHsgJFBhcmFte0NoYW5nZX0tPnskTWVtYmVyVHlwZX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpbnZhbGlkIHVzZXJzIGZyb20gQ0FCCiAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJEYXRhe1VzZXJJRH07CgogICAgICAgICAgICAgICAgcHVzaCBAQ3VycmVudE1lbWJlcnMsICRVc2VySUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcGFyZSBpbnB1dCB2YWx1ZSB3aXRoIHVzZXIgZGF0YS4KICAgICAgICAgICAgIyBMb29rIGZvciBleGFjdCBtYXRjaCBhdCBiZWdpbm5pbmcsCiAgICAgICAgICAgICMgYXMgJFVzZXJ7VXNlckxhc3RuYW1lfSBtaWdodCBjb250YWluIGEgdHJhaWxpbmcgJ291dCBvZiBvZmZpY2UnIG5vdGUuCiAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgd29uJ3QgY2F0Y2ggZGVsZXRpb25zIG9mICRQYXJhbXtOZXdDQUJNZW1iZXJ9IGF0IHRoZSBlbmQuCiAgICAgICAgICAgIG15ICRDaGVja1N0cmluZyA9IHNwcmludGYgJyIlcyAlcyIgPCVzPicsCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRW1haWx9OwogICAgICAgICAgICBpZiAoIGluZGV4KCAkQ2hlY2tTdHJpbmcsICRQYXJhbXtOZXdDQUJNZW1iZXJ9ICkgPT0gMCApIHsKCiAgICAgICAgICAgICAgICAjIHNhdmUgbWVtYmVyIGluZm9zCiAgICAgICAgICAgICAgICAlTWVtYmVySW5mbyA9ICgKICAgICAgICAgICAgICAgICAgICAkTWVtYmVyVHlwZSA9PiBbIEBDdXJyZW50TWVtYmVycywgJFVzZXJ7VXNlcklEfSBdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFuIGN1c3RvbWVyIGlzIHJlcXVlc3RlZCB0byBiZSBhZGRlZAogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgY3VycmVudCBjdXN0b21lciB1c2VycwogICAgICAgIENVU1RPTUVSVVNFUjoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlciAoIEB7ICRQYXJhbXtDaGFuZ2V9LT57JE1lbWJlclR5cGV9IH0gKSB7CgogICAgICAgICAgICAjIGdldCBjdXN0b21lciB1c2VyIGRhdGEKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyICA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGludmFsaWQgY3VzdG9tZXIgdXNlcnMgZnJvbSBDQUIKICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVIgaWYgISVDdXN0b21lclVzZXJEYXRhOwoKICAgICAgICAgICAgcHVzaCBAQ3VycmVudE1lbWJlcnMsICRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAjIEZvciB0aGUgc2FuaXR5IGNoZWNrIHdlIHVzZSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB3ZSB1c2UgZm9yIEF1dG9jb21wbGV0aW9uCiAgICAgICAgIyBhbmQgY3VzdG9tZXIgdXNlciBleHBhbnNpb24KICAgICAgICAjIEN1c3RvbWVyU2VhcmNoKCkgZG9lcyBmdW5ueSBmb3JtYXRpbmcsIHdoZW4gaXQgdGhpbmtzIHRoYXQgaXQgaGFzCiAgICAgICAgIyBlbmNvdW50ZXJlZCBhbiBFbWFpbC1hZGRyZXNzLgogICAgICAgICMgRnVydGhlcm1vcmUgdGhlIHJldHVybmVkIGhhc2ggZnJvbSBDdXN0b21lclNlYXJjaCgpIGRlcGVuZHMgb24gdGhlIHNldHRpbmcgb2YKICAgICAgICAjICdDdXN0b21lclVzZXJMaXN0RmllbGRzJy4KICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtDQUJNZW1iZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBzY2FsYXIoIGtleXMgJUN1c3RvbWVyVXNlciApID09IDEgKSB7CgogICAgICAgICAgICAjIGNvbXBhcmUgaW5wdXQgdmFsdWUgd2l0aCB1c2VyIGRhdGEKICAgICAgICAgICAgIyBzdHJpbmcgY29tcGFyaXNpb24gY2FuIGJlIHVzZWQgZm9yIGNoZWNraW5nLCBhcyB0aGVyZSBhcmUgbm8gJ291dCBvZiBvZmZpY2UnIG5vdGVzCiAgICAgICAgICAgIG15ICgkQ2hlY2tTdHJpbmcpID0gdmFsdWVzICVDdXN0b21lclVzZXI7CiAgICAgICAgICAgIGlmICggJENoZWNrU3RyaW5nIGVxICRQYXJhbXtOZXdDQUJNZW1iZXJ9ICkgewoKICAgICAgICAgICAgICAgICMgc2F2ZSBtZW1iZXIgaW5mb3MKICAgICAgICAgICAgICAgICVNZW1iZXJJbmZvID0gKAogICAgICAgICAgICAgICAgICAgICRNZW1iZXJUeXBlID0+IFsgQEN1cnJlbnRNZW1iZXJzLCAkUGFyYW17Q0FCTWVtYmVySUR9IF0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlTWVtYmVySW5mbzsKfQoKc3ViIF9HZXRFeHBhbmRJbmZvIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUluZm87CgogICAgIyBnZXQgZ3JvdXAgb2YgZ3JvdXAgaXRzbS1jaGFuZ2UKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICdpdHNtLWNoYW5nZScsCiAgICApOwoKICAgICMgZ2V0IG1lbWJlcnMgb2YgZ3JvdXAKICAgIG15ICVJVFNNQ2hhbmdlVXNlcnMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgVHlwZSAgICA9PiAncm8nLAogICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgIENhY2hlZCAgPT4gMSwKICAgICk7CgogICAgZm9yIG15ICROYW1lIChxdyhCdWlsZGVyIE1hbmFnZXIpKSB7CgogICAgICAgICMgdGhlIGZpZWxkcyBpbiAuZHRsIGhhdmUgYSBudW1iZXIgYXQgdGhlIGVuZAogICAgICAgIG15ICRLZXkgPSAkTmFtZSBlcSAnTWFuYWdlcicgPyAxIDogMjsKCiAgICAgICAgIyBoYW5kbGUgdGhlICJzZWFyY2ggdXNlciIgYnV0dG9uIGZvciBlaXRoZXIgRXhwYW5kQnVpbGRlciBvciBFeHBhbmRNYW5hZ2VyCiAgICAgICAgaWYgKCAkUGFyYW17ICdFeHBhbmQnIC4gJE5hbWUgLiAnMScgfSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGFnZW50cwogICAgICAgICAgICBteSAlVXNlckZvdW5kID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17ICdDaGFuZ2UnIC4gJE5hbWUgfSAuICcqJywKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBVc2VyU2VhcmNoKCkgcmV0dXJucyB2YWx1ZXMgd2l0aCBhIHRyYWlsaW5nIHNwYWNlLCBnZXQgcmlkIG9mIGl0CiAgICAgICAgICAgIGZvciBteSAkTmFtZSAoIHZhbHVlcyAlVXNlckZvdW5kICkgewogICAgICAgICAgICAgICAgJE5hbWUgPX4gc3sgXHMrIFx6IH17fXhtczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaWx0ZXIgdGhlIGl0c20tY2hhbmdlIHVzZXJzIGluIGZvdW5kIHVzZXJzCiAgICAgICAgICAgIG15ICVVc2VyTGlzdDsKICAgICAgICAgICAgQ0hBTkdFVVNFUklEOgogICAgICAgICAgICBmb3IgbXkgJENoYW5nZVVzZXJJRCAoIGtleXMgJUlUU01DaGFuZ2VVc2VycyApIHsKICAgICAgICAgICAgICAgIG5leHQgQ0hBTkdFVVNFUklEIGlmICEkVXNlckZvdW5keyRDaGFuZ2VVc2VySUR9OwoKICAgICAgICAgICAgICAgICRVc2VyTGlzdHskQ2hhbmdlVXNlcklEfSA9ICRVc2VyRm91bmR7JENoYW5nZVVzZXJJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIG15IEBLZXlzVXNlckxpc3QgPSBrZXlzICVVc2VyTGlzdDsKICAgICAgICAgICAgaWYgKCBzY2FsYXIgQEtleXNVc2VyTGlzdCA9PSAxICkgewoKICAgICAgICAgICAgICAgICMgaWYgdXNlciBpcyBmb3VuZCwgZGlzcGxheSB0aGUgbmFtZQogICAgICAgICAgICAgICAgJEluZm97ICdDaGFuZ2UnIC4gJE5hbWUgfSA9ICRVc2VyTGlzdHsgJEtleXNVc2VyTGlzdFswXSB9OwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkS2V5c1VzZXJMaXN0WzBdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGlmIHVzZXIgaXMgZm91bmQgc2V0IGhpZGRlbiBmaWVsZAogICAgICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkSW5mb3sgJ1NlbGVjdGVkVXNlcicgLiAkS2V5IH0gPSAkVXNlckRhdGF7VXNlcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBtb3JlIHRoZSBvbmUgdXNlciBleGlzdHMsIHNob3cgbGlzdAogICAgICAgICAgICAjIGFuZCBjbGVhbiBVc2VySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyByZXNldCBpbnB1dCBmaWVsZAogICAgICAgICAgICAgICAgJEluZm97ICdTZWxlY3RlZFVzZXInIC4gJEtleSB9ID0gJyc7CgogICAgICAgICAgICAgICAgIyBidWlsZCBkcm9wIGRvd24gd2l0aCBmb3VuZCB1c2VycwogICAgICAgICAgICAgICAgJEluZm97ICdDaGFuZ2UnIC4gJE5hbWUgLiAnU3RyZycgfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlJyAuICROYW1lIC4gJ0lEJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2hvdyAndGFrZSB0aGlzIHVzZXInIGJ1dHRvbgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUYWtlQ2hhbmdlJyAuICROYW1lLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRvIGlmIHRoZXJlIGlzIG5vIGN1c3RvbWVyIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEluZm97ICdDaGFuZ2UnIC4gJE5hbWUgfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJEluZm97ICdTZWxlY3RlZFVzZXInIC4gJEtleSB9ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaGFuZGxlIHRoZSAidGFrZSB0aGlzIHVzZXIiIGJ1dHRvbgogICAgICAgIGVsc2lmICggJFBhcmFteyAnRXhwYW5kJyAuICROYW1lIC4gJzInIH0gKSB7CgogICAgICAgICAgICAjIHNob3cgdXNlciBkYXRhCiAgICAgICAgICAgIG15ICRVc2VySUQgICA9ICRQYXJhbXsgJ0NoYW5nZScgLiAkTmFtZSAuICdJRCcgfTsKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgdXNlciBpcyBmb3VuZAogICAgICAgICAgICBpZiAoJVVzZXJEYXRhKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgaGlkZGVuIGZpZWxkCiAgICAgICAgICAgICAgICAkSW5mb3sgJ1NlbGVjdGVkVXNlcicgLiAkS2V5IH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgJEluZm97ICdDaGFuZ2UnIC4gJE5hbWUgfSAgICAgID0gc3ByaW50ZiAnIiVzICVzIiA8JXM+JywKICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17RXhwYW5kQ0FCTWVtYmVyMX0gKSB7CgogICAgICAgICMgc2VhcmNoIGFnZW50cwogICAgICAgIG15ICVVc2VyRm91bmQgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFteydOZXdDQUJNZW1iZXInfSAuICcqJywKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBVc2VyU2VhcmNoKCkgcmV0dXJucyB2YWx1ZXMgd2l0aCBhIHRyYWlsaW5nIHNwYWNlLCBnZXQgcmlkIG9mIGl0CiAgICAgICAgZm9yIG15ICROYW1lICggdmFsdWVzICVVc2VyRm91bmQgKSB7CiAgICAgICAgICAgICROYW1lID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgfQoKICAgICAgICAjIGZpbHRlciB0aGUgaXRzbS1jaGFuZ2UgdXNlcnMgaW4gZm91bmQgdXNlcnMKICAgICAgICBteSBAVXNlckxpc3Q7CiAgICAgICAgQ0hBTkdFVVNFUklEOgogICAgICAgIGZvciBteSAkQ2hhbmdlVXNlcklEICgga2V5cyAlVXNlckZvdW5kICkgewoKICAgICAgICAgICAgIyBzYXZlIGZvdW5kIHVzZXIgaW4gQFVzZXJMaXN0CiAgICAgICAgICAgIHB1c2ggQFVzZXJMaXN0LCB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICRVc2VyRm91bmR7JENoYW5nZVVzZXJJRH0sCiAgICAgICAgICAgICAgICBJRCAgID0+ICRDaGFuZ2VVc2VySUQsCiAgICAgICAgICAgICAgICBUeXBlID0+ICdDQUJBZ2VudHMnLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBzZWFyY2ggY3VzdG9tZXJzCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckZvdW5kID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXsnTmV3Q0FCTWVtYmVyJ30gLiAnKicsCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSBmb3VuZCBjdXN0b21lciB1c2VycyBpbiBAVXNlckxpc3QKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICgga2V5cyAlQ3VzdG9tZXJVc2VyRm91bmQgKSB7CgogICAgICAgICAgICBwdXNoIEBVc2VyTGlzdCwgewogICAgICAgICAgICAgICAgTmFtZSA9PiAkQ3VzdG9tZXJVc2VyRm91bmR7JEN1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIElEICAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgVHlwZSA9PiAnQ0FCQ3VzdG9tZXJzJywKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAjIGlmIGp1c3Qgb25lLCBmaWxsdXAgQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICBpZiAoIHNjYWxhciBAVXNlckxpc3QgPT0gMSApIHsKCiAgICAgICAgICAgICMgaWYgdXNlciBpcyBmb3VuZCwgZGlzcGxheSB0aGUgbmFtZQogICAgICAgICAgICAkSW5mb3tOZXdDQUJNZW1iZXJ9ICA9ICRVc2VyTGlzdFswXS0+e05hbWV9OwogICAgICAgICAgICAkSW5mb3tDQUJNZW1iZXJJRH0gICA9ICRVc2VyTGlzdFswXS0+e0lEfTsKICAgICAgICAgICAgJEluZm97Q0FCTWVtYmVyVHlwZX0gPSAkVXNlckxpc3RbMF0tPntUeXBlfTsKICAgICAgICB9CgogICAgICAgICMgaWYgbW9yZSB0aGUgb25lIHVzZXIgZXhpc3RzLCBzaG93IGxpc3QKICAgICAgICAjIGFuZCBjbGVhbiBVc2VySUQKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgYnVpbGQgbGlzdCBmb3IgZHJvcCBkb3duCiAgICAgICAgICAgIG15IEBVc2VyTGlzdEZvckRyb3BEb3duOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKEBVc2VyTGlzdCkgewogICAgICAgICAgICAgICAgcHVzaCBAVXNlckxpc3RGb3JEcm9wRG93biwgewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRVc2VyLT57SUR9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRVc2VyLT57TmFtZX0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlc2V0IGlucHV0IGZpZWxkCiAgICAgICAgICAgICRJbmZve05ld0NBQk1lbWJlcn0gPSAnJzsKCiAgICAgICAgICAgICMgYnVpbGQgZHJvcCBkb3duIHdpdGggZm91bmQgdXNlcnMKICAgICAgICAgICAgJEluZm97Q0FCTWVtYmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWVtYmVySUQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcQFVzZXJMaXN0Rm9yRHJvcERvd24sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgJ3Rha2UgdGhpcyB1c2VyJyBidXR0b24KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Rha2VDQUJNZW1iZXInLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjbGVhciB0byBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICBpZiAoICFAVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkSW5mb3snTmV3Q0FCTWVtYmVyJ30gID0gJyc7CiAgICAgICAgICAgICAgICAkSW5mb3snQ0FCTWVtYmVySUQnfSAgID0gJyc7CiAgICAgICAgICAgICAgICAkSW5mb3snQ0FCTWVtYmVyVHlwZSd9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgdGhlICJ0YWtlIHRoaXMgdXNlciIgYnV0dG9uCiAgICBlbHNpZiAoICRQYXJhbXtFeHBhbmRDQUJNZW1iZXIyfSApIHsKCiAgICAgICAgIyBzaG93IHVzZXIgZGF0YQogICAgICAgIG15ICRVc2VySUQgPSAkUGFyYW17J01lbWJlcklEJ307CiAgICAgICAgbXkgJVVzZXJEYXRhOwoKICAgICAgICBpZiAoICRVc2VySUQgPX4gbXsgXEEgXGQrIFx6IH14bXMgKSB7CiAgICAgICAgICAgICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHVzZXIgaXMgZm91bmQKICAgICAgICBpZiAoJVVzZXJEYXRhKSB7CgogICAgICAgICAgICAjIHNldCBoaWRkZW4gZmllbGQKICAgICAgICAgICAgJEluZm97J0NBQk1lbWJlcklEJ30gICA9ICRVc2VySUQ7CiAgICAgICAgICAgICRJbmZveydDQUJNZW1iZXJUeXBlJ30gPSAnQ0FCQWdlbnRzJzsKICAgICAgICAgICAgJEluZm97J05ld0NBQk1lbWJlcid9ICA9IHNwcmludGYgJyVzICVzICVzJywKICAgICAgICAgICAgICAgICRVc2VyRGF0YXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJMYXN0bmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIG1heWJlIGl0J3MgYSBjdXN0b21lciB1c2VyCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBjdXN0b21lciB1c2VyIGRhdGEKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgdXNlciBpcyBmb3VuZAogICAgICAgICAgICBpZiAoJUN1c3RvbWVyVXNlckRhdGEpIHsKCiAgICAgICAgICAgICAgICAjIHNldCBoaWRkZW4gZmllbGQKICAgICAgICAgICAgICAgICRJbmZveydDQUJNZW1iZXJJRCd9ICAgPSAkVXNlcklEOwogICAgICAgICAgICAgICAgJEluZm97J0NBQk1lbWJlclR5cGUnfSA9ICdDQUJDdXN0b21lcnMnOwogICAgICAgICAgICAgICAgJEluZm97J05ld0NBQk1lbWJlcid9ICA9IHNwcmludGYgJyVzICVzICVzJywKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVJbmZvOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU1hbmFnZXIucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCBDaGFuZ2UtTWFuYWdlciBvdmVydmlldyBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZU1hbmFnZXIucG0sdiAxLjcgMjAxMC8wNC8yNyAyMDozMzo1MCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZU1hbmFnZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKICAgICRTZWxmLT57Vmlld30gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuLCB1c2VkIGZvciBiYWNrbGlua3MKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdDaGFuZ2VOdW1iZXInOwoKICAgICMgZ2V0IG9yZGVyaW5nIHBhcmFtZXRlcnMKICAgIG15ICRPcmRlckJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBzdGFydGluZyB3aXRoIHBhZ2UgLi4uCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lICgga2V5cyAlUG9zc2libGVDb2x1bW4gKSB7CiAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBmaWx0ZXJzCiAgICBteSAlRmlsdGVyczsKCiAgICAjIHNldCBvdGhlciBmaWx0ZXJzIGJhc2VkIG9uIGNoYW5nZSBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSApIHsKCiAgICAgICAgIyBkZWZpbmUgcG9zaXRpb24gb2YgdGhlIGZpbHRlciBpbiB0aGUgZnJvbnRlbmQKICAgICAgICBteSAkUHJpb0NvdW50ZXIgPSAxMDAwOwoKICAgICAgICAjIGdldCBhbGwgY2hhbmdlIHN0YXRlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGZpbHRlcnMKICAgICAgICBDSEFOR0VTVEFURToKICAgICAgICBmb3IgbXkgJENoYW5nZVN0YXRlICggQHsgJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBlbXB0eSBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgc3RhdGUgaXMgdmFsaWQgYnkgbG9va2luZyB1cCB0aGUgc3RhdGUgaWQKICAgICAgICAgICAgbXkgJENoYW5nZVN0YXRlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIGZvciB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICAgICAgJEZpbHRlcnN7JENoYW5nZVN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiBbJENoYW5nZVN0YXRlXSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIG9ubHkgb25lIGZpbHRlciBleGlzdHMKICAgIGlmICggc2NhbGFyIGtleXMgJUZpbHRlcnMgPT0gMSApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIG9ubHkgZmlsdGVyCiAgICAgICAgbXkgKCRGaWx0ZXJOYW1lKSA9IGtleXMgJUZpbHRlcnM7CgogICAgICAgICMgYWN0aXZhdGUgdGhpcyBmaWx0ZXIKICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkRmlsdGVyTmFtZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGFkZCBkZWZhdWx0IGZpbHRlcgogICAgICAgICRGaWx0ZXJze0FsbH0gPSB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnQWxsJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9LAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggISRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkludmFsaWQgRmlsdGVyOiAkU2VsZi0+e0ZpbHRlcn0hIiApOwogICAgfQoKICAgICMgc2VhcmNoIGNoYW5nZXMgd2hpY2ggbWF0Y2ggdGhlIHNlbGVjdGVkIGZpbHRlcgogICAgbXkgJENoYW5nZUlEc1JlZiA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICgga2V5cyAlRmlsdGVycyApIHsKCiAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgZm9yIGVhY2ggZmlsdGVyCiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmU29ydEJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnJk9yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua1NvcnQgPSAnRmlsdGVyPScKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICcmT3JkZXJCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyYnOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01DaGFuZ2VMaXN0U2hvdygKCiAgICAgICAgQ2hhbmdlSURzID0+ICRDaGFuZ2VJRHNSZWYsCiAgICAgICAgVG90YWwgICAgID0+IHNjYWxhciBAeyRDaGFuZ2VJRHNSZWZ9LAoKICAgICAgICBWaWV3ID0+ICRTZWxmLT57Vmlld30sCgogICAgICAgIEZpbHRlciAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEZpbHRlcnMgICAgPT4gXCVOYXZCYXJGaWx0ZXIsCiAgICAgICAgRmlsdGVyTGluayA9PiAkTGlua0ZpbHRlciwKCiAgICAgICAgVGl0bGVOYW1lID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdPdmVydmlldycpCiAgICAgICAgICAgIC4gJzogJwogICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDaGFuZ2VNYW5hZ2VyJyksCgogICAgICAgIFRpdGxlVmFsdWUgPT4gJFNlbGYtPntGaWx0ZXJ9LAoKICAgICAgICBFbnYgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgPT4gJExpbmtTb3J0LAoKICAgICAgICBTaG93Q29sdW1ucyA9PiBcQFNob3dDb2x1bW5zLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15Q0FCLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgTXlDQUIgb3ZlcnZpZXcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VNeUNBQi5wbSx2IDEuMyAyMDA5LzEyLzAxIDE2OjQ4OjI1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlTXlDQUI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKICAgICRTZWxmLT57Vmlld30gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuLCB1c2VkIGZvciBiYWNrbGlua3MKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkNoYW5nZXMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdDaGFuZ2VOdW1iZXInOwoKICAgICMgZ2V0IG9yZGVyaW5nIHBhcmFtZXRlcnMKICAgIG15ICRPcmRlckJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBzdGFydGluZyB3aXRoIHBhZ2UgLi4uCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lICgga2V5cyAlUG9zc2libGVDb2x1bW4gKSB7CiAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBmaWx0ZXJzCiAgICBteSAlRmlsdGVyczsKCiAgICAjIHNldCBvdGhlciBmaWx0ZXJzIGJhc2VkIG9uIGNoYW5nZSBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSApIHsKCiAgICAgICAgIyBkZWZpbmUgcG9zaXRpb24gb2YgdGhlIGZpbHRlciBpbiB0aGUgZnJvbnRlbmQKICAgICAgICBteSAkUHJpb0NvdW50ZXIgPSAxMDAwOwoKICAgICAgICAjIGdldCBhbGwgY2hhbmdlIHN0YXRlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGZpbHRlcnMKICAgICAgICBDSEFOR0VTVEFURToKICAgICAgICBmb3IgbXkgJENoYW5nZVN0YXRlICggQHsgJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBlbXB0eSBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgc3RhdGUgaXMgdmFsaWQgYnkgbG9va2luZyB1cCB0aGUgc3RhdGUgaWQKICAgICAgICAgICAgbXkgJENoYW5nZVN0YXRlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIGZvciB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICAgICAgJEZpbHRlcnN7JENoYW5nZVN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiBbJENoYW5nZVN0YXRlXSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIG9ubHkgb25lIGZpbHRlciBleGlzdHMKICAgIGlmICggc2NhbGFyIGtleXMgJUZpbHRlcnMgPT0gMSApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIG9ubHkgZmlsdGVyCiAgICAgICAgbXkgKCRGaWx0ZXJOYW1lKSA9IGtleXMgJUZpbHRlcnM7CgogICAgICAgICMgYWN0aXZhdGUgdGhpcyBmaWx0ZXIKICAgICAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkRmlsdGVyTmFtZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGFkZCBkZWZhdWx0IGZpbHRlcgogICAgICAgICRGaWx0ZXJze0FsbH0gPSB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnQWxsJywKICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9LAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggISRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkludmFsaWQgRmlsdGVyOiAkU2VsZi0+e0ZpbHRlcn0hIiApOwogICAgfQoKICAgICMgc2VhcmNoIGNoYW5nZXMgd2hpY2ggbWF0Y2ggdGhlIHNlbGVjdGVkIGZpbHRlcgogICAgbXkgJENoYW5nZUlEc1JlZiA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICgga2V5cyAlRmlsdGVycyApIHsKCiAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgZm9yIGVhY2ggZmlsdGVyCiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmU29ydEJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnJk9yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua1NvcnQgPSAnRmlsdGVyPScKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICcmT3JkZXJCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyYnOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01DaGFuZ2VMaXN0U2hvdygKCiAgICAgICAgQ2hhbmdlSURzID0+ICRDaGFuZ2VJRHNSZWYsCiAgICAgICAgVG90YWwgICAgID0+IHNjYWxhciBAeyRDaGFuZ2VJRHNSZWZ9LAoKICAgICAgICBWaWV3ID0+ICRTZWxmLT57Vmlld30sCgogICAgICAgIEZpbHRlciAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEZpbHRlcnMgICAgPT4gXCVOYXZCYXJGaWx0ZXIsCiAgICAgICAgRmlsdGVyTGluayA9PiAkTGlua0ZpbHRlciwKCiAgICAgICAgVGl0bGVOYW1lICA9PiAnT3ZlcnZpZXc6IE15IENBQicsCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCgogICAgICAgIEVudiAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCA9PiAkTGlua1NvcnQsCgogICAgICAgIFNob3dDb2x1bW5zID0+IFxAU2hvd0NvbHVtbnMsCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15Q2hhbmdlcy5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IE15Q2hhbmdlcyBvdmVydmlldyBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZU15Q2hhbmdlcy5wbSx2IDEuNCAyMDEwLzAxLzI3IDEwOjAxOjAzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlTXlDaGFuZ2VzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0IFVzZXJPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCBmaWx0ZXIgYW5kIHZpZXcgcGFyYW1zCiAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWaWV3JyApICAgfHwgJyc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbiwgdXNlZCBmb3IgYmFja2xpbmtzCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5DaGFuZ2VzJywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIGdldCBzb3J0aW5nIHBhcmFtZXRlcnMKICAgIG15ICRTb3J0QnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgIG15IEBTb3J0QnlBcnJheSAgPSAoJFNvcnRCeSk7CiAgICBteSBAT3JkZXJCeUFycmF5ID0gKCRPcmRlckJ5KTsKCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggUmVmcmVzaCA9PiAkUmVmcmVzaCApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQ09MVU1OTkFNRToKICAgICAgICBmb3IgbXkgJE5hbWUgKCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRVNUQVRFOgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzdGF0ZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBzdGF0ZSBpZAogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IGNoYW5nZSBzdGF0ZQogICAgICAgICAgICAkRmlsdGVyc3skQ2hhbmdlU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRHMgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFskQ2hhbmdlU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRHMgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiSW52YWxpZCBGaWx0ZXI6ICRTZWxmLT57RmlsdGVyfSEiICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgJXsgJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9LT57U2VhcmNofSB9LAogICAgKTsKCiAgICAjIGRpc3BsYXkgYWxsIG5hdmJhciBmaWx0ZXJzCiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXIgKCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhbmdlcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNob3cgY2hhbmdlcwogICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyZTb3J0Qnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICcmT3JkZXJCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICcmJzsKICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmJzsKICAgIG15ICRMaW5rRmlsdGVyID0gJ1NvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJyZPcmRlckJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNoYW5nZUxpc3RTaG93KAoKICAgICAgICBDaGFuZ2VJRHMgPT4gJENoYW5nZUlEc1JlZiwKICAgICAgICBUb3RhbCAgICAgPT4gc2NhbGFyIEB7JENoYW5nZUlEc1JlZn0sCgogICAgICAgIFZpZXcgPT4gJFNlbGYtPntWaWV3fSwKCiAgICAgICAgRmlsdGVyICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRmlsdGVycyAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rID0+ICRMaW5rRmlsdGVyLAoKICAgICAgICBUaXRsZU5hbWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ092ZXJ2aWV3JykKICAgICAgICAgICAgLiAnOiAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ015IENoYW5nZXMnKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCgogICAgICAgIEVudiAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCA9PiAkTGlua1NvcnQsCgogICAgICAgIFNob3dDb2x1bW5zID0+IFxAU2hvd0NvbHVtbnMsCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZU15V29ya09yZGVycy5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IE15V29ya09yZGVycyBvdmVydmlldyBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZU15V29ya09yZGVycy5wbSx2IDEuNSAyMDEwLzAxLzI3IDEwOjAxOjAzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlTXlXb3JrT3JkZXJzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKICAgICRTZWxmLT57Vmlld30gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuLCB1c2VkIGZvciBiYWNrbGlua3MKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbldvcmtPcmRlcnMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdQbGFubmVkU3RhcnRUaW1lJzsKCiAgICAjIGdldCBvcmRlcmluZyBwYXJhbWV0ZXJzCiAgICBteSAkT3JkZXJCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnT3JkZXI6OkRlZmF1bHQnfQogICAgICAgIHx8ICdVcCc7CgogICAgbXkgQFNvcnRCeUFycmF5ICA9ICgkU29ydEJ5KTsKICAgIG15IEBPcmRlckJ5QXJyYXkgPSAoJE9yZGVyQnkpOwoKICAgICMgc29ydCBieSBjaGFuZ2UgbnVtYmVyIGZpcnN0IGlmIHVzZXIgd2FudHMgdG8gc29ydCBieSB3b3Jrb3JkZXIgbnVtYmVyCiAgICBpZiAoICRTb3J0QnkgZXEgJ1dvcmtPcmRlck51bWJlcicgKSB7CiAgICAgICAgQFNvcnRCeUFycmF5ID0gKCAnQ2hhbmdlTnVtYmVyJywgJ1dvcmtPcmRlck51bWJlcicgKTsKICAgICAgICBAT3JkZXJCeUFycmF5ID0gKCAkT3JkZXJCeSwgJE9yZGVyQnkgKTsKICAgIH0KCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggUmVmcmVzaCA9PiAkUmVmcmVzaCApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQ09MVU1OTkFNRToKICAgICAgICBmb3IgbXkgJE5hbWUgKCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gd29ya29yZGVyIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OldvcmtPcmRlclN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCB3b3Jrb3JkZXIgc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIFdPUktPUkRFUlNUQVRFOgogICAgICAgIGZvciBteSAkV29ya09yZGVyU3RhdGUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpXb3JrT3JkZXJTdGF0ZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IHdvcmtvcmRlciBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBXT1JLT1JERVJTVEFURSBpZiAhJFdvcmtPcmRlclN0YXRlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzdGF0ZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBzdGF0ZSBpZAogICAgICAgICAgICBteSAkV29ya09yZGVyU3RhdGVJRCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAkV29ya09yZGVyU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCB3b3Jrb3JkZXIgc3RhdGVzCiAgICAgICAgICAgIG5leHQgV09SS09SREVSU1RBVEUgaWYgISRXb3JrT3JkZXJTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IHdvcmtvcmRlciBzdGF0ZQogICAgICAgICAgICAkRmlsdGVyc3skV29ya09yZGVyU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRXb3JrT3JkZXJTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzICAgPT4gWyRXb3JrT3JkZXJTdGF0ZV0sCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgICA9PiAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpXb3JrT3JkZXJTdGF0ZXMnfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uICA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiSW52YWxpZCBGaWx0ZXI6ICRTZWxmLT57RmlsdGVyfSEiICk7CiAgICB9CgogICAgIyBzZWFyY2ggd29ya29yZGVycyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkV29ya09yZGVySURzUmVmID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgJXsgJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9LT57U2VhcmNofSB9LAogICAgKTsKCiAgICAjIGRpc3BsYXkgYWxsIG5hdmJhciBmaWx0ZXJzCiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXIgKCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2Ygd29ya29yZGVycyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNob3cgY2hhbmdlcwogICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyZTb3J0Qnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICcmT3JkZXJCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICcmJzsKICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmJzsKICAgIG15ICRMaW5rRmlsdGVyID0gJ1NvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJyZPcmRlckJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNoYW5nZUxpc3RTaG93KAoKICAgICAgICBXb3JrT3JkZXJJRHMgPT4gJFdvcmtPcmRlcklEc1JlZiwKICAgICAgICBUb3RhbCAgICAgICAgPT4gc2NhbGFyIEB7JFdvcmtPcmRlcklEc1JlZn0sCgogICAgICAgIFZpZXcgPT4gJFNlbGYtPntWaWV3fSwKCiAgICAgICAgRmlsdGVyICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRmlsdGVycyAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rID0+ICRMaW5rRmlsdGVyLAoKICAgICAgICBUaXRsZU5hbWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ092ZXJ2aWV3JykKICAgICAgICAgICAgLiAnOiAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ015IFdvcmtvcmRlcnMnKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCgogICAgICAgIEVudiAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCA9PiAkTGlua1NvcnQsCgogICAgICAgIFNob3dDb2x1bW5zID0+IFxAU2hvd0NvbHVtbnMsCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVBJUi5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IFBJUiBvdmVydmlldyBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVBJUi5wbSx2IDEuNyAyMDEwLzAxLzI3IDEwOjAxOjAzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlUElSOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKICAgICRTZWxmLT57Vmlld30gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuLCB1c2VkIGZvciBiYWNrbGlua3MKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbldvcmtPcmRlcnMnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IHNvcnRpbmcgcGFyYW1ldGVycwogICAgbXkgJFNvcnRCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdQbGFubmVkU3RhcnRUaW1lJzsKCiAgICAjIGdldCBvcmRlcmluZyBwYXJhbWV0ZXJzCiAgICBteSAkT3JkZXJCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnT3JkZXI6OkRlZmF1bHQnfQogICAgICAgIHx8ICdVcCc7CgogICAgbXkgQFNvcnRCeUFycmF5ICA9ICgkU29ydEJ5KTsKICAgIG15IEBPcmRlckJ5QXJyYXkgPSAoJE9yZGVyQnkpOwoKICAgICMgc29ydCBieSBjaGFuZ2UgbnVtYmVyIGZpcnN0IGlmIHVzZXIgd2FudHMgdG8gc29ydCBieSB3b3Jrb3JkZXIgbnVtYmVyCiAgICBpZiAoICRTb3J0QnkgZXEgJ1dvcmtPcmRlck51bWJlcicgKSB7CiAgICAgICAgQFNvcnRCeUFycmF5ID0gKCAnQ2hhbmdlTnVtYmVyJywgJ1dvcmtPcmRlck51bWJlcicgKTsKICAgICAgICBAT3JkZXJCeUFycmF5ID0gKCAkT3JkZXJCeSwgJE9yZGVyQnkgKTsKICAgIH0KCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggUmVmcmVzaCA9PiAkUmVmcmVzaCApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQ09MVU1OTkFNRToKICAgICAgICBmb3IgbXkgJE5hbWUgKCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgZmluZCBvdXQgd2hpY2ggd29ya29yZGVyIHR5cGVzIHNob3VsZCBiZSB1c2VkIHRvIHNob3cgUElSCiAgICBteSBAV29ya09yZGVyVHlwZXM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlclR5cGVzfSApIHsKICAgICAgICBXT1JLT1JERVJUWVBFOgogICAgICAgIGZvciBteSAkV29ya09yZGVyVHlwZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlclR5cGVzfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB3b3Jrb3JkZXIgdHlwZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSB0eXBlIGlkCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJUeXBlSUQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlID0+ICRXb3JrT3JkZXJUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgd29ya29yZGVyIHR5cGVzCiAgICAgICAgICAgIG5leHQgV09SS09SREVSVFlQRSBpZiAhJFdvcmtPcmRlclR5cGVJRDsKCiAgICAgICAgICAgIHB1c2ggQFdvcmtPcmRlclR5cGVzLCAkV29ya09yZGVyVHlwZTsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBzZXQgb3RoZXIgZmlsdGVycyBiYXNlZCBvbiB3b3Jrb3JkZXIgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzJ30gKSB7CgogICAgICAgICMgZGVmaW5lIHBvc2l0aW9uIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGZyb250ZW5kCiAgICAgICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAgICAgIyBnZXQgYWxsIHdvcmtvcmRlciBzdGF0ZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBmaWx0ZXJzCiAgICAgICAgV09SS09SREVSU1RBVEU6CiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJTdGF0ZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OldvcmtPcmRlclN0YXRlcyd9IH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgd29ya29yZGVyIHN0YXRlcwogICAgICAgICAgICBuZXh0IFdPUktPUkRFUlNUQVRFIGlmICEkV29ya09yZGVyU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJTdGF0ZUlEID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICRXb3JrT3JkZXJTdGF0ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBpbnZhbGlkIHdvcmtvcmRlciBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBXT1JLT1JERVJTVEFURSBpZiAhJFdvcmtPcmRlclN0YXRlSUQ7CgogICAgICAgICAgICAjIGluY3JlYXNlIHRoZSBQcmlvQ291bnRlcgogICAgICAgICAgICAkUHJpb0NvdW50ZXIrKzsKCiAgICAgICAgICAgICMgYWRkIGZpbHRlciBmb3IgdGhlIGN1cnJlbnQgd29ya29yZGVyIHN0YXRlCiAgICAgICAgICAgICRGaWx0ZXJzeyRXb3JrT3JkZXJTdGF0ZX0gPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJFdvcmtPcmRlclN0YXRlLAogICAgICAgICAgICAgICAgUHJpbyAgID0+ICRQcmlvQ291bnRlciwKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZXMgICA9PiBcQFdvcmtPcmRlclR5cGVzLAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlcyAgPT4gWyRXb3JrT3JkZXJTdGF0ZV0sCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBvbmx5IG9uZSBmaWx0ZXIgZXhpc3RzCiAgICBpZiAoIHNjYWxhciBrZXlzICVGaWx0ZXJzID09IDEgKSB7CgogICAgICAgICMgZ2V0IHRoZSBuYW1lIG9mIHRoZSBvbmx5IGZpbHRlcgogICAgICAgIG15ICgkRmlsdGVyTmFtZSkgPSBrZXlzICVGaWx0ZXJzOwoKICAgICAgICAjIGFjdGl2YXRlIHRoaXMgZmlsdGVyCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJEZpbHRlck5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgZGVmYXVsdCBmaWx0ZXIKICAgICAgICAkRmlsdGVyc3tBbGx9ID0gewogICAgICAgICAgICBOYW1lICAgPT4gJ0FsbCcsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZXMgICA9PiBcQFdvcmtPcmRlclR5cGVzLAogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggISRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkludmFsaWQgRmlsdGVyOiAkU2VsZi0+e0ZpbHRlcn0hIiApOwogICAgfQoKICAgICMgc2VhcmNoIHdvcmtvcmRlcnMgd2hpY2ggbWF0Y2ggdGhlIHNlbGVjdGVkIGZpbHRlcgogICAgbXkgJFdvcmtPcmRlcklEc1JlZiA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICgga2V5cyAlRmlsdGVycyApIHsKCiAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIHdvcmtvcmRlcnMgZm9yIGVhY2ggZmlsdGVyCiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgdGhlIG5hdmJhciBmaWx0ZXIKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyfS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNoYW5nZXMKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmU29ydEJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnJk9yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua1NvcnQgPSAnRmlsdGVyPScKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICcmT3JkZXJCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyYnOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01DaGFuZ2VMaXN0U2hvdygKCiAgICAgICAgV29ya09yZGVySURzID0+ICRXb3JrT3JkZXJJRHNSZWYsCiAgICAgICAgVG90YWwgICAgICAgID0+IHNjYWxhciBAeyRXb3JrT3JkZXJJRHNSZWZ9LAoKICAgICAgICBWaWV3ID0+ICRTZWxmLT57Vmlld30sCgogICAgICAgIEZpbHRlciAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEZpbHRlcnMgICAgPT4gXCVOYXZCYXJGaWx0ZXIsCiAgICAgICAgRmlsdGVyTGluayA9PiAkTGlua0ZpbHRlciwKCiAgICAgICAgVGl0bGVOYW1lID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdPdmVydmlldycpCiAgICAgICAgICAgIC4gJzogJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQSVInKSwKCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCgogICAgICAgIEVudiAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCA9PiAkTGlua1NvcnQsCgogICAgICAgIFNob3dDb2x1bW5zID0+IFxAU2hvd0NvbHVtbnMsCiAgICApOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVByaW50LnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgY2hhbmdlIHByaW50IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlUHJpbnQucG0sdiAxLjQwIDIwMTAvMDQvMjcgMjA6MzY6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VQcmludDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBMaXN0OjpVdGlsIHF3KG1heCk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQwICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0IFVzZXJPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwoKICAgICMgd2hlbiB0aGVyZSBpcyBubyBQREYtU3VwcG9ydCwgJFNlbGYtPntQREZPYmplY3R9IHdpbGwgYmUgdW5kZWZpbmVkCiAgICAkU2VsZi0+e1BERk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UERGLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgUGFnZSBjb250cm9scyB0aGUgUERGLWdlbmVyYXRpb24KICAgICMgaXQgd29uJ3QgYmUgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIFBERi1TdXBwb3J0CiAgICAkU2VsZi0+e1BhZ2V9ID0ge307CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBGaW5kIG91dCB3aGV0aGVyIGEgY2hhbmdlIG9yIGEgd29ya29yZGVyIHNob3VsZCBiZSBwcmludGVkLgogICAgIyBBIHdvcmtvcmRlciBpcyB0byBiZSBwcmludGVkIHdoZW4gdGhlIFdvcmtPcmRlcklEIGlzIHBhc3NlZC4KICAgICMgT3RoZXJ3aXNlIGEgY2hhbmdlIHNob3VsZCBiZSBwcmludGVkLgogICAgbXkgJFdvcmtPcmRlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnV29ya09yZGVySUQnICk7CiAgICBteSAkUHJpbnRXb3JrT3JkZXIgPSAkV29ya09yZGVySUQgPyAxIDogMDsKICAgIG15ICRQcmludENoYW5nZSAgICA9ICEkV29ya09yZGVySUQ7CiAgICBteSAkV29ya09yZGVyICAgICAgPSB7fTsKICAgIG15ICRDaGFuZ2VJRDsKCiAgICBpZiAoJFByaW50V29ya09yZGVyKSB7CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbiBvbiB0aGUgd29ya29yZGVyCiAgICAgICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZXJyb3Igc2NyZWVuCiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgaW5mb3JtYXRpb24KICAgICAgICAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpbmZlciB0aGUgY2hhbmdlIGlkIGZyb20gdGhlIHdvcmtvcmRlcgogICAgICAgICRDaGFuZ2VJRCA9ICRXb3JrT3JkZXItPntDaGFuZ2VJRH07CgogICAgICAgIGlmICggISRDaGFuZ2VJRCApIHsKCiAgICAgICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGNyZWF0ZSBvdXRwdXQsIGFzIHRoZSB3b3Jrb3JkZXIgaXMgbm90IGF0dGFjaGVkIHRvIGEgY2hhbmdlISIsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyB0aGUgY2hhbmdlIGlkIGlzIHJlcXVpcmVkLCBhcyB3ZSBoYXZlIG5vIHdvcmtvcmRlciBpZAogICAgICAgICRDaGFuZ2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CgogICAgICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDYW4ndCBjcmVhdGUgb3V0cHV0LCBhcyBubyBDaGFuZ2VJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb24gb24gdGhlIGNoYW5nZQogICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGVycm9yIHNjcmVlbgogICAgICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgaW5mb3JtYXRpb24KICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDaGFuZ2UgJyRDaGFuZ2VJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzb21lIGluaXQgZm9yIFBERi1PdXRwdXQKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewoKICAgICAgICBteSAkUGFnZSA9ICRTZWxmLT57UGFnZX07CgogICAgICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAgICAgJFBhZ2UtPntNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdlLT57TWF4UGFnZXN9IHx8ICRQYWdlLT57TWF4UGFnZXN9IDwgMSB8fCAkUGFnZS0+e01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdlLT57TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KCiAgICAgICAgIyBwYWdlIGxheW91dCBzZXR0aW5ncwogICAgICAgICRQYWdlLT57TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdlLT57TWFyZ2luUmlnaHR9ICA9IDQwOwogICAgICAgICRQYWdlLT57TWFyZ2luQm90dG9tfSA9IDQwOwogICAgICAgICRQYWdlLT57TWFyZ2luTGVmdH0gICA9IDQwOwogICAgfQoKICAgICMgdGhlIHNlY29uZCBpdGVtIGluIHRoZSBwYWdlIHRpdGxlIGlzIHRoZSBhcmVhIGluIHRoZSBwcm9kdWN0ICdJVFNNIENoYW5nZSBNYW5hZ2VtZW50JwogICAgbXkgJEhlYWRlckFyZWEgPSAkUHJpbnRDaGFuZ2UgPyAnSVRTTSBDaGFuZ2UnIDogJ0lUU00gV29ya29yZGVyJzsKICAgICRIZWFkZXJBcmVhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJEhlYWRlckFyZWEpOwoKICAgICMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgcGFnZSB0aXRsZSBpcyBlaXRoZXIgdGhlIGNoYW5nZSBudW1iZXIgb2YgdGhlIGZ1bGwgd29ya29yZGVyIG51bWJlcgogICAgbXkgJEhlYWRlclZhbHVlID0gJFByaW50Q2hhbmdlCiAgICAgICAgPwogICAgICAgICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9CiAgICAgICAgOgogICAgICAgIGpvaW4oICctJywgJENoYW5nZS0+e0NoYW5nZU51bWJlcn0sICRXb3JrT3JkZXItPntXb3JrT3JkZXJOdW1iZXJ9ICk7CgogICAgIyBzdGFydCB0aGUgZG9jdW1lbnQKICAgICMgJE91dHB1dCByZWNlaXZlcyBnZW5lcmF0ZWQgSFRNTCBpbiB0aGUgbm9uLVBERiBjYXNlCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPl9TdGFydERvY3VtZW50KAogICAgICAgIEhlYWRlckFyZWEgID0+ICRIZWFkZXJBcmVhLAogICAgICAgIEhlYWRlclZhbHVlID0+ICRIZWFkZXJWYWx1ZSwKICAgICk7CgogICAgIyB0aGUgbGluayB0eXBlcyBhcmUgbmVlZGVkIGZvciBzaG93aW5nIHRoZSBsaW5rZWQgb2JqZWN0cwogICAgbXkgJUxpbmtUeXBlTGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPlR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgcHJpbnQgdGhlIGNoYW5nZSBzcGVjaWZpYyBzdHVmZgogICAgaWYgKCRQcmludENoYW5nZSkgewoKICAgICAgICAjIHN0YXJ0IHRoZSBmaXJzdCBwYWdlCiAgICAgICAgaWYgKCAhJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdDaGFuZ2UnICk7CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdXRwdXRIZWFkbGluZSgKICAgICAgICAgICAgSGVhZGVyQXJlYSAgICAgPT4gJEhlYWRlckFyZWEsCiAgICAgICAgICAgIEhlYWRlclZhbHVlICAgID0+ICRIZWFkZXJWYWx1ZSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJENoYW5nZS0+e0NoYW5nZVRpdGxlfSB8fCAndW5rbm93biBjaGFuZ2UgdGl0bGUnLAogICAgICAgICAgICBUZW1wbGF0ZVByZWZpeCA9PiAnQ2hhbmdlJywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBjaGFuZ2UgaW5mbwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdXRwdXRDaGFuZ2VJbmZvKAogICAgICAgICAgICBDaGFuZ2UgICAgICAgICA9PiAkQ2hhbmdlLAogICAgICAgICAgICBQcmludFdvcmtPcmRlciA9PiAkUHJpbnRXb3JrT3JkZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY2hhbmdlIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uCiAgICAgICAgIyB0aGUgcGxhaW4gY29udGVudCB3aWxsIGJlIGRpc3BsYXllZAogICAgICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhEZXNjcmlwdGlvbiBKdXN0aWZpY2F0aW9uKSkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fT3V0cHV0TG9uZ1RleHQoCiAgICAgICAgICAgICAgICBQcmludENoYW5nZSAgICA9PiAkUHJpbnRDaGFuZ2UsCiAgICAgICAgICAgICAgICBQcmludFdvcmtPcmRlciA9PiAkUHJpbnRXb3JrT3JkZXIsCiAgICAgICAgICAgICAgICBUaXRsZSA9PgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRBdHRyaWJ1dGUpLAogICAgICAgICAgICAgICAgTG9uZ1RleHQgPT4gJENoYW5nZS0+eyAkQXR0cmlidXRlIC4gJ1BsYWluJyB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlua2VkIG9iamVjdHMgd2hpY2ggYXJlIGRpcmVjdGx5IGxpbmtlZCB3aXRoIHRoaXMgY2hhbmdlIG9iamVjdAogICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgS2V5ICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbWJpbmVkIGxpbmtlZCBvYmplY3RzIGZyb20gYWxsIHdvcmtvcmRlcnMgb2YgdGhpcyBjaGFuZ2UKICAgICAgICBteSAkTGlua0xpc3RXaXRoRGF0YUNvbWJpbmVkV29ya09yZGVycyA9IHt9OwogICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9ICkgewoKICAgICAgICAgICAgIyBnZXQgbGlua2VkIG9iamVjdHMgb2YgdGhpcyB3b3Jrb3JkZXIKICAgICAgICAgICAgbXkgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXIgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBPQkpFQ1Q6CiAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICgga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyfSApIHsKCiAgICAgICAgICAgICAgICAjIG9ubHkgc2hvdyBsaW5rZWQgc2VydmljZXMgYW5kIGNvbmZpZyBpdGVtcyBvZiB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdCBuZSAnU2VydmljZScgJiYgJE9iamVjdCBuZSAnSVRTTUNvbmZpZ0l0ZW0nICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIExJTktUWVBFOgogICAgICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICAgICBESVJFQ1RJT046CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKAogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29tYmluZSB0aGUgbGlua2VkIG9iamVjdCBkYXRhIGZyb20gYWxsIHdvcmtvcmRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rTGlzdFdpdGhEYXRhQ29tYmluZWRXb3JrT3JkZXJzLT57JE9iamVjdH0tPnskTGlua1R5cGV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57JERpcmVjdGlvbn0tPnskSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57JElEfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgY29tYmluZWQgbGlua2VkIG9iamVjdHMgZnJvbSB3b3Jrb3JkZXIgdG8gbGlua2VkIG9iamVjdHMgZnJvbSBjaGFuZ2Ugb2JqZWN0CiAgICAgICAgJExpbmtMaXN0V2l0aERhdGEgPSB7CiAgICAgICAgICAgICV7JExpbmtMaXN0V2l0aERhdGF9LAogICAgICAgICAgICAleyRMaW5rTGlzdFdpdGhEYXRhQ29tYmluZWRXb3JrT3JkZXJzfSwKICAgICAgICB9OwoKICAgICAgICAjIGdldCB0aGUgbGluayBkYXRhCiAgICAgICAgaWYgKCAkTGlua0xpc3RXaXRoRGF0YSAmJiByZWYgJExpbmtMaXN0V2l0aERhdGEgZXEgJ0hBU0gnICYmICV7JExpbmtMaXN0V2l0aERhdGF9ICkgewogICAgICAgICAgICBteSAlTGlua0RhdGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICdTaW1wbGVSYXcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X091dHB1dExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgICAgICBQcmludENoYW5nZSAgICA9PiAkUHJpbnRDaGFuZ2UsCiAgICAgICAgICAgICAgICBQcmludFdvcmtPcmRlciA9PiAkUHJpbnRXb3JrT3JkZXIsCiAgICAgICAgICAgICAgICBMaW5rRGF0YSAgICAgICA9PiBcJUxpbmtEYXRhLAogICAgICAgICAgICAgICAgTGlua1R5cGVMaXN0ICAgPT4gXCVMaW5rVHlwZUxpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhbiBvdmVydmlldyBvdmVyIHdvcmtvcmRlcnMKICAgICAgICBteSBAV29ya09yZGVyT3ZlcnZpZXc7CiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7ICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9IH0gKSB7CgogICAgICAgICAgICAjIGdldCB3b3Jrb3JkZXIgaW5mbwogICAgICAgICAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJXb3JrT3JkZXIgJyRXb3JrT3JkZXJJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBXb3JrT3JkZXJPdmVydmlldywKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJOdW1iZXJ9LAogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+e1dvcmtPcmRlclRpdGxlfSwKICAgICAgICAgICAgICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZX0sCiAgICAgICAgICAgICAgICAkV29ya09yZGVyLT57UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkV29ya09yZGVyLT57UGxhbm5lZEVuZFRpbWV9LAogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+e0FjdHVhbFN0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkV29ya09yZGVyLT57QWN0dWFsRW5kVGltZX0sCiAgICAgICAgICAgICAgICBdOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X091dHB1dFdvcmtPcmRlck92ZXJ2aWV3KAogICAgICAgICAgICBXb3JrT3JkZXJPdmVydmlldyA9PiBcQFdvcmtPcmRlck92ZXJ2aWV3LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgZWl0aGVyIGEgc2luZ2xlIHdvcmtvcmRlciBvciBhbGwgd29ya29yZGVycyBvZiBhIGNoYW5nZQogICAgbXkgQFdvcmtPcmRlcklEcyA9ICRQcmludENoYW5nZQogICAgICAgID8KICAgICAgICBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB8fCBbXSB9CiAgICAgICAgOgogICAgICAgICgkV29ya09yZGVySUQpOwoKICAgIGlmICggISRTZWxmLT57UERGT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdXb3JrT3JkZXJzJyApOwogICAgfQoKICAgIGZvciBteSAkV29ya09yZGVySUQgKEBXb3JrT3JkZXJJRHMpIHsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyIGluZm8KICAgICAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCBhIG5ldyBwYWdlIGZvciBldmVyeSB3b3Jrb3JkZXIKICAgICAgICBteSAkSGVhZGVyQXJlYSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdJVFNNIFdvcmtvcmRlcicpOwogICAgICAgIG15ICRIZWFkZXJWYWx1ZSA9IGpvaW4gJy0nLCAkQ2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwgJFdvcmtPcmRlci0+e1dvcmtPcmRlck51bWJlcn07CiAgICAgICAgaWYgKCAhJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdXb3JrT3JkZXInICk7CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdXRwdXRIZWFkbGluZSgKICAgICAgICAgICAgSGVhZGVyQXJlYSAgICAgPT4gJEhlYWRlckFyZWEsCiAgICAgICAgICAgIEhlYWRlclZhbHVlICAgID0+ICRIZWFkZXJWYWx1ZSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclRpdGxlfSB8fCAndW5rbm93biB3b3Jrb3JkZXIgdGl0bGUnLAogICAgICAgICAgICBUZW1wbGF0ZVByZWZpeCA9PiAnV29ya09yZGVyJywKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fT3V0cHV0V29ya09yZGVySW5mbygKICAgICAgICAgICAgQ2hhbmdlICAgID0+ICRDaGFuZ2UsCiAgICAgICAgICAgIFdvcmtPcmRlciA9PiAkV29ya09yZGVyLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHdvcmtvcmRlciBpbnN0cnVjdGlvbiBhbmQgcmVwb3J0CiAgICAgICAgIyBUaGUgcGxhaW4gY29udGVudCB3aWxsIGJlIGRpc3BsYXllZAogICAgICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhJbnN0cnVjdGlvbiBSZXBvcnQpKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdXRwdXRMb25nVGV4dCgKICAgICAgICAgICAgICAgIFByaW50Q2hhbmdlICAgID0+IDAsCiAgICAgICAgICAgICAgICBQcmludFdvcmtPcmRlciA9PiAxLAogICAgICAgICAgICAgICAgVGl0bGUgPT4KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkQXR0cmlidXRlKSwKICAgICAgICAgICAgICAgIExvbmdUZXh0ID0+ICRXb3JrT3JkZXItPnsgJEF0dHJpYnV0ZSAuICdQbGFpbicgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICAgICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgICAgICBPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICBLZXkgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgbGluayBkYXRhCiAgICAgICAgaWYgKCAkTGlua0xpc3RXaXRoRGF0YSAmJiByZWYgJExpbmtMaXN0V2l0aERhdGEgZXEgJ0hBU0gnICYmICV7JExpbmtMaXN0V2l0aERhdGF9ICkgewogICAgICAgICAgICBteSAlTGlua0RhdGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICdTaW1wbGVSYXcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X091dHB1dExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgICAgICBQcmludENoYW5nZSAgICA9PiAwLAogICAgICAgICAgICAgICAgUHJpbnRXb3JrT3JkZXIgPT4gMSwKICAgICAgICAgICAgICAgIExpbmtEYXRhICAgICAgID0+IFwlTGlua0RhdGEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUxpc3QgICA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZW5lcmF0ZSBQREYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKCiAgICAgICAgIyBnZW5lcmF0ZSBhIGZpbGVuYW1lCiAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CiAgICAgICAgbXkgJEZpbGVuYW1lID0gJFByaW50Q2hhbmdlCiAgICAgICAgICAgID8KICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgJ2NoYW5nZV8lc18lMDJkLSUwMmQtJTAyZF8lMDJkLSUwMmQucGRmJywKICAgICAgICAgICAgJENoYW5nZS0+e0NoYW5nZU51bWJlcn0sICRZLCAkTSwgJEQsICRoLCAkbQogICAgICAgICAgICApCiAgICAgICAgICAgIDoKICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgJ3dvcmtvcmRlcl8lcy0lc18lMDJkLSUwMmQtJTAyZF8lMDJkLSUwMmQucGRmJywKICAgICAgICAgICAgJENoYW5nZS0+e0NoYW5nZU51bWJlcn0sICRXb3JrT3JkZXItPntXb3JrT3JkZXJOdW1iZXJ9LCAkWSwgJE0sICRELCAkaCwgJG0KICAgICAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gdGhlIFBERiBkb2N1bWVudAogICAgICAgIG15ICRQREZTdHJpbmcgPSAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50T3V0cHV0KCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRQREZTdHJpbmcsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2VuZXJhdGUgaHRtbCBvdXRwdXQgd2hlbiB0aGVyZSBpcyBubyBQREYtc3VwcG9ydAoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlUHJpbnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CgogICAgICAgICMgcmV0dXJuIG91dHB1dAogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgojIHN0YXJ0IHRoZSBkb2N1bWVudApzdWIgX1N0YXJ0RG9jdW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSGVhZGVyQXJlYSBIZWFkZXJWYWx1ZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JEFyZ3VtZW50fSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewoKICAgICAgICAjIFRpdGxlIG9mIHRoZSBQREYtRG9jdW1lbnQsIG9yIHRoZSBIVE1MLVBhZ2UKICAgICAgICBteSAkUHJvZHVjdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0Jyk7CiAgICAgICAgbXkgJFRpdGxlID0gc3ByaW50ZiAnJXM6ICVzIyVzJywgJFByb2R1Y3QsICRQYXJhbXtIZWFkZXJBcmVhfSwgJFBhcmFte0hlYWRlclZhbHVlfTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IFBERiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkVGl0bGUsCiAgICAgICAgICAgIEVuY29kZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKAogICAgICAgICAgICBBcmVhICA9PiAkUGFyYW17SGVhZGVyQXJlYX0sCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtIZWFkZXJWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCiMgb3V0cHV0IHRoZSBoZWFkbGluZSwgY3JlYXRlIGEgbmV3IHBhZ2UKc3ViIF9PdXRwdXRIZWFkbGluZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhIZWFkZXJBcmVhIEhlYWRlclZhbHVlIFRpdGxlIFRlbXBsYXRlUHJlZml4KSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskQXJndW1lbnR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1BERk9iamVjdH0gKSB7CiAgICAgICAgbXkgJFByaW50ZWRCeSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdwcmludGVkIGJ5Jyk7CiAgICAgICAgbXkgJFRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJyRFbnZ7IlRpbWUifScgKTsKICAgICAgICBteSAkVXJsCiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJykKICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgLiAkU2VsZi0+e1JlcXVlc3RlZFVSTH07CgogICAgICAgICMgcGFnZSBoZWFkZXJzIGFuZCBmb290ZXIKICAgICAgICBteSAkUGFnZSA9ICRTZWxmLT57UGFnZX07CiAgICAgICAgJFBhZ2UtPntIZWFkZXJSaWdodH0gPSBzcHJpbnRmICclcyMlcycsICRQYXJhbXtIZWFkZXJBcmVhfSwgJFBhcmFte0hlYWRlclZhbHVlfTsKICAgICAgICAkUGFnZS0+e0hlYWRsaW5lTGVmdH0gPSAkUGFyYW17VGl0bGV9OwogICAgICAgICRQYWdlLT57SGVhZGxpbmVSaWdodH0KICAgICAgICAgICAgPSAkUHJpbnRlZEJ5IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKSAnCiAgICAgICAgICAgIC4gJFRpbWU7CiAgICAgICAgJFBhZ2UtPntGb290ZXJMZWZ0fSA9ICRVcmw7CiAgICAgICAgJFBhZ2UtPntQYWdlVGV4dH0gICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQYWdlJyk7CiAgICAgICAgJFBhZ2UtPntQYWdlQ291bnR9ICA9IDE7CgogICAgICAgICMgY3JlYXRlIG5ldyBQREYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJXskUGFnZX0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdlLT57UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2UtPntQYWdlQ291bnR9LAogICAgICAgICk7CiAgICAgICAgJFBhZ2UtPntQYWdlQ291bnR9Kys7CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGhlYWRsaW5lIGluIHRoZSB1c2VyIHZpc2libGUgSFRNTCBvdXRwdXQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtUZW1wbGF0ZVByZWZpeH0gLiAnSGVhZGxpbmUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEhlYWRlckFyZWEgID0+ICRQYXJhbXtIZWFkZXJBcmVhfSwKICAgICAgICAgICAgICAgIEhlYWRlclZhbHVlID0+ICRQYXJhbXtIZWFkZXJWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KfQoKIyBhIGhlbHBlciBmb3IgcHJlcGFyaW5nIGEgdGFibGUgcm93IGZvciBQREYgZ2VuZXJhdGlvbgpzdWIgX1ByZXBhcmVBbmRBZGRJbmZvUm93IHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhSb3dTcGVjIERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRBcmd1bWVudH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAoICRSb3dTcGVjLCAkRGF0YSApID0gQFBhcmFte3F3KFJvd1NwZWMgRGF0YSl9OwoKICAgICMgc2hvcnQgbmFtZSwganVzdCBmb3IgY29udmVuaWVuY2UKICAgIG15ICRBdHRyaWJ1dGUgPSAkUm93U3BlYy0+e0F0dHJpYnV0ZX07CgogICAgIyBza2lwIGlmIHJvdyBpcyBzd2l0Y2hlZCBvZmYgaW4gU3lzQ29uZmlnCiAgICByZXR1cm4gaWYgJFJvd1NwZWMtPntJc09wdGlvbmFsfSAmJiAhJFNlbGYtPntDb25maWd9LT57JEF0dHJpYnV0ZX07CgogICAgIyBrZXlzIGFyZSBhbHdheXMgdHJhbnNsYXRhYmxlCiAgICBteSAkS2V5ID0gJFJvd1NwZWMtPntLZXl9IHx8ICRBdHRyaWJ1dGU7CiAgICAkS2V5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJEtleSk7CgogICAgIyBkZXRlcm1pbmUgdGhlIHZhbHVlCiAgICBteSAkVmFsdWU7CiAgICBpZiAoICRSb3dTcGVjLT57VmFsdWVJc1RpbWV9ICkgewoKICAgICAgICAjIGZvcm1hdCB0aGUgdGltZSB2YWx1ZQogICAgICAgICRWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiBxcShcJFRpbWVMb25neyJcJERhdGF7IiRBdHRyaWJ1dGUifSJ9KSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gJERhdGEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFJvd1NwZWMtPntWYWx1ZUlzVXNlcn0gKSB7CgogICAgICAgICMgZm9ybWF0IHRoZSB1c2VyIGlkCiAgICAgICAgaWYgKCAkRGF0YS0+eyAkQXR0cmlidXRlIC4gJ0lEJyB9ICkgewogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YS0+eyAkQXR0cmlidXRlIC4gJ0lEJyB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVzZXJEYXRhKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSBzcHJpbnRmICclcyAoJXMgJXMpJywKICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJMYXN0bmFtZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAiSUQ9JERhdGEtPnskQXR0cmlidXRlfSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyB0YWtlIHZhbHVlIGZyb20gdGhlIHBhc3NlZCBpbiBkYXRhCiAgICAgICAgJFZhbHVlID0gJERhdGEtPnskQXR0cmlidXRlfTsKICAgIH0KCiAgICAjIHRyYW5zbGF0ZSB0aGUgdmFsdWUKICAgIGlmICggJFZhbHVlICYmICRSb3dTcGVjLT57VmFsdWVJc1RyYW5zbGF0YWJsZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFZhbHVlKSwKICAgIH0KCiAgICAjIGFkZCBzZXBhcmF0b3IgYmV0d2VlbiBrZXkgYW5kIHZhbHVlCiAgICAkS2V5IC49ICc6JzsKCiAgICAjIHNob3cgcm93CiAgICBwdXNoIEB7ICRSb3dTcGVjLT57VGFibGV9IH0sCiAgICAgICAgeyBLZXkgPT4gJEtleSwgVmFsdWUgPT4gJFZhbHVlLCB9OwoKICAgIHJldHVybjsKfQoKIyBlbWl0IGluZm9ybWF0aW9uIGFib3V0IGEgY2hhbmdlCnN1YiBfT3V0cHV0Q2hhbmdlSW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDaGFuZ2UgUHJpbnRXb3JrT3JkZXIpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRBcmd1bWVudH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGp1c3QgZm9yIGhhdmluZyBzaG9ydGVyIG5hbWVzCiAgICBteSAkQ2hhbmdlID0gJFBhcmFte0NoYW5nZX07CgogICAgIyBmaWxsIHRoZSB0d28gdGFibGVzIG9uIHRvcCwKICAgICMgYm90aCB0YWJsZXMgaGF2ZSB0d28gY29sdW1zOiBLZXkgYW5kIFZhbHVlCiAgICBteSAoIEBUYWJsZUxlZnQsIEBUYWJsZVJpZ2h0ICk7CgogICAgIyBkZXRlcm1pbmUgdmFsdWVzIHRoYXQgY2FuJ3QgZWFzaWx5IGJlIGRldGVybWluZWQgaW4gX1ByZXBhcmVBbmRBZGRJbmZvUm93KCkKICAgIG15ICVDb21wbGljYXRlZFZhbHVlOwoKICAgICMgVmFsdWVzIGZvciBDQUIKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDQUJBZ2VudHMgQ0FCQ3VzdG9tZXJzKSkgewogICAgICAgIG15IEBMb25nTmFtZXM7CiAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdDQUJBZ2VudHMnICYmICRDaGFuZ2UtPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgZm9yIG15ICRDQUJBZ2VudCAoIEB7ICRDaGFuZ2UtPnskQXR0cmlidXRlfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRDQUJBZ2VudCwKICAgICAgICAgICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJVVzZXJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATG9uZ05hbWVzLCBzcHJpbnRmICclcyAoJXMgJXMpJywKICAgICAgICAgICAgICAgICAgICAgICAgQFVzZXJEYXRhe3F3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATG9uZ05hbWVzLCAiSUQ9JENBQkFnZW50IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ0NBQkN1c3RvbWVycycgJiYgJENoYW5nZS0+eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICBmb3IgbXkgJENBQkN1c3RvbWVyICggQHsgJENoYW5nZS0+eyRBdHRyaWJ1dGV9IH0gKSB7CiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciAgPT4gJENBQkN1c3RvbWVyLAogICAgICAgICAgICAgICAgICAgIENhY2hlID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCVVc2VyRGF0YSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQExvbmdOYW1lcywgc3ByaW50ZiAnJXMgKCVzICVzKScsCiAgICAgICAgICAgICAgICAgICAgICAgIEBVc2VyRGF0YXtxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQExvbmdOYW1lcywgIklEPSRDQUJDdXN0b21lciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgdGhlIHZhbHVlCiAgICAgICAgJENvbXBsaWNhdGVkVmFsdWV7ICRBdHRyaWJ1dGUgLiAnTG9uZycgfSA9IGpvaW4oICJcbiIsIEBMb25nTmFtZXMgKSB8fCAnLSc7CiAgICB9CgogICAgIyB2YWx1ZSBmb3IgYXR0YWNobWVudHMKICAgIHsKICAgICAgICBteSAlQXR0YWNobWVudHMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlSUR9LAogICAgICAgICk7CgogICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgIEFUVEFDSE1FTlRfSUQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50SUQgKCBrZXlzICVBdHRhY2htZW50cyApIHsKCiAgICAgICAgICAgICMgZ2V0IGluZm8gYWJvdXQgZmlsZQogICAgICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJEF0dGFjaG1lbnRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5USUQgaWYgISRBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgc3ByaW50ZiAnJXMgJXMnLAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnREYXRhLT57RmlsZXNpemV9OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHJvdwogICAgICAgICRDb21wbGljYXRlZFZhbHVle0F0dGFjaG1lbnRzfSA9IGpvaW4oICJcbiIsIEBWYWx1ZXMgKSB8fCAnLSc7CiAgICB9CgogICAgbXkgQFJvd1NwZWMgPSAoCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICAgICAgICAgID0+ICdDaGFuZ2VTdGF0ZScsCiAgICAgICAgICAgIFRhYmxlICAgICAgICAgICAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgICAgIFZhbHVlSXNUcmFuc2xhdGFibGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnUGxhbm5lZEVmZm9ydCcsCiAgICAgICAgICAgIElzT3B0aW9uYWwgPT4gMSwKICAgICAgICAgICAgVGFibGUgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQWNjb3VudGVkVGltZScsCiAgICAgICAgICAgIElzT3B0aW9uYWwgPT4gMSwKICAgICAgICAgICAgVGFibGUgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgICAgICAgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgICAgICBLZXkgICAgICAgICAgICAgICAgID0+ICdDYXRlZ29yeScsCiAgICAgICAgICAgIFRhYmxlICAgICAgICAgICAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgICAgIFZhbHVlSXNUcmFuc2xhdGFibGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgICAgICAgICA9PiAnSW1wYWN0JywKICAgICAgICAgICAgS2V5ICAgICAgICAgICAgICAgICA9PiAnSW1wYWN0JywKICAgICAgICAgICAgVGFibGUgICAgICAgICAgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgVmFsdWVJc1RyYW5zbGF0YWJsZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVGFibGUgICAgICAgICAgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgVmFsdWVJc1RyYW5zbGF0YWJsZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQ2hhbmdlTWFuYWdlcicsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBWYWx1ZUlzVXNlciA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQ2hhbmdlQnVpbGRlcicsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBWYWx1ZUlzVXNlciA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ0NBQkFnZW50c0xvbmcnLAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0NBQiBBZ2VudHMnLAogICAgICAgICAgICBUYWJsZSAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnQ0FCQ3VzdG9tZXJzTG9uZycsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ0FCIEN1c3RvbWVycycsCiAgICAgICAgICAgIFRhYmxlICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlID0+ICdBdHRhY2htZW50cycsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQXR0YWNobWVudHMnLAogICAgICAgICAgICBUYWJsZSAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+ICdSZXF1ZXN0ZWRUaW1lJywKICAgICAgICAgICAgSXNPcHRpb25hbCAgPT4gMSwKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZVJpZ2h0LAogICAgICAgICAgICBWYWx1ZUlzVGltZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnUGxhbm5lZFN0YXJ0VGltZScsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJ1BsYW5uZWRFbmRUaW1lJywKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZVJpZ2h0LAogICAgICAgICAgICBWYWx1ZUlzVGltZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQWN0dWFsU3RhcnRUaW1lJywKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZVJpZ2h0LAogICAgICAgICAgICBWYWx1ZUlzVGltZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBLZXkgICAgICAgICA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJ0NoYW5nZVRpbWUnLAogICAgICAgICAgICBLZXkgICAgICAgICA9PiAnQ2hhbmdlZCcsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICBmb3IgbXkgJFJvd1NwZWMgKEBSb3dTcGVjKSB7CgogICAgICAgICMgZmlsbCBAVGFibGVMZWZ0IGFuZCBAVGFibGVSaWdodAogICAgICAgICRTZWxmLT5fUHJlcGFyZUFuZEFkZEluZm9Sb3coCiAgICAgICAgICAgIFJvd1NwZWMgPT4gJFJvd1NwZWMsCiAgICAgICAgICAgIERhdGEgPT4geyAleyRDaGFuZ2V9LCAlQ29tcGxpY2F0ZWRWYWx1ZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY2hhbmdlIGluZm8gdGFibGUKICAgIG15ICRSb3dzID0gbWF4KCBzY2FsYXIoQFRhYmxlTGVmdCksIHNjYWxhcihAVGFibGVSaWdodCkgKTsKCiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKCiAgICAgICAgbXkgJVRhYmxlOwogICAgICAgIGZvciBteSAkUm93ICggMCAuLiAkUm93cyAtIDEgKSB7CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnRbJFJvd10tPntLZXl9OwogICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnRbJFJvd10tPntWYWx1ZX07CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzNde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodFskUm93XS0+e0tleX07CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHRbJFJvd10tPntWYWx1ZX07CiAgICAgICAgfQoKICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSA0OwogICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CgogICAgICAgICRUYWJsZXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZXtCb3JkZXJ9ICAgICAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxle0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICAgICAkVGFibGV7QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI0FBQUFBQSc7CiAgICAgICAgJFRhYmxle0JhY2tncm91bmRDb2xvck9kZH0gID0gJyNEREREREQnOwogICAgICAgICRUYWJsZXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxle1BhZGRpbmdUb3B9ICAgICAgICAgID0gMzsKICAgICAgICAkVGFibGV7UGFkZGluZ0JvdHRvbX0gICAgICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGFibGUoCiAgICAgICAgICAgIFRhYmxlID0+IFwlVGFibGUsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgc2hvdyBsZWZ0IHRhYmxlCiAgICAgICAgZm9yIG15ICRSb3cgKEBUYWJsZUxlZnQpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUluZm9MZWZ0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJFJvdywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyByaWdodCB0YWJsZQogICAgICAgIGZvciBteSAkUm93IChAVGFibGVSaWdodCkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlSW5mb1JpZ2h0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJFJvdywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KfQoKIyBlbWl0IGluZm9ybWF0aW9uIGFib3V0IGEgd29ya29yZGVyCnN1YiBfT3V0cHV0V29ya09yZGVySW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDaGFuZ2UgV29ya09yZGVyKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskQXJndW1lbnR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCAkV29ya09yZGVyLCAkQ2hhbmdlICkgPSBAUGFyYW17cXcoV29ya09yZGVyIENoYW5nZSl9OwoKICAgIG15ICRQcmludFdvcmtPcmRlciA9ICRQYXJhbXtQcmludFdvcmtPcmRlcn0gfHwgMDsKCiAgICAjIGZpbGwgdGhlIHR3byB0YWJsZXMgb24gdG9wLAogICAgIyBib3RoIHRhYmxlcyBoYXZlIHR3byBjb2x1bXM6IEtleSBhbmQgVmFsdWUKICAgIG15ICggQFRhYmxlTGVmdCwgQFRhYmxlUmlnaHQgKTsKCiAgICAjIGRldGVybWluZSB2YWx1ZXMgdGhhdCBjYW4ndCBiZSBkZXRlcm1pbmVkIGluIF9QcmVwYXJlQW5kQWRkSW5mb1JvdygpCiAgICBteSAlQ29tcGxpY2F0ZWRWYWx1ZTsKCiAgICAjIHZhbHVlIGZvciBhdHRhY2htZW50cwogICAgewogICAgICAgIG15ICVBdHRhY2htZW50cyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFZhbHVlczsKCiAgICAgICAgQVRUQUNITUVOVF9JRDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJRCAoIGtleXMgJUF0dGFjaG1lbnRzICkgewoKICAgICAgICAgICAgIyBnZXQgaW5mbyBhYm91dCBmaWxlCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQXR0YWNobWVudElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgYXR0YWNobWVudCBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlRJRCBpZiAhJEF0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgcHVzaCBAVmFsdWVzLCBzcHJpbnRmICclcyAlcycsCiAgICAgICAgICAgICAgICAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0sCiAgICAgICAgICAgICAgICAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX07CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcm93CiAgICAgICAgJENvbXBsaWNhdGVkVmFsdWV7QXR0YWNobWVudHN9ID0gam9pbiggIlxuIiwgQFZhbHVlcyApIHx8ICctJzsKICAgIH0KCiAgICAjIGFsbG93IHdyYXBwaW5nIG9mIGxvbmcgd29yZHMgaW4gdGhlIGNoYW5nZSB0aXRsZQogICAgKCAkQ29tcGxpY2F0ZWRWYWx1ZXtXcmFwcGFibGVDaGFuZ2VUaXRsZX0gPSAkQ2hhbmdlLT57Q2hhbmdlVGl0bGV9ICkKICAgICAgICA9fiBzeyAoIFxTezI1fSApIH17JDEgfXhtc2c7CgogICAgbXkgQFJvd1NwZWMgPSAoCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgPT4gJ1dyYXBwYWJsZUNoYW5nZVRpdGxlJywKICAgICAgICAgICAgVGFibGUgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlID0+ICdDaGFuZ2VOdW1iZXInLAogICAgICAgICAgICBUYWJsZSAgICAgPT4gXEBUYWJsZUxlZnQsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ2hhbmdlTnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICAgICAgICAgICA9PiAnV29ya09yZGVyU3RhdGUnLAogICAgICAgICAgICBUYWJsZSAgICAgICAgICAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBWYWx1ZUlzVHJhbnNsYXRhYmxlID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgPT4gJ1dvcmtPcmRlclR5cGUnLAogICAgICAgICAgICBUYWJsZSAgICAgICAgICAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBWYWx1ZUlzVHJhbnNsYXRhYmxlID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+ICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBWYWx1ZUlzVXNlciA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICdQbGFubmVkRWZmb3J0JywKICAgICAgICAgICAgSXNPcHRpb25hbCA9PiAxLAogICAgICAgICAgICBUYWJsZSAgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgICAgICBLZXkgICAgICAgID0+ICdQbGFubmVkRWZmb3J0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQWNjb3VudGVkVGltZScsCiAgICAgICAgICAgIElzT3B0aW9uYWwgPT4gMSwKICAgICAgICAgICAgVGFibGUgICAgICA9PiBcQFRhYmxlTGVmdCwKICAgICAgICAgICAgS2V5ICAgICAgICA9PiAnQWNjb3VudGVkVGltZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSA9PiAnQXR0YWNobWVudHMnLAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0F0dGFjaG1lbnRzJywKICAgICAgICAgICAgVGFibGUgICAgID0+IFxAVGFibGVMZWZ0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnUGxhbm5lZFN0YXJ0VGltZScsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnUGxhbm5lZEVuZFRpbWUnLAogICAgICAgICAgICBUYWJsZSAgICAgICA9PiBcQFRhYmxlUmlnaHQsCiAgICAgICAgICAgIFZhbHVlSXNUaW1lID0+IDEsCiAgICAgICAgICAgIEtleSAgICAgICAgID0+ICdQbGFubmVkRW5kVGltZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEF0dHJpYnV0ZSAgID0+ICdBY3R1YWxTdGFydFRpbWUnLAogICAgICAgICAgICBUYWJsZSAgICAgICA9PiBcQFRhYmxlUmlnaHQsCiAgICAgICAgICAgIFZhbHVlSXNUaW1lID0+IDEsCiAgICAgICAgICAgIEtleSAgICAgICAgID0+ICdBY3R1YWxTdGFydFRpbWUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgIFRhYmxlICAgICAgID0+IFxAVGFibGVSaWdodCwKICAgICAgICAgICAgVmFsdWVJc1RpbWUgPT4gMSwKICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJ0FjdHVhbEVuZFRpbWUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQ3JlYXRlVGltZScsCiAgICAgICAgICAgIEtleSAgICAgICAgID0+ICdDcmVhdGVkJywKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZVJpZ2h0LAogICAgICAgICAgICBWYWx1ZUlzVGltZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQ2hhbmdlVGltZScsCiAgICAgICAgICAgIEtleSAgICAgICAgID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgVGFibGUgICAgICAgPT4gXEBUYWJsZVJpZ2h0LAogICAgICAgICAgICBWYWx1ZUlzVGltZSA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkUm93U3BlYyAoQFJvd1NwZWMpIHsKCiAgICAgICAgIyBmaWxsIEBUYWJsZUxlZnQgYW5kIEBUYWJsZVJpZ2h0CiAgICAgICAgIyB0aGUgd29ya29yZGVyIGRhdGEgb3ZlcnJpZGVzIHRoZSBjaGFuZ2UgZGF0YQogICAgICAgICRTZWxmLT5fUHJlcGFyZUFuZEFkZEluZm9Sb3coCiAgICAgICAgICAgIFJvd1NwZWMgPT4gJFJvd1NwZWMsCiAgICAgICAgICAgIERhdGEgPT4geyAleyRDaGFuZ2V9LCAleyRXb3JrT3JkZXJ9LCAlQ29tcGxpY2F0ZWRWYWx1ZSB9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFJvd3MgPSBtYXgoIHNjYWxhcihAVGFibGVMZWZ0KSwgc2NhbGFyKEBUYWJsZVJpZ2h0KSApOwoKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgIG15ICVUYWJsZTsKICAgICAgICBmb3IgbXkgJFJvdyAoIDAgLi4gJFJvd3MgLSAxICkgewogICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0WyRSb3ddLT57S2V5fTsKICAgICAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0WyRSb3ddLT57VmFsdWV9OwogICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHRbJFJvd10tPntLZXl9OwogICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bNF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0WyRSb3ddLT57VmFsdWV9OwogICAgICAgIH0KCiAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAxNzAuNTsKICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwoKICAgICAgICAkVGFibGV7VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGV7Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZXtGb250U2l6ZX0gICAgICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxle0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNBQUFBQUEnOwogICAgICAgICRUYWJsZXtCYWNrZ3JvdW5kQ29sb3JPZGR9ICA9ICcjREREREREJzsKICAgICAgICAkVGFibGV7UGFkZGluZ30gICAgICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAgICAgJFRhYmxle1BhZGRpbmdCb3R0b219ICAgICAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRhYmxlKAogICAgICAgICAgICBUYWJsZSA9PiBcJVRhYmxlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHNob3cgbGVmdCB0YWJsZQogICAgICAgIGZvciBteSAkUm93IChAVGFibGVMZWZ0KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJJbmZvTGVmdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRSb3csCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcmlnaHQgdGFibGUKICAgICAgICBmb3IgbXkgJFJvdyAoQFRhYmxlUmlnaHQpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckluZm9SaWdodCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRSb3csCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJyc7CiAgICB9Cn0KCiMgb3V0cHV0IGEgYm9keSBvZiB0ZXh0LCBzdWNoIGFzIGEgY2hhbmdlIGRlc2NyaXB0aW9uCnN1YiBfT3V0cHV0TG9uZ1RleHQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUHJpbnRDaGFuZ2UgUHJpbnRXb3JrT3JkZXIgVGl0bGUgTG9uZ1RleHQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRBcmd1bWVudH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKCiAgICAgICAgIyBzb21lIHZlcnRpY2FsIHdoaXRlc3BhY2UKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUgZm9yIHRoZSBzZWN0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGFmdGVyIHRpdGxlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgY29tbW9uIHRvIHByaW50aW5nIGEgYm9keSBvZiB0ZXh0LAogICAgICAgICMgYWN0dWFsbHkgYSB0YWJsZSBpcyBhIGJpdCBvZiBvdmVya2lsbCBmb3IgYSBzaW5nbGUgdGV4dCwKICAgICAgICBteSAlVGFibGUgPSAoCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgQm9yZGVyICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIEZvbnQgICAgICAgICAgICA9PiAnTW9ub3NwYWNlZCcsCiAgICAgICAgICAgIEZvbnRTaXplICAgICAgICA9PiA3LAogICAgICAgICAgICBCYWNrZ3JvdW5kQ29sb3IgPT4gJyNEREREREQnLAogICAgICAgICAgICBQYWRkaW5nICAgICAgICAgPT4gNCwKICAgICAgICAgICAgUGFkZGluZ1RvcCAgICAgID0+IDgsCiAgICAgICAgICAgIFBhZGRpbmdCb3R0b20gICA9PiA4LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRhYmxlcwogICAgICAgICRUYWJsZXtDZWxsRGF0YX1bMF1bMF17Q29udGVudH0gPSAkUGFyYW17TG9uZ1RleHR9IHx8ICcnOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGFibGUoCiAgICAgICAgICAgIFRhYmxlID0+IFwlVGFibGUsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICRCbG9ja05hbWUgPSAkUGFyYW17UHJpbnRDaGFuZ2V9ID8gJ0NoYW5nZUxvbmdUZXh0JyA6ICdXb3JrT3JkZXJMb25nVGV4dCc7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICcnOwogICAgfQp9CgojIG91dHB1dCBvdmVydmlldyBvdmVyIHdvcmtvcmRlcnMKc3ViIF9PdXRwdXRXb3JrT3JkZXJPdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFdvcmtPcmRlck92ZXJ2aWV3KSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewoKICAgICAgICAjIHZlcnRpY2FsIHdoaXRlc3BhY2UgYmVmb3JlIHNlY3Rpb24gaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUgZm9yIHRoZSBzZWN0aW9uCiAgICAgICAgbXkgJFRyYW5zbGF0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9OwogICAgICAgIG15ICRTZWN0aW9uVGl0bGUgPQogICAgICAgICAgICAkVHJhbnNsYXRpb24tPkdldCgnSVRTTSBXb3Jrb3JkZXInKQogICAgICAgICAgICAuICcgJyAuICRUcmFuc2xhdGlvbi0+R2V0KCdPdmVydmlldycpCiAgICAgICAgICAgIC4gJyAoJyAuIHNjYWxhciBAeyAkUGFyYW17V29ya09yZGVyT3ZlcnZpZXd9IH0gLiAnKSc7CiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VjdGlvblRpdGxlLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGFmdGVyIHNlY3Rpb24gaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aGUgb3ZlcnZpZXcgdGFibGUgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBhIHNpbmdsZSB3b3Jrb3JkZXIsCiAgICAgICAgIyBwcmludGluZyBhbiBlbXB0eSB0YWJsZSBtaWdodCBjcmVhdGUgaGF2b2MKICAgICAgICBpZiAoIEB7ICRQYXJhbXtXb3JrT3JkZXJPdmVydmlld30gfSApIHsKCiAgICAgICAgICAgIG15ICVUYWJsZTsKICAgICAgICAgICAgbXkgJFJvdyA9IDA7CgogICAgICAgICAgICAjIGFkZCB0YWJsZSBoZWFkZXIKICAgICAgICAgICAgJFRhYmxle0NlbGxEYXRhfVsgJFJvdysrIF0gPSBbCiAgICAgICAgICAgICAgICB7IEZvbnQgPT4gJ1Byb3BvcnRpb25hbEJvbGQnLCBDb250ZW50ID0+ICcjJywgfSwKICAgICAgICAgICAgICAgIHsgRm9udCA9PiAnUHJvcG9ydGlvbmFsQm9sZCcsIENvbnRlbnQgPT4gJFRyYW5zbGF0aW9uLT5HZXQoJ1RpdGxlJyksIH0sCiAgICAgICAgICAgICAgICB7IEZvbnQgPT4gJ1Byb3BvcnRpb25hbEJvbGQnLCBDb250ZW50ID0+ICRUcmFuc2xhdGlvbi0+R2V0KCdTdGF0ZScpLCB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEZvbnQgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFRyYW5zbGF0aW9uLT5HZXQoJ1BsYW5uZWRTdGFydFRpbWUnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRm9udCAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVHJhbnNsYXRpb24tPkdldCgnUGxhbm5lZEVuZFRpbWUnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRm9udCAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkVHJhbnNsYXRpb24tPkdldCgnQWN0dWFsU3RhcnRUaW1lJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEZvbnQgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFRyYW5zbGF0aW9uLT5HZXQoJ0FjdHVhbEVuZFRpbWUnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF07CgogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlciAoIEB7ICRQYXJhbXtXb3JrT3JkZXJPdmVydmlld30gfSApIHsKICAgICAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bICRSb3crKyBdID0gWyBtYXAgeyB7IENvbnRlbnQgPT4gJF8gfSB9IEB7JFdvcmtPcmRlcn0gXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDI7CiAgICAgICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA2MzsKICAgICAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDI1OwogICAgICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gNDA7CiAgICAgICAgICAgICRUYWJsZXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSA0MDsKICAgICAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzVde1dpZHRofSA9IDQwOwogICAgICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bNl17V2lkdGh9ID0gNDA7CgogICAgICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICAgICAkVGFibGV7VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICAgICAkVGFibGV7Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgICAgICRUYWJsZXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAgICAgJFRhYmxle0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgICAgICRUYWJsZXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAgICAgJFRhYmxle1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICAgICAkVGFibGV7UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRhYmxlKAogICAgICAgICAgICAgICAgVGFibGUgPT4gXCVUYWJsZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgd29ya29yZGVyIG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGFsbCByb3dzCiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXIgKCBAeyAkUGFyYW17V29ya09yZGVyT3ZlcnZpZXd9IH0gKSB7CiAgICAgICAgICAgIG15ICVEYXRhOwogICAgICAgICAgICBARGF0YXsKICAgICAgICAgICAgICAgIHF3KCBXb3JrT3JkZXJOdW1iZXIgV29ya09yZGVyVGl0bGUgV29ya09yZGVyU3RhdGUKICAgICAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lIEFjdHVhbFN0YXJ0VGltZSBBY3R1YWxFbmRUaW1lICkKICAgICAgICAgICAgICAgIH0gPSBAeyRXb3JrT3JkZXJ9OwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyBvdXRwdXQgaW5mbyBhYm91dCBsaW5rZWQgb2JqZWN0cyBvZiBhIGNoYW5nZSBvciBhIHdvcmtvcmRlcgpzdWIgX091dHB1dExpbmtlZE9iamVjdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQcmludENoYW5nZSBQcmludFdvcmtPcmRlciBMaW5rRGF0YSBMaW5rVHlwZUxpc3QpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVR5cGVMaXN0ID0gJXsgJFBhcmFte0xpbmtUeXBlTGlzdH0gfTsKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewoKICAgICAgICBteSAlVGFibGU7CiAgICAgICAgbXkgJFJvdyA9IDA7CiAgICAgICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyAkUGFyYW17TGlua0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgICAgIG15IEBMaW5rRGF0YSA9IHNwbGl0IHF7Ojp9LCAkTGlua1R5cGVMaW5rRGlyZWN0aW9uOwogICAgICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKICAgICAgICAgICAgJExpbmtUeXBlTmFtZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRMaW5rVHlwZU5hbWUpOwoKICAgICAgICAgICAgIyBkZWZpbmUgaGVhZGxpbmUKICAgICAgICAgICAgJFRhYmxle0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMaW5rVHlwZU5hbWUgLiAnOic7CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAnJzsKCiAgICAgICAgICAgICMgZXh0cmFjdCBvYmplY3QgbGlzdAogICAgICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRQYXJhbXtMaW5rRGF0YX0tPnskTGlua1R5cGVMaW5rRGlyZWN0aW9ufTsKCiAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE9iamVjdExpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9IHx8PSAnJzsKICAgICAgICAgICAgICAgICAgICAkVGFibGV7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEl0ZW0tPntUaXRsZX0gfHwgJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZSB7CiAgICAgICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkVGFibGV7Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAgICAgJFRhYmxle0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTGlua2VkIE9iamVjdHMnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxle1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGV7Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxle0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGV7UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxle1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGFibGUoCiAgICAgICAgICAgIFRhYmxlID0+IFwlVGFibGUsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGRldGVybWluZSB0aGUgbG9jYXRpb24gaW4gdGhlIHBhZ2UKICAgICAgICBteSAkQmxvY2tQcmVmaXggPSAkUGFyYW17UHJpbnRDaGFuZ2V9ID8gJ0NoYW5nZScgOiAnV29ya09yZGVyJzsKCiAgICAgICAgIyBvdXRwdXQgbGluayBkYXRhCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tQcmVmaXggLiAnTGlua2VkT2JqZWN0cycsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyAkUGFyYW17TGlua0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgICAgIG15IEBMaW5rRGF0YSA9IHNwbGl0IHF7Ojp9LCAkTGlua1R5cGVMaW5rRGlyZWN0aW9uOwogICAgICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgdHlwZSBkYXRhCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRCbG9ja1ByZWZpeCAuICdMaW5rVHlwZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaW5rVHlwZU5hbWUgPT4gJExpbmtUeXBlTmFtZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkUGFyYW17TGlua0RhdGF9LT57JExpbmtUeXBlTGlua0RpcmVjdGlvbn07CgogICAgICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayB0eXBlIGRhdGEKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRCbG9ja1ByZWZpeCAuICdMaW5rVHlwZVJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1N0cmcgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIG91dHB1dCBhIHRhYmxlLCBhY2Nyb3NzIHNldmVyYWwgcGFnZXMgaWYgbmVjY2Vzc2FyeQpzdWIgX1BERk91dHB1dFRhYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGFibGUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBqdXN0IGZvciBoYXZpbmcgc2hvcnRlciBuYW1lcwogICAgbXkgJFRhYmxlID0gJFBhcmFte1RhYmxlfTsKICAgIG15ICRQYWdlICA9ICRTZWxmLT57UGFnZX07CgogICAgZm9yICggJFBhZ2UtPntQYWdlQ291bnR9IC4uICRQYWdlLT57TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAleyRUYWJsZX0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAleyRUYWJsZX0gKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgaWYgKCAkVGFibGUtPntTdGF0ZX0gKSB7CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAleyRQYWdlfSwKICAgICAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+IGpvaW4oICcgJywgJFBhZ2UtPntQYWdlVGV4dH0sICRQYWdlLT57UGFnZUNvdW50fSApLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZS0+e1BhZ2VDb3VudH0rKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVBTQS5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IGNoYW5nZSBwcm9qZWN0ZWQgc2VydmljZSBhdmFpbGliaWxpdHkgb3ZlcnZpZXcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VQU0EucG0sdiAxLjEgMjAxMC8wMS8zMSAxNDozNjoxNiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZVBTQTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCBVc2VyT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgZmlsdGVyIGFuZCB2aWV3IHBhcmFtcwogICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICdBbGwnOwogICAgJFNlbGYtPntWaWV3fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4sIHVzZWQgZm9yIGJhY2tsaW5rcwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuQ2hhbmdlcycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgc29ydGluZyBwYXJhbWV0ZXJzCiAgICBteSAkU29ydEJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J1NvcnRCeTo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1BsYW5uZWRTdGFydFRpbWUnOwoKICAgICMgZ2V0IG9yZGVyaW5nIHBhcmFtZXRlcnMKICAgIG15ICRPcmRlckJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBzdGFydGluZyB3aXRoIHBhZ2UgLi4uCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIENPTFVNTk5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lICgga2V5cyAlUG9zc2libGVDb2x1bW4gKSB7CiAgICAgICAgICAgIG5leHQgQ09MVU1OTkFNRSBpZiAhJFBvc3NpYmxlQ29sdW1ueyROYW1lfTsKICAgICAgICAgICAgcHVzaCBAU2hvd0NvbHVtbnMsICROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBmaWx0ZXJzCiAgICBteSAlRmlsdGVyczsKCiAgICAjIHNldCBvdGhlciBmaWx0ZXJzIGJhc2VkIG9uIGNoYW5nZSBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSApIHsKCiAgICAgICAgIyBkZWZpbmUgcG9zaXRpb24gb2YgdGhlIGZpbHRlciBpbiB0aGUgZnJvbnRlbmQKICAgICAgICBteSAkUHJpb0NvdW50ZXIgPSAxMDAwOwoKICAgICAgICAjIGdldCBhbGwgY2hhbmdlIHN0YXRlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGZpbHRlcnMKICAgICAgICBDSEFOR0VTVEFURToKICAgICAgICBmb3IgbXkgJENoYW5nZVN0YXRlICggQHsgJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBlbXB0eSBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgc3RhdGUgaXMgdmFsaWQgYnkgbG9va2luZyB1cCB0aGUgc3RhdGUgaWQKICAgICAgICAgICAgbXkgJENoYW5nZVN0YXRlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGVJRDsKCiAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIFByaW9Db3VudGVyCiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwoKICAgICAgICAgICAgIyBhZGQgZmlsdGVyIGZvciB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhdGUKICAgICAgICAgICAgJEZpbHRlcnN7JENoYW5nZVN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvICAgPT4gJFByaW9Db3VudGVyLAogICAgICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+IFskQ2hhbmdlU3RhdGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyCiAgICAgICAgJEZpbHRlcnN7QWxsfSA9IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdBbGwnLAogICAgICAgICAgICBQcmlvICAgPT4gMTAwMCwKICAgICAgICAgICAgU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30sCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiSW52YWxpZCBGaWx0ZXI6ICRTZWxmLT57RmlsdGVyfSEiICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgJXsgJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9LT57U2VhcmNofSB9LAogICAgKTsKCiAgICAjIGRpc3BsYXkgYWxsIG5hdmJhciBmaWx0ZXJzCiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXIgKCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhbmdlcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICBteSAkQ291bnQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNob3cgY2hhbmdlcwogICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyZTb3J0Qnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU29ydEJ5ICkKICAgICAgICAuICcmT3JkZXJCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICkKICAgICAgICAuICcmJzsKICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmJzsKICAgIG15ICRMaW5rRmlsdGVyID0gJ1NvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJyZPcmRlckJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJic7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTUNoYW5nZUxpc3RTaG93KAoKICAgICAgICBDaGFuZ2VJRHMgPT4gJENoYW5nZUlEc1JlZiwKICAgICAgICBUb3RhbCAgICAgPT4gc2NhbGFyIEB7JENoYW5nZUlEc1JlZn0sCgogICAgICAgIFZpZXcgPT4gJFNlbGYtPntWaWV3fSwKCiAgICAgICAgRmlsdGVyICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRmlsdGVycyAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rID0+ICRMaW5rRmlsdGVyLAoKICAgICAgICBUaXRsZU5hbWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ092ZXJ2aWV3JykKICAgICAgICAgICAgLiAnOiAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BTQScpLAoKICAgICAgICBUaXRsZVZhbHVlID0+ICRTZWxmLT57RmlsdGVyfSwKCiAgICAgICAgRW52ICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ID0+ICRMaW5rU29ydCwKCiAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKICAgICk7CgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVNjaGVkdWxlLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgY2hhbmdlIHNjaGVkdWxlIG92ZXJ2aWV3IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlU2NoZWR1bGUucG0sdiAxLjEgMjAxMC8wMS8yOCAxMjozMDo0MiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZVNjaGVkdWxlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0IFVzZXJPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCBmaWx0ZXIgYW5kIHZpZXcgcGFyYW1zCiAgICAkU2VsZi0+e0ZpbHRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWx0ZXInICkgfHwgJ0FsbCc7CiAgICAkU2VsZi0+e1ZpZXd9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdWaWV3JyApICAgfHwgJyc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbiwgdXNlZCBmb3IgYmFja2xpbmtzCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5DaGFuZ2VzJywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIGdldCBzb3J0aW5nIHBhcmFtZXRlcnMKICAgIG15ICRTb3J0QnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgIG15IEBTb3J0QnlBcnJheSAgPSAoJFNvcnRCeSk7CiAgICBteSBAT3JkZXJCeUFycmF5ID0gKCRPcmRlckJ5KTsKCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggUmVmcmVzaCA9PiAkUmVmcmVzaCApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgJE91dHB1dCA9ICcnOwoKICAgICMgZmluZCBvdXQgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgc2hvd24KICAgIG15IEBTaG93Q29sdW1uczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9ICkgewoKICAgICAgICAjIGdldCBhbGwgcG9zc2libGUgY29sdW1ucyBmcm9tIGNvbmZpZwogICAgICAgIG15ICVQb3NzaWJsZUNvbHVtbiA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSB9OwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNob3duCiAgICAgICAgQ09MVU1OTkFNRToKICAgICAgICBmb3IgbXkgJE5hbWUgKCBrZXlzICVQb3NzaWJsZUNvbHVtbiApIHsKICAgICAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkUG9zc2libGVDb2x1bW57JE5hbWV9OwogICAgICAgICAgICBwdXNoIEBTaG93Q29sdW1ucywgJE5hbWU7CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGZpbHRlcnMKICAgIG15ICVGaWx0ZXJzOwoKICAgICMgc2V0IG90aGVyIGZpbHRlcnMgYmFzZWQgb24gY2hhbmdlIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICkgewoKICAgICAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgICAgIG15ICRQcmlvQ291bnRlciA9IDEwMDA7CgogICAgICAgICMgZ2V0IGFsbCBjaGFuZ2Ugc3RhdGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgZmlsdGVycwogICAgICAgIENIQU5HRVNUQVRFOgogICAgICAgIGZvciBteSAkQ2hhbmdlU3RhdGUgKCBAeyAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzdGF0ZSBpcyB2YWxpZCBieSBsb29raW5nIHVwIHRoZSBzdGF0ZSBpZAogICAgICAgICAgICBteSAkQ2hhbmdlU3RhdGVJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkQ2hhbmdlU3RhdGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgaW52YWxpZCBjaGFuZ2Ugc3RhdGVzCiAgICAgICAgICAgIG5leHQgQ0hBTkdFU1RBVEUgaWYgISRDaGFuZ2VTdGF0ZUlEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgUHJpb0NvdW50ZXIKICAgICAgICAgICAgJFByaW9Db3VudGVyKys7CgogICAgICAgICAgICAjIGFkZCBmaWx0ZXIgZm9yIHRoZSBjdXJyZW50IGNoYW5nZSBzdGF0ZQogICAgICAgICAgICAkRmlsdGVyc3skQ2hhbmdlU3RhdGV9ID0gewogICAgICAgICAgICAgICAgTmFtZSAgID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gWyRDaGFuZ2VTdGF0ZV0sCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBvbmx5IG9uZSBmaWx0ZXIgZXhpc3RzCiAgICBpZiAoIHNjYWxhciBrZXlzICVGaWx0ZXJzID09IDEgKSB7CgogICAgICAgICMgZ2V0IHRoZSBuYW1lIG9mIHRoZSBvbmx5IGZpbHRlcgogICAgICAgIG15ICgkRmlsdGVyTmFtZSkgPSBrZXlzICVGaWx0ZXJzOwoKICAgICAgICAjIGFjdGl2YXRlIHRoaXMgZmlsdGVyCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJEZpbHRlck5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgZGVmYXVsdCBmaWx0ZXIKICAgICAgICAkRmlsdGVyc3tBbGx9ID0gewogICAgICAgICAgICBOYW1lICAgPT4gJ0FsbCcsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgZmlsdGVyIGlzIHZhbGlkCiAgICBpZiAoICEkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJJbnZhbGlkIEZpbHRlcjogJFNlbGYtPntGaWx0ZXJ9ISIgKTsKICAgIH0KCiAgICAjIHNlYXJjaCBjaGFuZ2VzIHdoaWNoIG1hdGNoIHRoZSBzZWxlY3RlZCBmaWx0ZXIKICAgIG15ICRDaGFuZ2VJRHNSZWYgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAleyAkRmlsdGVyc3sgJFNlbGYtPntGaWx0ZXJ9IH0tPntTZWFyY2h9IH0sCiAgICApOwoKICAgICMgZGlzcGxheSBhbGwgbmF2YmFyIGZpbHRlcnMKICAgIG15ICVOYXZCYXJGaWx0ZXI7CiAgICBmb3IgbXkgJEZpbHRlciAoIGtleXMgJUZpbHRlcnMgKSB7CgogICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiBjaGFuZ2VzIGZvciBlYWNoIGZpbHRlcgogICAgICAgIG15ICRDb3VudCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IHRoZSBuYXZiYXIgZmlsdGVyCiAgICAgICAgJE5hdkJhckZpbHRlcnsgJEZpbHRlcnN7JEZpbHRlcn0tPntQcmlvfSB9ID0gewogICAgICAgICAgICBDb3VudCAgPT4gJENvdW50LAogICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlciwKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0gfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2hvdyBjaGFuZ2VzCiAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJlNvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJyZPcmRlckJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJyYnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyYnOwogICAgbXkgJExpbmtGaWx0ZXIgPSAnU29ydEJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnJk9yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmJzsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ2hhbmdlTGlzdFNob3coCgogICAgICAgIENoYW5nZUlEcyA9PiAkQ2hhbmdlSURzUmVmLAogICAgICAgIFRvdGFsICAgICA9PiBzY2FsYXIgQHskQ2hhbmdlSURzUmVmfSwKCiAgICAgICAgVmlldyA9PiAkU2VsZi0+e1ZpZXd9LAoKICAgICAgICBGaWx0ZXIgICAgID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBGaWx0ZXJzICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIEZpbHRlckxpbmsgPT4gJExpbmtGaWx0ZXIsCgogICAgICAgIFRpdGxlTmFtZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnT3ZlcnZpZXcnKQogICAgICAgICAgICAuICc6ICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ2hhbmdlIFNjaGVkdWxlJyksCgogICAgICAgIFRpdGxlVmFsdWUgPT4gJFNlbGYtPntGaWx0ZXJ9LAoKICAgICAgICBFbnYgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgPT4gJExpbmtTb3J0LAoKICAgICAgICBTaG93Q29sdW1ucyA9PiBcQFNob3dDb2x1bW5zLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVNlYXJjaC5wbSAtIG1vZHVsZSBmb3IgY2hhbmdlIHNlYXJjaAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlU2VhcmNoLnBtLHYgMS41NiAyMDEwLzA3LzAxIDEzOjUyOjEzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ2hhbmdlU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VhcmNoUHJvZmlsZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjU2ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBHcm91cE9iamVjdCBDb25maWdPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZWFyY2hQcm9maWxlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZWFyY2hQcm9maWxlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlkIGRhdGEKICAgICRTZWxmLT57U3RhcnRIaXR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMTsKICAgICRTZWxmLT57U2VhcmNoTGltaXR9ID0gJFNlbGYtPntDb25maWd9LT57U2VhcmNoTGltaXR9IHx8IDUwMDsKICAgICRTZWxmLT57U29ydEJ5fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydTb3J0Qnk6OkRlZmF1bHQnfQogICAgICAgIHx8ICdDaGFuZ2VJRCc7CiAgICAkU2VsZi0+e09yZGVyQnl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ0Rvd24nOwogICAgJFNlbGYtPntUYWtlTGFzdFNlYXJjaH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUYWtlTGFzdFNlYXJjaCcgKSB8fCAnJzsKICAgICRTZWxmLT57UHJvZmlsZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcm9maWxlJyApIHx8ICdsYXN0LXNlYXJjaCc7CgogICAgIyBzZWFyY2ggcGFyYW1ldGVycwogICAgbXkgJUdldFBhcmFtOwoKICAgICMgZ2V0IGNvbmZpZ3VyZWQgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkIG51bWJlcnMKICAgIG15IEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcygpOwoKICAgICMgZ2V0IGNvbmZpZ3VyZWQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkIG51bWJlcnMKICAgIG15IEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMKICAgICAgICA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0Q29uZmlndXJlZEZyZWVUZXh0RmllbGRzKCk7CgogICAgIyBsb2FkIHBhcmFtZXRlcnMgZnJvbSBzZWFyY2ggcHJvZmlsZSwKICAgICMgdGhpcyBoYXBwZW5zIHdoZW4gdGhlIG5leHQgcmVzdWx0IHBhZ2Ugc2hvdWxkIGJlIHNob3duLCBvciB3aGVuIHRoZSByZXN1bHRzIGFyZSByZW9yZGVyZWQKICAgIGlmICggKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xvYWRQcm9maWxlJyAmJiAkU2VsZi0+e1Byb2ZpbGV9ICkgfHwgJFNlbGYtPntUYWtlTGFzdFNlYXJjaH0gKSB7CiAgICAgICAgJUdldFBhcmFtID0gJFNlbGYtPntTZWFyY2hQcm9maWxlT2JqZWN0fS0+U2VhcmNoUHJvZmlsZUdldCgKICAgICAgICAgICAgQmFzZSAgICAgID0+ICdJVFNNQ2hhbmdlU2VhcmNoJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCBzY2FsYXIgc2VhcmNoIHBhcmFtcwogICAgICAgIGZvciBteSAkUGFyYW1OYW1lICgKICAgICAgICAgICAgcXcoCiAgICAgICAgICAgIENoYW5nZU51bWJlciBDaGFuZ2VUaXRsZSBEZXNjcmlwdGlvbiBKdXN0aWZpY2F0aW9uCiAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyIENBQkN1c3RvbWVyCiAgICAgICAgICAgIFNlbGVjdGVkVXNlcjEgICAgICAgIENBQkFnZW50CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlIFdvcmtPcmRlckluc3RydWN0aW9uIFdvcmtPcmRlclJlcG9ydAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwoKICAgICAgICAgICAgIyByZW1vdmUgd2hpdGVzcGFjZSBvbiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9fiBzeyBcQSBccysgfXt9eG1zOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID1+IHN7IFxzKyBceiB9e314bXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGFycmF5IHNlYXJjaCBwYXJhbXMKICAgICAgICBmb3IgbXkgJFNlYXJjaFBhcmFtICgKICAgICAgICAgICAgcXcoIENoYW5nZVN0YXRlSURzCiAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRHMgQ2hhbmdlQnVpbGRlcklEcwogICAgICAgICAgICBQcmlvcml0eUlEcyBDYXRlZ29yeUlEcyBJbXBhY3RJRHMKICAgICAgICAgICAgQ3JlYXRlQnkKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgV29ya09yZGVyQWdlbnRJRHMKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSBAQXJyYXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRTZWFyY2hQYXJhbSApOwogICAgICAgICAgICBpZiAoQEFycmF5KSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFNlYXJjaFBhcmFtfSA9IFxAQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRpbWUgcmVsYXRlZCBwYXJhbXMKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlICgKICAgICAgICAgICAgcXcoIFJlcXVlc3RlZCBQbGFubmVkU3RhcnQgUGxhbm5lZEVuZCBBY3R1YWxTdGFydCBBY3R1YWxFbmQgQ3JlYXRlIENoYW5nZSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGZvciBteSAkUGFydCAoCiAgICAgICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIFNlYXJjaFR5cGUKICAgICAgICAgICAgICAgIFBvaW50Rm9ybWF0IFBvaW50IFBvaW50U3RhcnQKICAgICAgICAgICAgICAgIFN0YXJ0IFN0YXJ0RGF5IFN0YXJ0TW9udGggU3RhcnRZZWFyCiAgICAgICAgICAgICAgICBTdG9wICBTdG9wRGF5ICBTdG9wTW9udGggIFN0b3BZZWFyCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRQYXJhbUtleSA9ICIke1RpbWVUeXBlfVRpbWUke1BhcnR9IjsKICAgICAgICAgICAgICAgIG15ICRQYXJhbVZhbCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtS2V5ICk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgd2hpdGUgc3BhY2Ugb24gdGhlIHN0YXJ0IGFuZCBlbmQKICAgICAgICAgICAgICAgIGlmICgkUGFyYW1WYWwpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1WYWwgPX4gc3sgXEEgXHMrIH17fXhtczsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1WYWwgPX4gc3sgXHMrIFx6IH17fXhtczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHN0b3JlIGluICVHZXRQYXJhbQogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbUtleX0gPSAkUGFyYW1WYWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGNoYW5nZSBmcmVldGV4dCBwYXJhbXMKICAgICAgICBOVU1CRVI6CiAgICAgICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgICAgICMgY29uc2lkZXIgb25seSBmcmVldGV4dCBmaWVsZHMgd2hpY2ggYXJlIGFjdGl2YXRlZCBpbiB0aGlzIGZyb250ZW5kCiAgICAgICAgICAgIG5leHQgTlVNQkVSIGlmICEkU2VsZi0+e0NvbmZpZ30tPntDaGFuZ2VGcmVlVGV4dH0tPnskTnVtYmVyfTsKCiAgICAgICAgICAgIG15ICRLZXkgICA9ICdDaGFuZ2VGcmVlS2V5JyAuICROdW1iZXI7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICdDaGFuZ2VGcmVlVGV4dCcgLiAkTnVtYmVyOwoKICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAgICAgJEdldFBhcmFteyRWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRWYWx1ZSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgd29ya29yZGVyIGZyZWV0ZXh0IHBhcmFtcwogICAgICAgIE5VTUJFUjoKICAgICAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICAgICAgIyBjb25zaWRlciBvbmx5IGZyZWV0ZXh0IGZpZWxkcyB3aGljaCBhcmUgYWN0aXZhdGVkIGluIHRoaXMgZnJvbnRlbmQKICAgICAgICAgICAgbmV4dCBOVU1CRVIgaWYgISRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9OwoKICAgICAgICAgICAgbXkgJEtleSAgID0gJ1dvcmtPcmRlckZyZWVLZXknIC4gJE51bWJlcjsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXI7CgogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICAgICAkR2V0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIG9sZCBwcm9maWxlIHN0dWZmCiAgICAkU2VsZi0+e1NlYXJjaFByb2ZpbGVPYmplY3R9LT5TZWFyY2hQcm9maWxlRGVsZXRlKAogICAgICAgIEJhc2UgICAgICA9PiAnSVRTTUNoYW5nZVNlYXJjaCcsCiAgICAgICAgTmFtZSAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICk7CgogICAgIyBpbnNlcnQgbmV3IHByb2ZpbGUgcGFyYW1zCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJUdldFBhcmFtICkgewogICAgICAgIGlmICggJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkU2VsZi0+e1NlYXJjaFByb2ZpbGVPYmplY3R9LT5TZWFyY2hQcm9maWxlQWRkKAogICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdJVFNNQ2hhbmdlU2VhcmNoJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBzZWFyY2hpbmcgd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICAjIFRoZSBlbnRyaWVzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgdGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIHVzZXIgcmVxdWVzdHMgd2hlbiBhdXRvY29tcGxldGlvbiBpcyB0dXJuZWQgb2ZmCiAgICAjICVFeHBhbmRJbmZvIGdldHMgaW5mbyBhYm91dCBjaG9zZW4gdXNlciBhbmQgYWxsIGF2YWlsYWJsZSB1c2VycwogICAgbXkgJUV4cGFuZEluZm87CgogICAgIyBzaG93IHJlc3VsdCBzaXRlIG9yIHBlcmZvcm0gb3RoZXIgYWN0aW9ucwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcgKSB7CgogICAgICAgICMgRXh0cmFjdCB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciBzZWFyY2hpbmcsCiAgICAgICAgIyB3aGljaCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgc2VhcmNoIHByb2ZpbGUKICAgICAgICBmb3IgbXkgJFBhcmFtTmFtZSAoCiAgICAgICAgICAgIHF3KAogICAgICAgICAgICBDQUJDdXN0b21lcklEIEV4cGFuZENBQkN1c3RvbWVyMSBFeHBhbmRDQUJDdXN0b21lcjIgQ2xlYXJDQUJDdXN0b21lcgogICAgICAgICAgICBDQUJBZ2VudElEICAgIEV4cGFuZENBQkFnZW50MSAgICBFeHBhbmRDQUJBZ2VudDIgICAgQ2xlYXJDQUJBZ2VudAogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgICAgIH0KCiAgICAgICAgIyBpcyBhICJzZWFyY2ggdXNlciIgb3IgInNlYXJjaCBjdXN0b21lciIgYnV0dG9uIGNsaWNrZWQKICAgICAgICBteSAkRXhwYW5kVXNlciA9ICRHZXRQYXJhbXtFeHBhbmRDQUJBZ2VudDF9IHx8ICRHZXRQYXJhbXtFeHBhbmRDQUJBZ2VudDJ9CiAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtFeHBhbmRDQUJDdXN0b21lcjF9IHx8ICRHZXRQYXJhbXtFeHBhbmRDQUJDdXN0b21lcjJ9OwoKICAgICAgICAjIGlzIGEgImNsZWFyIHVzZXIiIGJ1dHRvbiBjbGlja2VkCiAgICAgICAgbXkgJENsZWFyVXNlciA9ICRHZXRQYXJhbXtDbGVhckNBQkFnZW50fSB8fCAkR2V0UGFyYW17Q2xlYXJDQUJDdXN0b21lcn07CgogICAgICAgIGlmICgkRXhwYW5kVXNlcikgewoKICAgICAgICAgICAgIyBnZXQgdXNlciBhbmQgY3VzdG9tZXIgaW5mbyB3aGVuIGF1dG9jb21wbGV0aW9uIGlzIHR1cm5lZCBvZmYKICAgICAgICAgICAgJUV4cGFuZEluZm8gPSAkU2VsZi0+X0dldEV4cGFuZEluZm8oJUdldFBhcmFtKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRDbGVhclVzZXIpIHsKCiAgICAgICAgICAgICMgd2hpY2ggZmllbGRzIHRvIGNsZWFyCiAgICAgICAgICAgIG15ICVGaWVsZE1hcCA9ICgKICAgICAgICAgICAgICAgIENsZWFyQ0FCQWdlbnQgICAgPT4gW3F3KENBQkFnZW50ICAgIFNlbGVjdGVkVXNlcjEpXSwKICAgICAgICAgICAgICAgIENsZWFyQ0FCQ3VzdG9tZXIgPT4gW3F3KENBQkN1c3RvbWVyIFNlbGVjdGVkQ3VzdG9tZXJVc2VyKV0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFjdHVhbGx5IGNsZWFyIHRoZSBmaWVsZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXR0b24gdGhhdCB3YXMgY2xpY2tlZAogICAgICAgICAgICBteSAkRmllbGRzID0gJEZpZWxkTWFweyRDbGVhclVzZXJ9IHx8IFtdOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskRmllbGRzfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskRmllbGR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICAgICAgICAgIG15ICRVUkwKICAgICAgICAgICAgICAgID0gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2VTZWFyY2gmU3ViYWN0aW9uPVNlYXJjaCZQcm9maWxlPSRTZWxmLT57UHJvZmlsZX0mU29ydEJ5PSRTZWxmLT57U29ydEJ5fSIKICAgICAgICAgICAgICAgIC4gIiZPcmRlckJ5PSRTZWxmLT57T3JkZXJCeX0mVGFrZUxhc3RTZWFyY2g9MSZTdGFydEhpdD0kU2VsZi0+e1N0YXJ0SGl0fSI7CiAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5DaGFuZ2VzJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVVJMLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0Q2hhbmdlVmlldycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVSTCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcHJlcGFyZSBDQUJBZ2VudHMgYW5kIENBQkN1c3RvbWVycywgY2hlY2tpbmcgZm9yIGVtcHRpZWQgdGV4dCBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VsZWN0ZWRVc2VyMX0gJiYgJEdldFBhcmFte0NBQkFnZW50fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDQUJBZ2VudHN9ID0gWyAkR2V0UGFyYW17U2VsZWN0ZWRVc2VyMX0gXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtTZWxlY3RlZEN1c3RvbWVyVXNlcn0gJiYgJEdldFBhcmFte0NBQkN1c3RvbWVyfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDQUJDdXN0b21lcnN9ID0gWyAkR2V0UGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9IF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFuZCBjaGVjayB0aGUgdGltZSBzZWFyY2ggcGFyYW1ldGVycwogICAgICAgICAgICBUSU1FVFlQRToKICAgICAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAoCiAgICAgICAgICAgICAgICBxdyggUmVxdWVzdGVkIFBsYW5uZWRTdGFydCBQbGFubmVkRW5kIEFjdHVhbFN0YXJ0IEFjdHVhbEVuZCBDcmVhdGUgQ2hhbmdlICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgdGltZSBzZWFyY2ggcGFyYW1ldGVycyBmb3IgJFRpbWVUeXBlIGludG8gJVRpbWVTZWxlY3Rpb25QYXJhbQogICAgICAgICAgICAgICAgbXkgJVRpbWVTZWxlY3Rpb25QYXJhbTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGFydCAoCiAgICAgICAgICAgICAgICAgICAgcXcoCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVHlwZQogICAgICAgICAgICAgICAgICAgIFBvaW50Rm9ybWF0IFBvaW50IFBvaW50U3RhcnQKICAgICAgICAgICAgICAgICAgICBTdGFydCBTdGFydERheSBTdGFydE1vbnRoIFN0YXJ0WWVhcgogICAgICAgICAgICAgICAgICAgIFN0b3AgIFN0b3BEYXkgIFN0b3BNb250aCAgU3RvcFllYXIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRUaW1lU2VsZWN0aW9uUGFyYW17JFBhcnR9ID0gJEdldFBhcmFteyAkVGltZVR5cGUgLiAnVGltZScgLiAkUGFydCB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgbm90aGluZyB0byBkbywgd2hlbiBubyB0aW1lIHNlYXJjaCB0eXBlIGhhcyBiZWVuIHNlbGVjdGVkCiAgICAgICAgICAgICAgICBuZXh0IFRJTUVUWVBFIGlmICEkVGltZVNlbGVjdGlvblBhcmFte1NlYXJjaFR5cGV9OwoKICAgICAgICAgICAgICAgIGlmICggJFRpbWVTZWxlY3Rpb25QYXJhbXtTZWFyY2hUeXBlfSBlcSAnVGltZVNsb3QnICkgewoKICAgICAgICAgICAgICAgICAgICBteSAlU3lzdGVtVGltZTsgICAgIyB1c2VkIGZvciBjaGVja2luZyB0aGUgb3JkZXJpbmcgb2YgdGhlIHR3byB0aW1lcwoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBlYXJsaWVyIGxpbWl0CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNlbGVjdGlvblBhcmFte1N0YXJ0RGF5fQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGltZVNlbGVjdGlvblBhcmFte1N0YXJ0TW9udGh9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRUaW1lU2VsZWN0aW9uUGFyYW17U3RhcnRZZWFyfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3JtYXQgYXMgdGltZXN0YW1wCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVOZXdlckRhdGUnIH0gPSBzcHJpbnRmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2VsZWN0aW9uUGFyYW17U3RhcnREYXl9OwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgdmFsaWRpdHkKICAgICAgICAgICAgICAgICAgICAgICAgJFN5c3RlbVRpbWV7VGltZU5ld2VyRGF0ZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdUaW1lTmV3ZXJEYXRlJyB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3lzdGVtVGltZXtUaW1lTmV3ZXJEYXRlfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICRUaW1lVHlwZSAuICdJbnZhbGlkVGltZVNsb3QnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBsYXRlciBsaW1pdAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdG9wRGF5fQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGltZVNlbGVjdGlvblBhcmFte1N0b3BNb250aH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdG9wWWVhcn0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZm9ybWF0IGFzIHRpbWVzdGFtcAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdUaW1lT2xkZXJEYXRlJyB9ID0gc3ByaW50ZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyUwNGQtJTAyZC0lMDJkIDIzOjU5OjU5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2VsZWN0aW9uUGFyYW17U3RvcFllYXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdG9wTW9udGh9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25QYXJhbXtTdG9wRGF5fTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGhlIHZhbGlkaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICRTeXN0ZW1UaW1le1RpbWVPbGRlckRhdGV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFteyAkVGltZVR5cGUgLiAnVGltZU9sZGVyRGF0ZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN5c3RlbVRpbWV7VGltZU9sZGVyRGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAkVGltZVR5cGUgLiAnSW52YWxpZFRpbWVTbG90JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgb3JkZXJpbmcgb2YgdGhlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU3lzdGVtVGltZXtUaW1lTmV3ZXJEYXRlfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkU3lzdGVtVGltZXtUaW1lT2xkZXJEYXRlfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkU3lzdGVtVGltZXtUaW1lTmV3ZXJEYXRlfSA+PSAkU3lzdGVtVGltZXtUaW1lT2xkZXJEYXRlfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAkVGltZVR5cGUgLiAnSW52YWxpZFRpbWVTbG90JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkVGltZVNlbGVjdGlvblBhcmFte1NlYXJjaFR5cGV9IGVxICdUaW1lUG9pbnQnICkgewoKICAgICAgICAgICAgICAgICAgICAjIHF1ZXJpZXMgcmVsYXRpdmUgdG8gbm93CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50fQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50U3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRUaW1lU2VsZWN0aW9uUGFyYW17UG9pbnRGb3JtYXR9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaWZmU2Vjb25kcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFRpbWVTZWxlY3Rpb25QYXJhbXtQb2ludEZvcm1hdH0gZXEgJ21pbnV0ZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGlmZlNlY29uZHMgPSAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50fSAqIDYwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFRpbWVTZWxlY3Rpb25QYXJhbXtQb2ludEZvcm1hdH0gZXEgJ2hvdXInICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERpZmZTZWNvbmRzID0gJFRpbWVTZWxlY3Rpb25QYXJhbXtQb2ludH0gKiA2MCAqIDYwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFRpbWVTZWxlY3Rpb25QYXJhbXtQb2ludEZvcm1hdH0gZXEgJ2RheScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGlmZlNlY29uZHMgPSAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50fSAqIDYwICogNjAgKiAyNDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUaW1lU2VsZWN0aW9uUGFyYW17UG9pbnRGb3JtYXR9IGVxICd3ZWVrJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREaWZmU2Vjb25kcyA9ICRUaW1lU2VsZWN0aW9uUGFyYW17UG9pbnR9ICogNjAgKiA2MCAqIDI0ICogNzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRUaW1lU2VsZWN0aW9uUGFyYW17UG9pbnRGb3JtYXR9IGVxICdtb250aCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGlmZlNlY29uZHMgPSAkVGltZVNlbGVjdGlvblBhcmFte1BvaW50fSAqIDYwICogNjAgKiAyNCAqIDMwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFRpbWVTZWxlY3Rpb25QYXJhbXtQb2ludEZvcm1hdH0gZXEgJ3llYXInICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERpZmZTZWNvbmRzID0gJFRpbWVTZWxlY3Rpb25QYXJhbXtQb2ludH0gKiA2MCAqIDYwICogMjQgKiAzNjU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDdXJyZW50U3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRUaW1lU3RhbXAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDdXJyZW50U3lzdGVtVGltZQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRUaW1lU2VsZWN0aW9uUGFyYW17UG9pbnRTdGFydH0gZXEgJ0JlZm9yZScgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWFyY2ggaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFRpbWVTdGFtcCA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEN1cnJlbnRTeXN0ZW1UaW1lICsgJERpZmZTZWNvbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVOZXdlckRhdGUnIH0gPSAkQ3VycmVudFRpbWVTdGFtcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVPbGRlckRhdGUnIH0gPSAkU2VhcmNoVGltZVN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFRpbWVTdGFtcCA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEN1cnJlbnRTeXN0ZW1UaW1lIC0gJERpZmZTZWNvbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1RpbWVOZXdlckRhdGUnIH0gPSAkU2VhcmNoVGltZVN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnVGltZU9sZGVyRGF0ZScgfSA9ICRDdXJyZW50VGltZVN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgdW5rbm93biBzZWFyY2ggdHlwZXMgYXJlIHNpbXBseSBpZ25vcmVkCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2VhcmNoIGZvciBzdWJzdHJpbmdzIGJ5IGRlZmF1bHQKICAgICAgICAgICAgZm9yICgKICAgICAgICAgICAgICAgIHF3KENoYW5nZVRpdGxlIFdvcmtPcmRlclRpdGxlIERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24gV29ya09yZGVySW5zdHJ1Y3Rpb24gV29ya09yZGVyUmVwb3J0KQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXskX30gKSAmJiAkR2V0UGFyYW17JF99IG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAiKiRHZXRQYXJhbXskX30qIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkbyBub3Qgc2VhcmNoLCB3aGVuIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICBpZiAoICFAVmFsaWRhdGlvbkVycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHBlcmZvcm0gdGlja2V0IHNlYXJjaAogICAgICAgICAgICAgICAgbXkgJFZpZXdhYmxlQ2hhbmdlSURzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyAkU2VsZi0+e1NvcnRCeX0gXSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJFNlbGYtPntPcmRlckJ5fSBdLAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gJFNlbGYtPntTZWFyY2hMaW1pdH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHN0YXJ0IGh0bWwgcGFnZQogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0ICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJyc7CgogICAgICAgICAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICcnOwogICAgICAgICAgICAgICAgJFNlbGYtPntWaWV3fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSAgIHx8ICcnOwoKICAgICAgICAgICAgICAgICMgc2hvdyBjaGFuZ2VzCiAgICAgICAgICAgICAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgICAgICAgICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgICAgICAgICAgICAgLiAnJlNvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57U29ydEJ5fSApCiAgICAgICAgICAgICAgICAgICAgLiAnJk9yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e09yZGVyQnl9ICkKICAgICAgICAgICAgICAgICAgICAuICcmUHJvZmlsZT0nIC4gJFNlbGYtPntQcm9maWxlfSAuICcmVGFrZUxhc3RTZWFyY2g9MSZTdWJhY3Rpb249U2VhcmNoJwogICAgICAgICAgICAgICAgICAgIC4gJyYnOwogICAgICAgICAgICAgICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAgICAgICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgICAgICAgICAgICAgIC4gJyZQcm9maWxlPScgLiAkU2VsZi0+e1Byb2ZpbGV9IC4gJyZUYWtlTGFzdFNlYXJjaD0xJlN1YmFjdGlvbj1TZWFyY2gnCiAgICAgICAgICAgICAgICAgICAgLiAnJic7CiAgICAgICAgICAgICAgICBteSAkTGlua0ZpbHRlciA9ICdUYWtlTGFzdFNlYXJjaD0xJlN1YmFjdGlvbj1TZWFyY2gmUHJvZmlsZT0nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntQcm9maWxlfSApCiAgICAgICAgICAgICAgICAgICAgLiAnJic7CiAgICAgICAgICAgICAgICBteSAkTGlua0JhY2sgPSAnU3ViYWN0aW9uPUxvYWRQcm9maWxlJlByb2ZpbGU9JwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57UHJvZmlsZX0gKQogICAgICAgICAgICAgICAgICAgIC4gJyZUYWtlTGFzdFNlYXJjaD0xJic7CgogICAgICAgICAgICAgICAgIyBmaW5kIG91dCB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBzaG93bgogICAgICAgICAgICAgICAgbXkgQFNob3dDb2x1bW5zOwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnCiAgICAgICAgICAgICAgICAgICAgbXkgJVBvc3NpYmxlQ29sdW1uID0gJXsgJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9IH07CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkTmFtZSAoIGtleXMgJVBvc3NpYmxlQ29sdW1uICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgISRQb3NzaWJsZUNvbHVtbnskTmFtZX07CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAkTmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01DaGFuZ2VMaXN0U2hvdygKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRHMgICA9PiAkVmlld2FibGVDaGFuZ2VJRHMsCiAgICAgICAgICAgICAgICAgICAgVG90YWwgICAgICAgPT4gc2NhbGFyIEB7JFZpZXdhYmxlQ2hhbmdlSURzfSwKICAgICAgICAgICAgICAgICAgICBWaWV3ICAgICAgICA9PiAkU2VsZi0+e1ZpZXd9LAogICAgICAgICAgICAgICAgICAgIEVudiAgICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgICAgIExpbmtQYWdlICAgID0+ICRMaW5rUGFnZSwKICAgICAgICAgICAgICAgICAgICBMaW5rU29ydCAgICA9PiAkTGlua1NvcnQsCiAgICAgICAgICAgICAgICAgICAgTGlua0ZpbHRlciAgPT4gJExpbmtGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgTGlua0JhY2sgICAgPT4gJExpbmtCYWNrLAogICAgICAgICAgICAgICAgICAgIFRpdGxlTmFtZSAgID0+ICdDaGFuZ2UgU2VhcmNoIFJlc3VsdCcsCiAgICAgICAgICAgICAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBidWlsZCBmb290ZXIKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFRoZXJlIHdhcyBubyAnU3ViQWN0aW9uJywgb3IgdGhlcmUgd2VyZSB2YWxpZGF0aW9uIGVycm9ycywgb3IgYW4gdXNlciBvciBjdXN0b21lciB3YXMgc2VhcmNoZWQKICAgICMgZ2VuZXJhdGUgc2VhcmNoIG1hc2sKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRm9ybSgKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgJUV4cGFuZEluZm8sCiAgICAgICAgVmFsaWRhdGlvbkVycm9ycyAgICAgICAgICAgICAgICAgID0+IFxAVmFsaWRhdGlvbkVycm9ycywKICAgICAgICBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMgICAgPT4gXEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMsCiAgICAgICAgQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzID0+IFxAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9NYXNrRm9ybSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZ3VyZWQgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGQgbnVtYmVycwogICAgbXkgQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcyAgICA9IEB7ICRQYXJhbXtDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHN9IH07CiAgICBteSBAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzID0gQHsgJFBhcmFte0NvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkc30gfTsKCiAgICAjIEdldCBhIGNvbXBsZXRlIGxpc3Qgb2YgdXNlcnMKICAgICMgZm9yIHRoZSBzZWxlY3Rpb24gJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlTWFuYWdlcicgYW5kICdjcmVhdGVkIGJ5IHVzZXInLgogICAgIyBPdXQgb2Ygb2ZmaWNlIG5pY2UgbWlnaHQgYmUgYXBwZW5kZWQgdG8gdGhlIHZhbHVlcy4KICAgIG15ICVVc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGRyb3Bkb3duIG1lbnUgZm9yICdjcmVhdGVkIGJ5IHVzZXJzJwogICAgJFBhcmFteydDcmVhdGVCeVNlbGVjdGlvblN0cmluZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlcnMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ3JlYXRlQnknLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Q3JlYXRlQnl9LAogICAgKTsKCiAgICAjIGJ1aWxkIGNoYW5nZSBtYW5hZ2VyIGRyb3Bkb3duCiAgICAkUGFyYW17J0NoYW5nZU1hbmFnZXJTZWxlY3Rpb25TdHJpbmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0NoYW5nZU1hbmFnZXJJRHMnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Q2hhbmdlTWFuYWdlcklEc30sCiAgICApOwoKICAgICMgYnVpbGQgY2hhbmdlIGJ1aWxkZXIgZHJvcGRvd24KICAgICRQYXJhbXsnQ2hhbmdlQnVpbGRlclNlbGVjdGlvblN0cmluZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlcnMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ2hhbmdlQnVpbGRlcklEcycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtDaGFuZ2VCdWlsZGVySURzfSwKICAgICk7CgogICAgIyBnZXQgcG9zc2libGUgQ2hhbmdlIENhdGVnb3JpZXMKICAgIG15ICRDYXRlZ29yaWVzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICBUeXBlICAgPT4gJ0NhdGVnb3J5JywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRQYXJhbXsnQ2hhbmdlQ2F0ZWdvcnlTZWxlY3Rpb25TdHJpbmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkQ2F0ZWdvcmllcywKICAgICAgICBOYW1lICAgICAgID0+ICdDYXRlZ29yeUlEcycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtDYXRlZ29yeUlEc30sCiAgICApOwoKICAgICMgZ2V0IHBvc3NpYmxlIENoYW5nZSBJbXBhY3RzCiAgICBteSAkSW1wYWN0cyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdJbXBhY3QnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgJFBhcmFteydDaGFuZ2VJbXBhY3RTZWxlY3Rpb25TdHJpbmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkSW1wYWN0cywKICAgICAgICBOYW1lICAgICAgID0+ICdJbXBhY3RJRHMnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SURzfSwKICAgICk7CgogICAgIyBnZXQgcG9zc2libGUgQ2hhbmdlIFByaW9yaXRpZXMKICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICBUeXBlICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRQYXJhbXsnQ2hhbmdlUHJpb3JpdHlTZWxlY3Rpb25TdHJpbmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICBOYW1lICAgICAgID0+ICdQcmlvcml0eUlEcycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtQcmlvcml0eUlEc30sCiAgICApOwoKICAgICMgZ2V0IGNoYW5nZSBzdGF0ZXMKICAgIG15ICRDaGFuZ2VTdGF0ZXMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgJFBhcmFteydDaGFuZ2VTdGF0ZVNlbGVjdGlvblN0cmluZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRDaGFuZ2VTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnQ2hhbmdlU3RhdGVJRHMnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Q2hhbmdlU3RhdGVJRHN9LAogICAgKTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgYWdlbnRzCiAgICAkUGFyYW17J1dvcmtPcmRlckFnZW50SURTZWxlY3Rpb25TdHJpbmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1dvcmtPcmRlckFnZW50SURzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1dvcmtPcmRlckFnZW50SURzfSwKICAgICk7CgogICAgIyBnZXQgd29ya29yZGVyIHN0YXRlcwogICAgbXkgJFdvcmtPcmRlclN0YXRlcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgJFBhcmFteydXb3JrT3JkZXJTdGF0ZVNlbGVjdGlvblN0cmluZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRXb3JrT3JkZXJTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnV29ya09yZGVyU3RhdGVJRHMnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9LAogICAgKTsKCiAgICAjIG51bWJlciBvZiBtaW51dGVzLCBkYXlzLCB3ZWVrcywgbW9udGhzIGFuZCB5ZWFycwogICAgbXkgJU9uZVRvRmlmdHlOaW5lID0gbWFwIHsgJF8gPT4gc3ByaW50ZiAnJTJzJywgJF8gfSAoIDEgLi4gNTkgKTsKCiAgICAjIHRpbWUgcGVyaW9kIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhlIEdVSQogICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgIyBzZXR1cCBmb3IgdGhlIHRpbWUgc2VhcmNoIGZpZWxkcwogICAgbXkgQFRpbWVUeXBlcyA9ICgKICAgICAgICB7IFByZWZpeCA9PiAnUmVxdWVzdGVkJywgICAgVGl0bGUgPT4gJ1JlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIERhdGUnLCB9LAogICAgICAgIHsgUHJlZml4ID0+ICdQbGFubmVkU3RhcnQnLCBUaXRsZSA9PiAnUGxhbm5lZFN0YXJ0VGltZScsIH0sCiAgICAgICAgeyBQcmVmaXggPT4gJ1BsYW5uZWRFbmQnLCAgIFRpdGxlID0+ICdQbGFubmVkRW5kVGltZScsIH0sCiAgICAgICAgeyBQcmVmaXggPT4gJ0FjdHVhbFN0YXJ0JywgIFRpdGxlID0+ICdBY3R1YWxTdGFydFRpbWUnLCB9LAogICAgICAgIHsgUHJlZml4ID0+ICdBY3R1YWxFbmQnLCAgICBUaXRsZSA9PiAnQWN0dWFsRW5kVGltZScsIH0sCiAgICAgICAgeyBQcmVmaXggPT4gJ0NyZWF0ZScsICAgICAgIFRpdGxlID0+ICdDcmVhdGVUaW1lJywgfSwKICAgICAgICB7IFByZWZpeCA9PiAnQ2hhbmdlJywgICAgICAgVGl0bGUgPT4gJ0NoYW5nZVRpbWUnLCB9LAogICAgKTsKCiAgICBUSU1FVFlQRToKICAgIGZvciBteSAkVGltZVR5cGUgKEBUaW1lVHlwZXMpIHsKICAgICAgICBteSAkUHJlZml4ID0gJFRpbWVUeXBlLT57UHJlZml4fTsKCiAgICAgICAgIyBzaG93IFJlcXVlc3RlZFRpbWUgb25seSB3aGVuIGVuYWJsZWQgaW4gU3lzQ29uZmlnCiAgICAgICAgaWYgKCAkUHJlZml4IGVxICdSZXF1ZXN0ZWQnICYmICEkU2VsZi0+e0NvbmZpZ30tPntSZXF1ZXN0ZWRUaW1lfSApIHsKICAgICAgICAgICAgbmV4dCBUSU1FVFlQRTsKICAgICAgICB9CgogICAgICAgIG15ICRUaXRsZSAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGltZVR5cGUtPntUaXRsZX0gKTsKICAgICAgICBteSAlVGltZVNlbGVjdGlvbkRhdGEgPSAoCiAgICAgICAgICAgIFByZWZpeCA9PiAkUHJlZml4LAogICAgICAgICAgICBUaXRsZSAgPT4gJFRpdGxlLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHJhZGlvIGJ1dHRvbiBmb3IgdGltZSBzZWFyY2ggdHlwZXMKICAgICAgICBteSAkU2VhcmNoVHlwZSA9ICRQcmVmaXggLiAnVGltZVNlYXJjaFR5cGUnOwogICAgICAgIGlmICggISRQYXJhbXskU2VhcmNoVHlwZX0gKSB7CiAgICAgICAgICAgICRUaW1lU2VsZWN0aW9uRGF0YXsnVGltZVNlYXJjaFR5cGU6Ok5vbmUnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFteyRTZWFyY2hUeXBlfSBlcSAnVGltZVBvaW50JyApIHsKICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25EYXRheydUaW1lU2VhcmNoVHlwZTo6VGltZVBvaW50J30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXskU2VhcmNoVHlwZX0gZXEgJ1RpbWVTbG90JyApIHsKICAgICAgICAgICAgJFRpbWVTZWxlY3Rpb25EYXRheydUaW1lU2VhcmNoVHlwZTo6VGltZVNsb3QnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQoKICAgICAgICAkVGltZVNlbGVjdGlvbkRhdGF7VGltZVBvaW50fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVPbmVUb0ZpZnR5TmluZSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkUHJlZml4IC4gJ1RpbWVQb2ludCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFteyAkUHJlZml4IC4gJ1RpbWVQb2ludCcgfSwKICAgICAgICApOwoKICAgICAgICAkVGltZVNlbGVjdGlvbkRhdGF7VGltZVBvaW50U3RhcnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnTGFzdCcgICA9PiAnbGFzdCcsCiAgICAgICAgICAgICAgICAnQmVmb3JlJyA9PiAnYmVmb3JlJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSA9PiAkUHJlZml4IC4gJ1RpbWVQb2ludFN0YXJ0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17ICRQcmVmaXggLiAnVGltZVBvaW50U3RhcnQnIH0gfHwgJ0xhc3QnLAogICAgICAgICk7CgogICAgICAgICRUaW1lU2VsZWN0aW9uRGF0YXtUaW1lUG9pbnRGb3JtYXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBtaW51dGUgPT4gJ21pbnV0ZShzKScsCiAgICAgICAgICAgICAgICBob3VyICAgPT4gJ2hvdXIocyknLAogICAgICAgICAgICAgICAgZGF5ICAgID0+ICdkYXkocyknLAogICAgICAgICAgICAgICAgd2VlayAgID0+ICd3ZWVrKHMpJywKICAgICAgICAgICAgICAgIG1vbnRoICA9PiAnbW9udGgocyknLAogICAgICAgICAgICAgICAgeWVhciAgID0+ICd5ZWFyKHMpJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkUHJlZml4IC4gJ1RpbWVQb2ludEZvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFteyAkUHJlZml4IC4gJ1RpbWVQb2ludEZvcm1hdCcgfSwKICAgICAgICApOwoKICAgICAgICAkVGltZVNlbGVjdGlvbkRhdGF7VGltZVN0YXJ0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVUaW1lUGVyaW9kLAogICAgICAgICAgICBQcmVmaXggICA9PiAkUHJlZml4IC4gJ1RpbWVTdGFydCcsCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICAgICBEaWZmVGltZSA9PiAtKCAoIDYwICogNjAgKiAyNCApICogMzAgKSwKICAgICAgICApOwoKICAgICAgICAkVGltZVNlbGVjdGlvbkRhdGF7VGltZVN0b3B9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVRpbWVQZXJpb2QsCiAgICAgICAgICAgIFByZWZpeCA9PiAkUHJlZml4IC4gJ1RpbWVTdG9wJywKICAgICAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGZpZWxkCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVNlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVUaW1lU2VsZWN0aW9uRGF0YSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSB0eXBlIHNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJFByZWZpeCAuICdJbnZhbGlkVGltZVNsb3QnIH0gQHsgJFBhcmFte1ZhbGlkYXRpb25FcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkVGltZVNsb3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVRpbWVTZWxlY3Rpb25EYXRhLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBUSU1FVFlQRToKICAgIGZvciBteSAkVGltZVR5cGUgKEBUaW1lVHlwZXMpIHsKICAgICAgICBteSAkUHJlZml4ID0gJFRpbWVUeXBlLT57UHJlZml4fTsKCiAgICAgICAgIyBzaG93IFJlcXVlc3RlZFRpbWUgb25seSB3aGVuIGVuYWJsZWQgaW4gU3lzQ29uZmlnCiAgICAgICAgaWYgKCAkUHJlZml4IGVxICdSZXF1ZXN0ZWQnICYmICEkU2VsZi0+e0NvbmZpZ30tPntSZXF1ZXN0ZWRUaW1lfSApIHsKICAgICAgICAgICAgbmV4dCBUSU1FVFlQRTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBKUyBjb2RlIGZvciB0aW1lIGZpZWxkCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVNlbGVjdGlvbkpTJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBQcmVmaXggPT4gJFByZWZpeCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZCBmb3IgQ0FCQ3VzdG9tZXIKICAgIG15ICRDdXN0b21lckF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZScpOwogICAgaWYgKCAkQ3VzdG9tZXJBdXRvQ29tcGxldGVDb25maWctPntBY3RpdmV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBtaW5RdWVyeUxlbmd0aCA9PiAkQ3VzdG9tZXJBdXRvQ29tcGxldGVDb25maWctPntNaW5RdWVyeUxlbmd0aH0gfHwgMiwKICAgICAgICAgICAgICAgIHF1ZXJ5RGVsYXkgICAgID0+ICRDdXN0b21lckF1dG9Db21wbGV0ZUNvbmZpZy0+e1F1ZXJ5RGVsYXl9ICAgICB8fCAwLjEsCiAgICAgICAgICAgICAgICB0eXBlQWhlYWQgICAgICA9PiAkQ3VzdG9tZXJBdXRvQ29tcGxldGVDb25maWctPntUeXBlQWhlYWR9ICAgICAgfHwgJ2ZhbHNlJywKICAgICAgICAgICAgICAgIG1heFJlc3VsdHNEaXNwbGF5ZWQgPT4gJEN1c3RvbWVyQXV0b0NvbXBsZXRlQ29uZmlnLT57TWF4UmVzdWx0c0Rpc3BsYXllZH0gfHwgMjAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDQUJDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0JywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlRGl2RW5kJywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoQ3VzdG9tZXJCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCB1c2VyIHNlYXJjaCBhdXRvY29tcGxldGUgZmllbGQgZm9yIENBQkFnZW50CiAgICBteSAkVXNlckF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlJyk7CiAgICBpZiAoICRVc2VyQXV0b0NvbXBsZXRlQ29uZmlnLT57QWN0aXZlfSApIHsKCiAgICAgICAgIyBnZW5lcmFsIGJsb2NrcwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJTZWFyY2hBdXRvQ29tcGxldGUnLAogICAgICAgICk7CgogICAgICAgICMgQ0FCQWdlbnQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVc2VyU2VhcmNoQXV0b0NvbXBsZXRlQ29kZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgbWluUXVlcnlMZW5ndGggICAgICA9PiAkVXNlckF1dG9Db21wbGV0ZUNvbmZpZy0+e01pblF1ZXJ5TGVuZ3RofSAgICAgIHx8IDIsCiAgICAgICAgICAgICAgICBxdWVyeURlbGF5ICAgICAgICAgID0+ICRVc2VyQXV0b0NvbXBsZXRlQ29uZmlnLT57UXVlcnlEZWxheX0gICAgICAgICAgfHwgMC4xLAogICAgICAgICAgICAgICAgdHlwZUFoZWFkICAgICAgICAgICA9PiAkVXNlckF1dG9Db21wbGV0ZUNvbmZpZy0+e1R5cGVBaGVhZH0gICAgICAgICAgIHx8ICdmYWxzZScsCiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzRGlzcGxheWVkID0+ICRVc2VyQXV0b0NvbXBsZXRlQ29uZmlnLT57TWF4UmVzdWx0c0Rpc3BsYXllZH0gfHwgMjAsCiAgICAgICAgICAgICAgICBJbnB1dE5yICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gZm9yIENBQkFnZW50CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXNlclNlYXJjaEF1dG9Db21wbGV0ZVJldHVybkVsZW1lbnRzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBJbnB1dE5yID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDQUJBZ2VudAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQkFnZW50U2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQxJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQkFnZW50U2VhcmNoQXV0b0NvbXBsZXRlRGl2RW5kMScsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHNob3cgdXNlcnNlYXJjaCBidXR0b25zIGZvciBDQUJBZ2VudAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaFVzZXJCdXR0b24xJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBjaGFuZ2UgZnJlZXRleHQgY29uZmlnCiAgICBteSAlQ2hhbmdlRnJlZVRleHRDb25maWc7CiAgICBOVU1CRVI6CiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoQ2hhbmdlRnJlZUtleSBDaGFuZ2VGcmVlVGV4dCkpIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZwogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRUeXBlIC4gJE51bWJlciApOwoKICAgICAgICAgICAgbmV4dCBUWVBFIGlmICEkQ29uZmlnOwogICAgICAgICAgICBuZXh0IFRZUEUgaWYgcmVmICRDb25maWcgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgY2hhbmdlIGZyZWV0ZXh0IGNvbmZpZwogICAgICAgICAgICAkQ2hhbmdlRnJlZVRleHRDb25maWd7ICRUeXBlIC4gJE51bWJlciB9ID0gJENvbmZpZzsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0aGUgY2hhbmdlIGZyZWV0ZXh0IEhUTUwKICAgIG15ICVDaGFuZ2VGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRnJlZVRleHRIVE1MKAogICAgICAgIENvbmZpZyAgICAgICAgICAgICAgICAgICA9PiBcJUNoYW5nZUZyZWVUZXh0Q29uZmlnLAogICAgICAgIENoYW5nZURhdGEgICAgICAgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgIENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcyA9PiBcQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcywKICAgICAgICBOdWxsT3B0aW9uICAgICAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBzaG93IGNoYW5nZSBmcmVldGV4dCBhcmVhIGlmIGZyZWV0ZXh0IGZpZWxkcyBhcmUgY29uZmlndXJlZAogICAgaWYgKAogICAgICAgIEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMgJiYgZ3JlcCB7JF99CiAgICAgICAgdmFsdWVzICV7ICRTZWxmLT57Q29uZmlnfS0+e0NoYW5nZUZyZWVUZXh0fSB9CiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VGcmVlVGV4dEFyZWEnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGNoYW5nZSBmcmVldGV4dCBmaWVsZHMKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZENoYW5nZUZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhpcyBmcmVldGV4dCBmaWVsZCBzaG91bGQgYmUgc2hvd24gaW4gdGhpcyBmcm9udGVuZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Q2hhbmdlRnJlZVRleHR9LT57JE51bWJlcn0gKSB7CgogICAgICAgICAgICAjIHNob3cgYWxsIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXlGaWVsZCAgPT4gJENoYW5nZUZyZWVUZXh0SFRNTHsgJ0NoYW5nZUZyZWVLZXlGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHRGaWVsZCA9PiAkQ2hhbmdlRnJlZVRleHRIVE1MeyAnQ2hhbmdlRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgd29ya29yZGVyIGZyZWV0ZXh0IGNvbmZpZwogICAgbXkgJVdvcmtPcmRlckZyZWVUZXh0Q29uZmlnOwogICAgTlVNQkVSOgogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFdvcmtPcmRlckZyZWVLZXkgV29ya09yZGVyRnJlZVRleHQpKSB7CgogICAgICAgICAgICAjIGdldCBjb25maWcKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAkVHlwZSAuICROdW1iZXIgKTsKCiAgICAgICAgICAgIG5leHQgVFlQRSBpZiAhJENvbmZpZzsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIHJlZiAkQ29uZmlnIG5lICdIQVNIJzsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBjb25maWcKICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0Q29uZmlneyAkVHlwZSAuICROdW1iZXIgfSA9ICRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBIVE1MCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEZyZWVUZXh0SFRNTCgKICAgICAgICBDb25maWcgICAgICAgICAgICAgICAgICAgPT4gXCVXb3JrT3JkZXJGcmVlVGV4dENvbmZpZywKICAgICAgICBXb3JrT3JkZXJEYXRhICAgICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICBDb25maWd1cmVkRnJlZVRleHRGaWVsZHMgPT4gXEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMsCiAgICAgICAgTnVsbE9wdGlvbiAgICAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgc2hvdyB3b3Jrb3JkZXIgZnJlZXRleHQgYXJlYSBpZiBmcmVldGV4dCBmaWVsZHMgYXJlIGNvbmZpZ3VyZWQKICAgIGlmICgKICAgICAgICBAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzICYmIGdyZXAgeyRffQogICAgICAgIHZhbHVlcyAleyAkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0gfQogICAgICAgICkKICAgIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyRnJlZVRleHRBcmVhJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgZnJlZXRleHQgZmllbGQgc2hvdWxkIGJlIHNob3duIGluIHRoaXMgZnJvbnRlbmQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9ICkgewoKICAgICAgICAgICAgIyBzaG93IGFsbCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5RmllbGQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0SFRNTHsgJ1dvcmtPcmRlckZyZWVLZXlGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHRGaWVsZCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRIVE1MeyAnV29ya09yZGVyRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlU2VhcmNoJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfR2V0RXhwYW5kSW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVJbmZvOyAgICAjIHRoaXMgaGFzaCB3aWxsIGJlIHJldHVybmVkCgogICAgIyBnZXQgZ3JvdXAgaWQgZm9yIHRoZSBncm91cCAnaXRzbS1jaGFuZ2UnLgogICAgbXkgJElUU01DaGFuZ2VHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgIEdyb3VwID0+ICdpdHNtLWNoYW5nZScsCiAgICApOwoKICAgICMgZ2V0IG1lbWJlcnMgb2YgZ3JvdXAgJ2l0c20tY2hhbmdlJy4KICAgICMgT25seSBtZW1iZXJzIG9mIHRoaXMgZ3JvdXAgbWF5IGJlIENBQkFnZW50cy4KICAgICMgVE9ETzogd2hhdCBhYm91dCBhZ2VudHMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSAnaXRzbS1jaGFuZ2UnLCBidXQgYXJlIHN0aWxsIENBQiBtZW1iZXJzID8KICAgIG15ICVJVFNNQ2hhbmdlVXNlcnMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIEdyb3VwSUQgPT4gJElUU01DaGFuZ2VHcm91cElELAogICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgID0+IDEsCiAgICApOwoKICAgICMgY3VycmVudGx5IHRoZSBvbmx5IEFnZW50IHNlYXJjaCBpcyBmb3IgJ0NBQkFnZW50JywgYnV0IG1vcmUgbWlnaHQgYmUgYWRkZWQKICAgIGZvciBteSAkTmFtZSAocXcoQ0FCQWdlbnQpKSB7CgogICAgICAgICMgdGhlIGZpZWxkcyBpbiAuZHRsIGhhdmUgYSBudW1iZXIgYXQgdGhlIGVuZAogICAgICAgIG15ICRLZXkgPSAxOwoKICAgICAgICAjIGhhbmRsZSB0aGUgInNlYXJjaCB1c2VyIiBidXR0b24KICAgICAgICBpZiAoICRQYXJhbXsgJ0V4cGFuZCcgLiAkTmFtZSAuICcxJyB9ICkgewoKICAgICAgICAgICAgIyBzZWFyY2ggZm9yIGFnZW50cwogICAgICAgICAgICBteSAlVXNlckZvdW5kID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17JE5hbWV9IC4gJyonLAogICAgICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFVzZXJTZWFyY2goKSByZXR1cm5zIHZhbHVlcyB3aXRoIGEgdHJhaWxpbmcgc3BhY2UsIGdldCByaWQgb2YgaXQKICAgICAgICAgICAgZm9yIG15ICROYW1lICggdmFsdWVzICVVc2VyRm91bmQgKSB7CiAgICAgICAgICAgICAgICAkTmFtZSA9fiBzeyBccysgXHogfXt9eG1zOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZpbHRlciB0aGUgaXRzbS1jaGFuZ2UgdXNlcnMgaW4gZm91bmQgdXNlcnMKICAgICAgICAgICAgbXkgJVVzZXJMaXN0OwogICAgICAgICAgICBVU0VSSUQ6CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlSVRTTUNoYW5nZVVzZXJzICkgewogICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VyRm91bmR7JFVzZXJJRH07CgogICAgICAgICAgICAgICAgJFVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJGb3VuZHskVXNlcklEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBhIHNpbmdsZSB1c2VyIHdhcyBmb3VuZCwgZmlsbCB1cCBTZWxlY3RlZFVzZXIgYW5kIHRoZSBzZWFyY2ggZmllbGQKICAgICAgICAgICAgbXkgQEtleXNVc2VyTGlzdCA9IGtleXMgJVVzZXJMaXN0OwogICAgICAgICAgICBpZiAoIHNjYWxhciBAS2V5c1VzZXJMaXN0ID09IDEgKSB7CgogICAgICAgICAgICAgICAgIyBpZiB1c2VyIGlzIGZvdW5kLCBkaXNwbGF5IHRoZSBuYW1lCiAgICAgICAgICAgICAgICAkSW5mb3skTmFtZX0gPSAkVXNlckxpc3R7ICRLZXlzVXNlckxpc3RbMF0gfTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyCiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEtleXNVc2VyTGlzdFswXSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBpZiB1c2VyIGlzIGZvdW5kIHNldCBoaWRkZW4gZmllbGQsCiAgICAgICAgICAgICAgICAjIHRoaXMgaXMgdGhlIGlkIHRoYXQgd2lsbCBhY3R1YWxseSBiZSB1c2VkIGluIENoYW5nZVNlYXJjaAogICAgICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkSW5mb3sgJ1NlbGVjdGVkVXNlcicgLiAkS2V5IH0gPSAkVXNlckRhdGF7VXNlcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBubyBvciBtb3JlIHRoZSBvbmUgdXNlciB3YXMgZm91bmQsIHNob3cgbGlzdAogICAgICAgICAgICAjIGFuZCBjbGVhbiBVc2VySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyByZXNldCBpbnB1dCBmaWVsZAogICAgICAgICAgICAgICAgJEluZm97ICdTZWxlY3RlZFVzZXInIC4gJEtleSB9ID0gJyc7CgogICAgICAgICAgICAgICAgIyBidWlsZCBkcm9wIGRvd24gd2l0aCBmb3VuZCB1c2VycwogICAgICAgICAgICAgICAgJEluZm97ICROYW1lIC4gJ1NlbGVjdGlvblN0cmluZycgfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkTmFtZSAuICdJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNob3cgJ3Rha2UgdGhpcyB1c2VyJyBidXR0b24KICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGFrZScgLiAkTmFtZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjbGVhciB0aGUgc2VsZWN0ZWQgdXNlciBpZiBubyB1c2VyIHdhcyBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJVVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRJbmZveyROYW1lfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICRJbmZveyAnU2VsZWN0ZWRVc2VyJyAuICRLZXkgfSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGhhbmRsZSB0aGUgInRha2UgdGhpcyB1c2VyIiBidXR0b24KICAgICAgICBlbHNpZiAoICRQYXJhbXsgJ0V4cGFuZCcgLiAkTmFtZSAuICcyJyB9ICkgewoKICAgICAgICAgICAgIyBzaG93IHVzZXIgZGF0YQogICAgICAgICAgICBteSAkVXNlcklEICAgPSAkUGFyYW17ICROYW1lIC4gJ0lEJyB9OwogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiB1c2VyIGlzIGZvdW5kCiAgICAgICAgICAgIGlmICglVXNlckRhdGEpIHsKCiAgICAgICAgICAgICAgICAjIHNldCBoaWRkZW4gZmllbGQKICAgICAgICAgICAgICAgICRJbmZveyAnU2VsZWN0ZWRVc2VyJyAuICRLZXkgfSA9ICRVc2VySUQ7CiAgICAgICAgICAgICAgICAkSW5mb3skTmFtZX0gPSBzcHJpbnRmICciJXMgJXMiIDwlcz4nLAogICAgICAgICAgICAgICAgICAgICRVc2VyRGF0YXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckVtYWlsfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNlYXJjaCBmb3IgQ0FCQ3VzdG9tZXIKICAgIGlmICggJFBhcmFte0V4cGFuZENBQkN1c3RvbWVyMX0gKSB7CgogICAgICAgICMgc2VhcmNoIGN1c3RvbWVycwogICAgICAgIG15ICVDdXN0b21lclVzZXJGb3VuZCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17Q0FCQ3VzdG9tZXJ9IC4gJyonLAogICAgICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgZm91bmQgY3VzdG9tZXIgdXNlcnMgaW4gQEN1c3RvbWVyVXNlckxpc3QKICAgICAgICBteSBAQ3VzdG9tZXJVc2VyTGlzdDsKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICgga2V5cyAlQ3VzdG9tZXJVc2VyRm91bmQgKSB7CgogICAgICAgICAgICBwdXNoIEBDdXN0b21lclVzZXJMaXN0LCB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICRDdXN0b21lclVzZXJGb3VuZHskQ3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgSUQgICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGp1c3Qgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzCiAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgaWYgKCBzY2FsYXIgQEN1c3RvbWVyVXNlckxpc3QgPT0gMSApIHsKCiAgICAgICAgICAgICMgaWYgdXNlciBpcyBmb3VuZCwgZGlzcGxheSB0aGUgbmFtZQogICAgICAgICAgICAkSW5mb3tDQUJDdXN0b21lcn0gPSAkQ3VzdG9tZXJVc2VyTGlzdFswXS0+e05hbWV9OwoKICAgICAgICAgICAgIyBzZXQgaGlkZGVuIGZpZWxkIHdoZW4gYSBjdXN0b21lciB1c2VyIGlzIGZvdW5kCiAgICAgICAgICAgICMgdGhpcyBpcyB0aGUgaWQgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHVzZWQgaW4gQ2hhbmdlU2VhcmNoCiAgICAgICAgICAgICRJbmZveydTZWxlY3RlZEN1c3RvbWVyVXNlcid9ID0gJEN1c3RvbWVyVXNlckxpc3RbMF0tPntJRH07CiAgICAgICAgfQoKICAgICAgICAjIGlmIG1vcmUgdGhlIG9uZSB1c2VyIGV4aXN0cywgc2hvdyBsaXN0CiAgICAgICAgIyBhbmQgY2xlYW4gVXNlcklECiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGJ1aWxkIGxpc3QgZm9yIGRyb3AgZG93bgogICAgICAgICAgICBteSBAVXNlckxpc3RGb3JEcm9wRG93bjsKICAgICAgICAgICAgZm9yIG15ICRVc2VyIChAQ3VzdG9tZXJVc2VyTGlzdCkgewogICAgICAgICAgICAgICAgcHVzaCBAVXNlckxpc3RGb3JEcm9wRG93biwgewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRVc2VyLT57SUR9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRVc2VyLT57TmFtZX0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlc2V0IGlucHV0IGZpZWxkCiAgICAgICAgICAgICRJbmZve0NBQkN1c3RvbWVyfSA9ICcnOwoKICAgICAgICAgICAgIyBidWlsZCBkcm9wIGRvd24gd2l0aCBmb3VuZCBjdXN0b21lciB1c2VycwogICAgICAgICAgICAkSW5mb3tDQUJDdXN0b21lclNlbGVjdGlvblN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ0FCQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFxAVXNlckxpc3RGb3JEcm9wRG93biwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyAndGFrZSB0aGlzIHVzZXInIGJ1dHRvbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGFrZUNBQkN1c3RvbWVyJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2xlYXIgdG8gaWYgdGhlcmUgaXMgbm8gY3VzdG9tZXIgZm91bmQKICAgICAgICAgICAgaWYgKCAhQEN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkSW5mb3snQ0FCQ3VzdG9tZXInfSAgID0gJyc7CiAgICAgICAgICAgICAgICAkSW5mb3snQ0FCQ3VzdG9tZXJJRCd9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgdGhlICJ0YWtlIHRoaXMgdXNlciIgYnV0dG9uCiAgICBlbHNpZiAoICRQYXJhbXtFeHBhbmRDQUJDdXN0b21lcjJ9ICkgewoKICAgICAgICAjIHNob3cgdXNlciBkYXRhCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFBhcmFteydDQUJDdXN0b21lcklEJ307CiAgICAgICAgbXkgJVVzZXJEYXRhOwoKICAgICAgICAjIGdldCBjdXN0b21lciB1c2VyIGRhdGEKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgaWYgdXNlciBpcyBmb3VuZAogICAgICAgIGlmICglQ3VzdG9tZXJVc2VyRGF0YSkgewoKICAgICAgICAgICAgIyBzZXQgaGlkZGVuIGZpZWxkCiAgICAgICAgICAgICRJbmZve1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJJRDsKICAgICAgICAgICAgJEluZm97Q0FCQ3VzdG9tZXJ9ICAgICAgICAgID0gc3ByaW50ZiAnIiVzICVzIiA8JXM+JywKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlckRhdGF7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAlSW5mbzsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVRlbXBsYXRlLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgYWRkIHRlbXBsYXRlIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUucG0sdiAxLjExIDIwMTAvMDYvMjkgMTM6NDU6MTcgc2IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2VUZW1wbGF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgQ2hhbmdlSUQKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYW5nZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIENoYW5nZUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UKICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gY2hhbmdlIGZvdW5kIGZvciBjaGFuZ2UgSUQgJENoYW5nZUlELiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBuZWVkZWQgcGFyYW1ldGVycyBpbiAlR2V0UGFyYW0gdG8gbWFrZSBpdCByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoVGVtcGxhdGVOYW1lIENvbW1lbnQgVmFsaWRJRCBTdGF0ZVJlc2V0KSkgewogICAgICAgICRHZXRQYXJhbXskUGFyYW1OYW1lfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtTmFtZSApOwogICAgfQoKICAgICMgUmVtZW1iZXIgdGhlIHJlYXNvbiB3aHkgc2F2aW5nIHdhcyBub3QgYXR0ZW1wdGVkLgogICAgIyBUaGUgaXRlbXMgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHRsIHZhbGlkYXRpb24gZXJyb3IgYmxvY2tzLgogICAgbXkgQFZhbGlkYXRpb25FcnJvcnM7CgogICAgIyBhZGQgYSB0ZW1wbGF0ZQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZFRlbXBsYXRlJyApIHsKCiAgICAgICAgIyBjaGVjayB2YWxpZGl0eSBvZiB0aGUgdGVtcGxhdGUgbmFtZQogICAgICAgIGlmICggISRHZXRQYXJhbXtUZW1wbGF0ZU5hbWV9ICkgewogICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFRlbXBsYXRlTmFtZSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICFAVmFsaWRhdGlvbkVycm9ycyApIHsKCiAgICAgICAgICAgICMgc2VyaWFsaXplIHRoZSBjaGFuZ2UKICAgICAgICAgICAgbXkgJFRlbXBsYXRlQ29udGVudCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZVNlcmlhbGl6ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICBTdGF0ZVJlc2V0ICAgPT4gJEdldFBhcmFte1N0YXRlUmVzZXR9IHx8IDAsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUNvbnRlbnQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJUaGUgY2hhbmdlICckQ2hhbmdlSUQnIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0b3JlIHRoZSBzZXJpYWxpemVkIGNoYW5nZQogICAgICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17VGVtcGxhdGVOYW1lfSwKICAgICAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gJEdldFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICA9PiAkVGVtcGxhdGVDb250ZW50LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ291bGQgbm90IGFkZCB0aGUgdGVtcGxhdGUuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXZlcnl0aGluZyB3ZW50IHdlbGwsIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICRTZWxmLT57TGFzdENoYW5nZVZpZXd9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIG5vIHN1YmFjdGlvbiwKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAnVGVtcGxhdGUnLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgbXkgJFZhbGlkU2VsZWN0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17VmFsaWRJRH0gfHwgKCAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKSApWzBdLAogICAgICAgIFNvcnQgICAgICAgPT4gJ051bWVyaWNLZXknLAogICAgKTsKCiAgICAjIGFkZCB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcwogICAgZm9yIG15ICRCbG9ja05hbWUgKEBWYWxpZGF0aW9uRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAkQmxvY2tOYW1lICk7CiAgICB9CgogICAgIyBzZXQgY2hlY2tib3ggZm9yIHN0YXRlIHJlc2V0CiAgICBpZiAoICRHZXRQYXJhbXtTdGF0ZVJlc2V0fSApIHsKICAgICAgICAkR2V0UGFyYW17U3RhdGVSZXNldH0gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBWYWxpZFNlbGVjdGlvblN0cmluZyA9PiAkVmFsaWRTZWxlY3Rpb25TdHJpbmcsCiAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICA9PiAkQ2hhbmdlLT57Q2hhbmdlVGl0bGV9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVRpbWVTbG90LnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgbW92ZSB0aW1lIHNsb3QgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VUaW1lU2xvdC5wbSx2IDEuMzEgMjAxMC8wNC8yNyAyMDozNjo1NyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUNoYW5nZVRpbWVTbG90OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMxICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBDaGFuZ2VJRAogICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbmdlSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDaGFuZ2VJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgaXMgZm91bmQKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNoYW5nZSAnJENoYW5nZUlEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIE1vdmluZyBpcyBwb3NzaWJsZSBvbmx5IHdoZW4gdGhlcmUgYXJlIHdvcmtvcmRlcnMuCiAgICBpZiAoICEkQ2hhbmdlLT57V29ya09yZGVyQ291bnR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJUaGUgY2hhbmdlIGNhbid0IGJlIG1vdmVkLCBhcyBpdCBoYXMgbm8gd29ya29yZGVycy4iLAogICAgICAgICAgICBDb21tZW50ID0+ICdBZGQgYSB3b3Jrb3JkZXIgZmlyc3QuJywKICAgICAgICApOwogICAgfQoKICAgICMgTW92aW5nIGlzIGFsbG93ZWQgb25seSB3aGVuIHRoZXJlIHRoZSBjaGFuZ2UgaGFzIG5vdCBzdGFydGVkIHlldC4KICAgIGlmICggJENoYW5nZS0+e0FjdHVhbFN0YXJ0VGltZX0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IG1vdmUgYSBjaGFuZ2Ugd2hpY2ggYWxyZWFkeSBoYXMgc3RhcnRlZCEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgbW92ZSB0aGUgaW5kaXZpZHVhbCB3b3Jrb3JkZXJzIGluc3RlYWQuJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgJEdldFBhcmFte01vdmVUaW1lVHlwZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgUGFyYW0gPT4gJ01vdmVUaW1lVHlwZScsCiAgICApIHx8ICdQbGFubmVkU3RhcnRUaW1lJzsKCiAgICAjIHN0b3JlIHRpbWUgcmVsYXRlZCBmaWVsZHMgaW4gJUdldFBhcmFtCiAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICBteSAkUGFyYW1OYW1lID0gJ01vdmVUaW1lJyAuICRUaW1lUGFydDsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICRQYXJhbU5hbWUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFJlbWVtYmVyIHRoZSByZWFzb24gd2h5IHNhdmluZyB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGl0ZW1zIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgbW92ZSB0aW1lIHNsb3Qgb2YgY2hhbmdlCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTW92ZVRpbWVTbG90JyApIHsKCiAgICAgICAgIyBjaGVjayB2YWxpZGl0eSBvZiB0aGUgdGltZSB0eXBlCiAgICAgICAgbXkgJE1vdmVUaW1lVHlwZSA9ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9OwogICAgICAgIGlmICgKICAgICAgICAgICAgIWRlZmluZWQgJE1vdmVUaW1lVHlwZQogICAgICAgICAgICB8fCAoICRNb3ZlVGltZVR5cGUgbmUgJ1BsYW5uZWRTdGFydFRpbWUnICYmICRNb3ZlVGltZVR5cGUgbmUgJ1BsYW5uZWRFbmRUaW1lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkVGltZVR5cGUnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgY29tcGxldGVuZXNzIG9mIHRoZSB0aW1lIHBhcmFtZXRlciBsaXN0LAogICAgICAgICMgb25seSBob3VyIGFuZCBtaW51dGUgYXJlIGFsbG93ZWQgdG8gYmUgJzAnCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJEdldFBhcmFte01vdmVUaW1lWWVhcn0KICAgICAgICAgICAgfHwgISRHZXRQYXJhbXtNb3ZlVGltZU1vbnRofQogICAgICAgICAgICB8fCAhJEdldFBhcmFte01vdmVUaW1lRGF5fQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkR2V0UGFyYW17TW92ZVRpbWVIb3VyfQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkR2V0UGFyYW17TW92ZVRpbWVNaW51dGV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkTW92ZVRpbWUnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN5c3RlbSB0aW1lIGZyb20gdGhlIGlucHV0LCBpZiBpdCBjYW4ndCBiZSBkZXRlcm1pbmVkIHdlIGhhdmUgYSB2YWxpZGF0aW9uIGVycm9yCiAgICAgICAgbXkgJFBsYW5uZWRTeXN0ZW1UaW1lOwogICAgICAgIGlmICggIUBWYWxpZGF0aW9uRXJyb3JzICkgewoKICAgICAgICAgICAgIyBmb3JtYXQgYXMgdGltZXN0YW1wCiAgICAgICAgICAgIG15ICRQbGFubmVkVGltZSA9IHNwcmludGYgJyUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCcsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVZZWFyfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZU1vbnRofSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZURheX0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVIb3VyfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZU1pbnV0ZX07CgogICAgICAgICAgICAjIHNhbml0eSBjaGVjayBvZiB0aGUgYXNzZW1ibGVkIHRpbWVzdGFtcAogICAgICAgICAgICAkUGxhbm5lZFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGxhbm5lZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUGxhbm5lZFN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZE1vdmVUaW1lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBtb3ZlIHRpbWUgc2xvdCBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgaWYgKCAhQFZhbGlkYXRpb25FcnJvcnMgKSB7CgogICAgICAgICAgICAjIERldGVybWluZSB0aGUgZGlmZmVyZW5jZSBpbiBzZWNvbmRzCiAgICAgICAgICAgIG15ICRDdXJyZW50UGxhbm5lZFRpbWUgPSAkQ2hhbmdlLT57JE1vdmVUaW1lVHlwZX07CgogICAgICAgICAgICAjIEV2ZW4gd2hlbiB0aGVyZSBhcmUgd29ya29yZGVycywgYSBjaGFuZ2UgbWlnaHQgc3RpbGwgbWlzcyBhIHBsYW5uZWQgdGltZS4KICAgICAgICAgICAgIyBJbiB0aGF0IGNhc2UgbW92aW5nIHRoZSB0aW1lIHNsb3QgaXMgbm90IHBvc3NpYmxlLgogICAgICAgICAgICBpZiAoICEkQ3VycmVudFBsYW5uZWRUaW1lICkgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJUaGUgY3VycmVudCAkTW92ZVRpbWVUeXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiVGhlICRNb3ZlVGltZVR5cGUgb2YgYWxsIHdvcmtvcmRlcnMgaGFzIHRvIGJlIGRlZmluZWQuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXJyZW50UGxhbm5lZFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ3VycmVudFBsYW5uZWRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRGlmZlNlY29uZHMgPSAkUGxhbm5lZFN5c3RlbVRpbWUgLSAkQ3VycmVudFBsYW5uZWRTeXN0ZW1UaW1lOwoKICAgICAgICAgICAgbXkgJE1vdmVFcnJvciA9ICRTZWxmLT5fTW92ZVdvcmtPcmRlcnMoCiAgICAgICAgICAgICAgICBEaWZmU2Vjb25kcyAgPT4gJERpZmZTZWNvbmRzLAogICAgICAgICAgICAgICAgV29ya09yZGVySURzID0+ICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9LAogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRNb3ZlRXJyb3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTW92ZUVycm9yOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsLCByZWRpcmVjdCB0byB6b29tIG1hc2sKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAkU2VsZi0+e0xhc3RDaGFuZ2VWaWV3fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHBsYW5uZWQgc3RhcnQgdGltZSBvciBwbGFubmVkIGVuZCB0aW1lIGZyb20gdGhlIGNoYW5nZQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQ2hhbmdlLT57ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGhlIHBhcmFtZXRlciBoYXNoIGZvciB0aGUgYW5zd2VycwogICAgICAgICMgdGhlIHNlY29uZHMgYXJlIGlnbm9yZWQKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY29uZmlnIGZvciB0aGUgbnVtYmVyIG9mIHllYXJzIHdoaWNoIHNob3VsZCBiZSBzZWxlY3RhYmxlCiAgICAgICAgbXkgJFRpbWVQZXJpb2QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpOwogICAgICAgIG15ICRTdGFydFllYXIgID0gJFllYXIgLSAkVGltZVBlcmlvZC0+e1llYXJQZXJpb2RQYXN0fTsKICAgICAgICBteSAkRW5kWWVhciAgICA9ICRZZWFyICsgJFRpbWVQZXJpb2QtPntZZWFyUGVyaW9kRnV0dXJlfTsKCiAgICAgICAgIyBhc3NlbWJsZSB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTW92ZVRpbWVNaW51dGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gWyBtYXAgeyBzcHJpbnRmICclMDJkJywgJF8gfSAoIDAgLi4gNTkgKSBdLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE1pbnV0ZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTW92ZVRpbWVIb3VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFsgbWFwIHsgc3ByaW50ZiAnJTAyZCcsICRfIH0gKCAwIC4uIDIzICkgXSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRIb3VyLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNb3ZlVGltZURheScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBbIG1hcCB7IHNwcmludGYgJyUwMmQnLCAkXyB9ICggMSAuLiAzMSApIF0sCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkRGF5LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdNb3ZlVGltZU1vbnRoJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFsgbWFwIHsgc3ByaW50ZiAnJTAyZCcsICRfIH0gKCAxIC4uIDEyICkgXSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRNb250aCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTW92ZVRpbWVZZWFyJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFsgJFN0YXJ0WWVhciAuLiAkRW5kWWVhciBdLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte01vdmVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBubyBzdWJhY3Rpb24sCiAgICAgICAgIyBnZXQgcGxhbm5lZCBzdGFydCB0aW1lIG9yIHBsYW5uZWQgZW5kIHRpbWUgZnJvbSB0aGUgY2hhbmdlCiAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRDaGFuZ2UtPnsgJEdldFBhcmFte01vdmVUaW1lVHlwZX0gfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aGUgcGFyYW1ldGVyIGhhc2ggZm9yIEJ1aWxkRGF0ZVNlbGVjdGlvbigpCiAgICAgICAgIyB0aGUgc2Vjb25kcyBhcmUgaWdub3JlZAogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICApOwogICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZU1pbnV0ZX0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZUhvdXJ9ICAgPSAkSG91cjsKICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVEYXl9ICAgID0gJERheTsKICAgICAgICAkR2V0UGFyYW17TW92ZVRpbWVNb250aH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZVllYXJ9ICAgPSAkWWVhcjsKICAgIH0KCiAgICAjIGJ1aWxkIGRyb3AtZG93biB3aXRoIHRpbWUgdHlwZXMKICAgIG15ICRNb3ZlVGltZVR5cGVTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gWwogICAgICAgICAgICB7IEtleSA9PiAnUGxhbm5lZFN0YXJ0VGltZScsIFZhbHVlID0+ICdQbGFubmVkU3RhcnRUaW1lJyB9LAogICAgICAgICAgICB7IEtleSA9PiAnUGxhbm5lZEVuZFRpbWUnLCAgIFZhbHVlID0+ICdQbGFubmVkRW5kVGltZScgfSwKICAgICAgICBdLAogICAgICAgIE5hbWUgICAgICAgPT4gJ01vdmVUaW1lVHlwZScsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17TW92ZVRpbWVUeXBlfSwKICAgICAgICBBamF4ICAgICAgID0+IHsKICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICdNb3ZlVGltZU1pbnV0ZScsCiAgICAgICAgICAgICAgICAnTW92ZVRpbWVIb3VyJywKICAgICAgICAgICAgICAgICdNb3ZlVGltZURheScsCiAgICAgICAgICAgICAgICAnTW92ZVRpbWVNb250aCcsCiAgICAgICAgICAgICAgICAnTW92ZVRpbWVZZWFyJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VJRCcsCiAgICAgICAgICAgICAgICAnTW92ZVRpbWVUeXBlJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICB9LAogICAgKTsKCiAgICAjIHRpbWUgcGVyaW9kIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhlIEdVSQogICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgIyBhZGQgc2VsZWN0aW9uIGZvciB0aGUgdGltZQogICAgbXkgJE1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgUHJlZml4ID0+ICdNb3ZlVGltZScsCiAgICAgICAgJVRpbWVQZXJpb2QsCiAgICApOwoKICAgICMgcmVtb3ZlIEFKQVgtTG9hZGluZyBpbWFnZXMgaW4gZGF0ZSBzZWxlY3Rpb24gZmllbGRzIHRvIGF2b2lkIGppdHRlciBlZmZlY3QKICAgICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVtb3ZlQUpBWExvYWRpbmdJbWFnZSgKICAgICAgICBIVE1MU3RyaW5nID0+ICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZywKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gJ01vdmUgVGltZSBTbG90JywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgU2hvdyB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcy4KICAgIGZvciBteSAkQmxvY2tOYW1lIChAVmFsaWRhdGlvbkVycm9ycykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJEJsb2NrTmFtZSApOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlVGltZVNsb3QnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgIE1vdmVUaW1lVHlwZVNlbGVjdGlvblN0cmluZyA9PiAkTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBNb3ZlVGltZVNlbGVjdGlvblN0cmluZyAgICAgPT4gJE1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojIHRoZSBhY3R1YWwgbW92aW5nIGlzIGRvbmUgaGVyZQpzdWIgX01vdmVXb3JrT3JkZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQENvbGxlY3RlZFVwZGF0ZVBhcmFtczsgICAgIyBhbiBhcnJheSBvZiBwYXJhbXMgZm9yIFdvcmtPcmRlclVwZGF0ZSgpCiAgICBteSAlV29ya09yZGVySUQyTnVtYmVyOyAgICAgICAjIHVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZXMKCiAgICAjIGRldGVybWluZSB0aGUgbmV3IHRpbWVzCiAgICBXT1JLT1JERVJJRDoKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkUGFyYW17V29ya09yZGVySURzfSB9ICkgewogICAgICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAhJFdvcmtPcmRlcjsKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmIHJlZiAkV29ya09yZGVyIG5lICdIQVNIJzsKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICEleyRXb3JrT3JkZXJ9OwoKICAgICAgICAkV29ya09yZGVySUQyTnVtYmVyeyRXb3JrT3JkZXJJRH0gPSAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfTsKICAgICAgICBteSAlVXBkYXRlUGFyYW1zOwogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKSkgewoKICAgICAgICAgICAgbmV4dCBUWVBFIGlmICEkV29ya09yZGVyLT57JFR5cGV9OwoKICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkV29ya09yZGVyLT57JFR5cGV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IFRZUEUgaWYgISRTeXN0ZW1UaW1lOwoKICAgICAgICAgICAgIyBhZGQgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgdGhlIHRpbWUgc2xvdCBzaG91bGQgYmUgbW92ZWQKICAgICAgICAgICAgJFN5c3RlbVRpbWUgKz0gJFBhcmFte0RpZmZTZWNvbmRzfTsKICAgICAgICAgICAgJFVwZGF0ZVBhcmFtc3skVHlwZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICElVXBkYXRlUGFyYW1zOwoKICAgICAgICAjIHJlbWVtYmVyIHRoZSB3b3Jrb3JkZXIgdGhhdCBzaG91bGQgYmUgbW92ZWQKICAgICAgICAkVXBkYXRlUGFyYW1ze1dvcmtPcmRlcklEfSA9ICRXb3JrT3JkZXJJRDsKCiAgICAgICAgcHVzaCBAQ29sbGVjdGVkVXBkYXRlUGFyYW1zLCBcJVVwZGF0ZVBhcmFtczsKICAgIH0KCiAgICAjIGRvIHRoZSB1cGRhdGluZwogICAgVVBEQVRFUEFSQU1TOgogICAgZm9yIG15ICRVcGRhdGVQYXJhbXMgKEBDb2xsZWN0ZWRVcGRhdGVQYXJhbXMpIHsKICAgICAgICBteSAkVXBkYXRlT2sgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclVwZGF0ZSgKICAgICAgICAgICAgJXskVXBkYXRlUGFyYW1zfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVXBkYXRlT2sgKSB7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBteSAkTnVtYmVyID0gam9pbiAnLScsCiAgICAgICAgICAgICAgICAkUGFyYW17Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJJRDJOdW1iZXJ7ICRVcGRhdGVQYXJhbXMtPntXb3JrT3JkZXJJRH0gfTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiV2FzIG5vdCBhYmxlIHRvIG1vdmUgdGltZSBzbG90IGZvciB3b3Jrb3JkZXIgIyROdW1iZXIhIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG1vdmluZyB3YXMgc3VjY2Vzc2Z1bAogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUNoYW5nZVpvb20ucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCBjaGFuZ2Ugem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVpvb20ucG0sdiAxLjUxIDIwMTAvMDcvMDQgMDk6NDQ6NTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01DaGFuZ2Vab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUxICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNoYW5nZUlEIiApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ2hhbmdlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIENoYW5nZUlEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyBjaGFuZ2Ugem9vbQogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBDaGFuZ2UKICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDaGFuZ2UgJyRDaGFuZ2VJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgRG93bmxvYWRBdHRhY2htZW50CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRG93bmxvYWRBdHRhY2htZW50JyApIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmb3IgYXR0YWNobWVudAogICAgICAgIG15ICRGaWxlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGaWxlSUQnICk7CiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBdHRhY2htZW50R2V0KAogICAgICAgICAgICBGaWxlSUQgPT4gJEZpbGVJRCwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgKCRGaWxlSUQpISBNYXkgYmUgYW4gYXR0YWNrISEhIiwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICAleyRBdHRhY2htZW50RGF0YX0sCiAgICAgICAgICAgIFR5cGUgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTdG9yZSBMYXN0Q2hhbmdlVmlldywgZm9yIGJhY2tsaW5rcyBmcm9tIGNoYW5nZSBzcGVjaWZpYyBwYWdlcwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0Q2hhbmdlVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBTdG9yZSBMYXN0U2NyZWVuT3ZlcnZpZXcsIGZvciBiYWNrbGlua3MgZnJvbSBBZ2VudExpbmtPYmplY3QKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIFN0b3JlIExhc3RTY3JlZW5PdmVydmlldywgZm9yIGJhY2tsaW5rcyBmcm9tIEFnZW50TGlua09iamVjdAogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBTdG9yZSBMYXN0U2NyZWVuV29ya09yZGVycywgZm9yIGJhY2tsaW5rcyBmcm9tIElUU01Xb3JrT3JkZXJab29tCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5Xb3JrT3JkZXJzJywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIHJ1biBjaGFuZ2UgbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGl0ZW1zIGZvciBtZW51CiAgICAgICAgbXkgJU1lbnVzICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFNlbGYtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgJENvdW50ZXIgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENoYW5nZSAgPT4gJENoYW5nZSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBicmVhayBEZXNjcmlwdGlvbiBhZnRlciA4MCBjaGFycwogICAgaWYgKCAkQ2hhbmdlLT57RGVzY3JpcHRpb259ICkgewogICAgICAgICRDaGFuZ2UtPntEZXNjcmlwdGlvbn0gPX4gc3sgKCBcU3s4MH0gKSB9eyQxXG59eG1zZzsKICAgIH0KCiAgICAjIGJyZWFrIEp1c3RpZmljYXRpb24gYWZ0ZXIgODAgY2hhcnMKICAgIGlmICggJENoYW5nZS0+e0p1c3RpZmljYXRpb259ICkgewogICAgICAgICRDaGFuZ2UtPntKdXN0aWZpY2F0aW9ufSA9fiBzeyAoIFxTezgwfSApIH17JDFcbn14bXNnOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFZhbHVlID0+ICRDaGFuZ2UtPntDaGFuZ2VUaXRsZX0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGJ1aWxkIHdvcmtvcmRlciBncmFwaCBpbiBsYXlvdXQgb2JqZWN0CiAgICBteSAkV29ya09yZGVyR3JhcGggPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPklUU01DaGFuZ2VCdWlsZFdvcmtPcmRlckdyYXBoKAogICAgICAgIENoYW5nZSAgICAgICAgICA9PiAkQ2hhbmdlLAogICAgICAgIFdvcmtPcmRlck9iamVjdCA9PiAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0sCiAgICApOwoKICAgICMgZGlzcGxheSBncmFwaCB3aXRoaW4gYW4gb3duIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckdyYXBoJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR3JhcGggPT4gJFdvcmtPcmRlckdyYXBoLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGNoYW5nZSBidWlsZGVyIGRhdGEKICAgIG15ICVDaGFuZ2VCdWlsZGVyVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJENoYW5nZS0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY2hhbmdlIHVzZXIgZGF0YQogICAgbXkgJUNoYW5nZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJENoYW5nZS0+e0NoYW5nZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBhbGwgcG9zdGZpeGVzIG5lZWRlZCBmb3IgdXNlciBpbmZvcm1hdGlvbgogICAgbXkgQFBvc3RmaXhlcyA9IHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSk7CgogICAgIyBnZXQgdXNlciBpbmZvcm1hdGlvbiBmb3IgQ2hhbmdlQnVpbGRlciwgQ3JlYXRlQnksIENoYW5nZUJ5CiAgICBmb3IgbXkgJFBvc3RmaXggKEBQb3N0Zml4ZXMpIHsKICAgICAgICAkQ2hhbmdlLT57ICdDaGFuZ2VCdWlsZGVyJyAuICRQb3N0Zml4IH0gPSAkQ2hhbmdlQnVpbGRlclVzZXJ7JFBvc3RmaXh9OwogICAgICAgICRDaGFuZ2UtPnsgJ0NyZWF0ZScgLiAkUG9zdGZpeCB9ICAgICAgICA9ICRDcmVhdGVVc2VyeyRQb3N0Zml4fTsKICAgICAgICAkQ2hhbmdlLT57ICdDaGFuZ2UnIC4gJFBvc3RmaXggfSAgICAgICAgPSAkQ2hhbmdlVXNlcnskUG9zdGZpeH07CiAgICB9CgogICAgIyBvdXRwdXQgbWV0YSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgdmFsdWVzIG9yIGRhc2ggKCctJykKICAgIG15IEBBZGRpdGlvbmFsQmxvY2tOYW1lczsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWVzdGVkVGltZX0gKSB7CiAgICAgICAgcHVzaCBAQWRkaXRpb25hbEJsb2NrTmFtZXMsICdSZXF1ZXN0ZWRUaW1lJzsKICAgIH0KICAgIGZvciBteSAkQmxvY2tOYW1lICgKICAgICAgICBAQWRkaXRpb25hbEJsb2NrTmFtZXMsIHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJENoYW5nZS0+eyRCbG9ja05hbWV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJEJsb2NrTmFtZSA9PiAkQ2hhbmdlLT57JEJsb2NrTmFtZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VtcHR5JyAuICRCbG9ja05hbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBjb25maWd1cmFibGUgYmxvY2tzCiAgICBCTE9DS05BTUU6CiAgICBmb3IgbXkgJEJsb2NrTmFtZSAocXcoUGxhbm5lZEVmZm9ydCBBY2NvdW50ZWRUaW1lKSkgewoKICAgICAgICAjIHNraXAgaWYgYmxvY2sgaXMgc3dpdGNoZWQgb2ZmIGluIFN5c0NvbmZpZwogICAgICAgIG5leHQgQkxPQ0tOQU1FIGlmICEkU2VsZi0+e0NvbmZpZ30tPnskQmxvY2tOYW1lfTsKCiAgICAgICAgIyBzaG93IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2hvdycgLiAkQmxvY2tOYW1lLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB2YWx1ZSBvciBkYXNoCiAgICAgICAgaWYgKCAkQ2hhbmdlLT57JEJsb2NrTmFtZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRCbG9ja05hbWUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAkQmxvY2tOYW1lID0+ICRDaGFuZ2UtPnskQmxvY2tOYW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHknIC4gJEJsb2NrTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IENJUAogICAgZm9yIG15ICRUeXBlIChxdyhDYXRlZ29yeSBJbXBhY3QgUHJpb3JpdHkpKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkVHlwZSwKICAgICAgICAgICAgRGF0YSA9PiB7ICV7JENoYW5nZX0gfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGFsbCBjaGFuZ2UgZnJlZWtleSBhbmQgZnJlZXRleHQgbnVtYmVycyBmcm9tIGNoYW5nZQogICAgbXkgJUNoYW5nZUZyZWVUZXh0RmllbGRzOwogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICV7JENoYW5nZX0gKSB7CgogICAgICAgICMgZ2V0IHRoZSBmcmVldGV4dCBudW1iZXIsIG9ubHkgbG9vayBhdCB0aGUgZnJlZXRleHQgZmllbGQsCiAgICAgICAgIyBhcyB3ZSBkbyBub3Qgd2FudCB0byBzaG93IGVtcHR5IGZpZWxkcyBpbiB0aGUgem9vbSB2aWV3CiAgICAgICAgaWYgKCAkQXR0cmlidXRlID1+IG17ICggQ2hhbmdlRnJlZVRleHQgKSAoIFxkKyApIH14bXMgKSB7CgogICAgICAgICAgICAjIGRvIG5vdCBzaG93IGVtcHR5IGZyZWV0ZXh0IHZhbHVlcwogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAkQ2hhbmdlLT57JEF0dHJpYnV0ZX0gZXEgJyc7CgogICAgICAgICAgICAjIHJlbWVtYmVyIHRoZSBmcmVldGV4dCBudW1iZXIKICAgICAgICAgICAgbXkgJE51bWJlciA9ICQyOwogICAgICAgICAgICAkQ2hhbmdlRnJlZVRleHRGaWVsZHN7JE51bWJlcn0rKzsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHRoZSBjaGFuZ2UgZnJlZXRleHQgZmllbGRzCiAgICBmb3IgbXkgJE51bWJlciAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVDaGFuZ2VGcmVlVGV4dEZpZWxkcyApIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlRnJlZVRleHQnIC4gJE51bWJlciwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlRnJlZVRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkgID0+ICRDaGFuZ2UtPnsgJ0NoYW5nZUZyZWVLZXknIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHQgPT4gJENoYW5nZS0+eyAnQ2hhbmdlRnJlZVRleHQnIC4gJE51bWJlciB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBmcmVldGV4dCBmaWVsZCBhcyBsaW5rCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ0NoYW5nZUZyZWVUZXh0JyAuICROdW1iZXIgLiAnOjpMaW5rJyApICkgewoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUZyZWVUZXh0TGluaycgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VGcmVlVGV4dExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHRMaW5rID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgICAgICAgICAnQ2hhbmdlRnJlZVRleHQnIC4gJE51bWJlciAuICc6OkxpbmsnCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlS2V5ICA9PiAkQ2hhbmdlLT57ICdDaGFuZ2VGcmVlS2V5JyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlVGV4dCA9PiAkQ2hhbmdlLT57ICdDaGFuZ2VGcmVlVGV4dCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGZyZWV0ZXh0IGZpZWxkIGFzIHBsYWluIHRleHQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUZyZWVUZXh0UGxhaW4nIC4gJE51bWJlciwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlRnJlZVRleHRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkgID0+ICRDaGFuZ2UtPnsgJ0NoYW5nZUZyZWVLZXknIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0ID0+ICRDaGFuZ2UtPnsgJ0NoYW5nZUZyZWVUZXh0JyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBzcGFjZSBiZXR3ZWVuIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgYW5kIHRoZSBmb2xsb3dpbmcgZmllbGRzCiAgICBpZiAoJUNoYW5nZUZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUZyZWVUZXh0U3BhY2VyJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBtYW5hZ2VyIGRhdGEKICAgIG15ICVDaGFuZ2VNYW5hZ2VyVXNlcjsKICAgIGlmICggJENoYW5nZS0+e0NoYW5nZU1hbmFnZXJJRH0gKSB7CgogICAgICAgICMgZ2V0IGNoYW5nZSBtYW5hZ2VyIGRhdGEKICAgICAgICAlQ2hhbmdlTWFuYWdlclVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDaGFuZ2VNYW5hZ2VySUR9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBtYW5hZ2VyIGluZm9ybWF0aW9uCiAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAkQ2hhbmdlLT57ICdDaGFuZ2VNYW5hZ2VyJyAuICRQb3N0Zml4IH0gPSAkQ2hhbmdlTWFuYWdlclVzZXJ7JFBvc3RmaXh9IHx8ICcnOwogICAgfQoKICAgICMgb3V0cHV0IGNoYW5nZSBtYW5hZ2VyIGJsb2NrCiAgICBpZiAoJUNoYW5nZU1hbmFnZXJVc2VyKSB7CgogICAgICAgICMgc2hvdyBuYW1lIGFuZCBtYWlsIGFkZHJlc3MgaWYgdXNlciBleGlzdHMKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VNYW5hZ2VyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzaG93IGRhc2ggaWYgbm8gY2hhbmdlIG1hbmFnZXIgZXhpc3RzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHlDaGFuZ2VNYW5hZ2VyJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBDQUIgYmxvY2sgd2hlbiB0aGVyZSBpcyBhIENBQgogICAgaWYgKCBAeyAkQ2hhbmdlLT57Q0FCQWdlbnRzfSB9IHx8IEB7ICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9IH0gKSB7CgogICAgICAgICMgb3V0cHV0IENBQiBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NBQicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGFuZCBvdXRwdXQgQ0FCIGFnZW50cwogICAgICAgIENBQkFHRU5UOgogICAgICAgIGZvciBteSAkQ0FCQWdlbnQgKCBAeyAkQ2hhbmdlLT57Q0FCQWdlbnRzfSB9ICkgewogICAgICAgICAgICBuZXh0IENBQkFHRU5UIGlmICEkQ0FCQWdlbnQ7CgogICAgICAgICAgICBteSAlQ0FCQWdlbnRVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRDQUJBZ2VudCwKICAgICAgICAgICAgICAgIENhY2hlICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDQUJBR0VOVCBpZiAhJUNBQkFnZW50VXNlckRhdGE7CgogICAgICAgICAgICAjIGJ1aWxkIGNvbnRlbnQgZm9yIGFnZW50IGJsb2NrCiAgICAgICAgICAgIG15ICVDQUJBZ2VudERhdGE7CiAgICAgICAgICAgIGZvciBteSAkUG9zdGZpeCAoQFBvc3RmaXhlcykgewogICAgICAgICAgICAgICAgJENBQkFnZW50RGF0YXsgJ0NBQkFnZW50JyAuICRQb3N0Zml4IH0gPSAkQ0FCQWdlbnRVc2VyRGF0YXskUG9zdGZpeH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IGFnZW50IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDQUJBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlQ0FCQWdlbnREYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgYW5kIG91dHB1dCBDQUIgY3VzdG9tZXJzCiAgICAgICAgQ0FCQ1VTVE9NRVI6CiAgICAgICAgZm9yIG15ICRDQUJDdXN0b21lciAoIEB7ICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9IH0gKSB7CiAgICAgICAgICAgIG5leHQgQ0FCQ1VTVE9NRVIgaWYgISRDQUJDdXN0b21lcjsKCiAgICAgICAgICAgIG15ICVDQUJDdXN0b21lclVzZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ0FCQ3VzdG9tZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENBQkNVU1RPTUVSIGlmICElQ0FCQ3VzdG9tZXJVc2VyRGF0YTsKCiAgICAgICAgICAgICMgYnVpbGQgY29udGVudCBmb3IgQ0FCIGN1c3RvbWVyIGJsb2NrCiAgICAgICAgICAgIG15ICVDQUJDdXN0b21lckRhdGE7CiAgICAgICAgICAgIGZvciBteSAkUG9zdGZpeCAoQFBvc3RmaXhlcykgewogICAgICAgICAgICAgICAgJENBQkN1c3RvbWVyRGF0YXsgJ0NBQkN1c3RvbWVyJyAuICRQb3N0Zml4IH0gPSAkQ0FCQ3VzdG9tZXJVc2VyRGF0YXskUG9zdGZpeH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IENBQiBjdXN0b21lciBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ0FCQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUNBQkN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBkYXNoIHdoZW4gbm8gQ0FCIGV4aXN0cwogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHlDQUInLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMgd2hpY2ggYXJlIGRpcmVjdGx5IGxpbmtlZCB3aXRoIHRoaXMgY2hhbmdlIG9iamVjdAogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgS2V5ICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBjaGFuZ2UgaW5pdGlhdG9ycyAoY3VzdG9tZXIgdXNlcnMgb2YgbGlua2VkIHRpY2tldHMpCiAgICBteSAkVGlja2V0c1JlZiA9ICRMaW5rTGlzdFdpdGhEYXRhLT57VGlja2V0fSB8fCB7fTsKICAgIG15ICVDaGFuZ2VJbml0aWF0b3JzSUQ7CiAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyRUaWNrZXRzUmVmfSApIHsKCiAgICAgICAgbXkgJFRpY2tldFJlZiA9ICRUaWNrZXRzUmVmLT57JExpbmtUeXBlfS0+e1NvdXJjZX07CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoIGtleXMgJXskVGlja2V0UmVmfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGlkIG9mIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFRpY2tldFJlZi0+eyRUaWNrZXRJRH0tPntDdXN0b21lclVzZXJJRH07CgogICAgICAgICAgICAjIGlmIGEgY3VzdG9tZXIKICAgICAgICAgICAgaWYgKCRDdXN0b21lclVzZXJJRCkgewogICAgICAgICAgICAgICAgJENoYW5nZUluaXRpYXRvcnNJRHskQ3VzdG9tZXJVc2VySUR9ID0gJ0N1c3RvbWVyVXNlcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkT3duZXJJRCA9ICRUaWNrZXRSZWYtPnskVGlja2V0SUR9LT57T3duZXJJRH07CiAgICAgICAgICAgICAgICAkQ2hhbmdlSW5pdGlhdG9yc0lEeyRPd25lcklEfSA9ICdVc2VyJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgaW5pdGlhdG9ycyBpbmZvCiAgICBpZiAoIGtleXMgJUNoYW5nZUluaXRpYXRvcnNJRCApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VJbml0aWF0b3JFeGlzdHMnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENoYW5nZUluaXRpYXRvcnMgPSAnJzsKICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlQ2hhbmdlSW5pdGlhdG9yc0lEICkgewogICAgICAgIG15ICVVc2VyOwoKICAgICAgICAjIGdldCBjdXN0b21lciB1c2VyIGluZm8gaWYgQ0kgaXMgYSBjdXN0b21lciB1c2VyCiAgICAgICAgaWYgKCAkQ2hhbmdlSW5pdGlhdG9yc0lEeyRVc2VySUR9IGVxICdDdXN0b21lclVzZXInICkgewogICAgICAgICAgICAlVXNlciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGdldCB1c2VyIGluZm8KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB1c2VyIGluZm8gZXhpc3QKICAgICAgICBpZiAoJVVzZXIpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZUluaXRpYXRvcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslVXNlcn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ2hhbmdlSW5pdGlhdG9ycyAuPSBzcHJpbnRmICIlcyAoJXMgJXMpIiwKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJMYXN0bmFtZX07CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBkYXNoIGlmIG5vIGNoYW5nZSBpbml0aWF0b3IgZXhpc3RzCiAgICBpZiAoICEkQ2hhbmdlSW5pdGlhdG9ycyApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFbXB0eUNoYW5nZUluaXRpYXRvcnMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBkaXNwbGF5IGEgc3RyaW5nIHdpdGggYWxsIGNoYW5nZWluaXRpYXRvcnMKICAgICRDaGFuZ2UtPnsnQ2hhbmdlIEluaXRhdG9ycyd9ID0gJENoYW5nZUluaXRpYXRvcnM7CgogICAgIyBzdG9yZSB0aGUgY29tYmluZWQgbGlua2VkIG9iamVjdHMgZnJvbSBhbGwgd29ya29yZGVycyBvZiB0aGlzIGNoYW5nZQogICAgbXkgJExpbmtMaXN0V2l0aERhdGFDb21iaW5lZFdvcmtPcmRlcnMgPSB7fTsKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9ICkgewoKICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cyBvZiB0aGlzIHdvcmtvcmRlcgogICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgS2V5ICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgT0JKRUNUOgogICAgICAgIGZvciBteSAkT2JqZWN0ICgga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyfSApIHsKCiAgICAgICAgICAgICMgb25seSBzaG93IGxpbmtlZCBzZXJ2aWNlcyBhbmQgY29uZmlnIGl0ZW1zIG9mIHdvcmtvcmRlcgogICAgICAgICAgICBpZiAoICRPYmplY3QgbmUgJ1NlcnZpY2UnICYmICRPYmplY3QgbmUgJ0lUU01Db25maWdJdGVtJyApIHsKICAgICAgICAgICAgICAgIG5leHQgT0JKRUNUOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMSU5LVFlQRToKICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgIERJUkVDVElPTjoKICAgICAgICAgICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29tYmluZSB0aGUgbGlua2VkIG9iamVjdCBkYXRhIGZyb20gYWxsIHdvcmtvcmRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtMaXN0V2l0aERhdGFDb21iaW5lZFdvcmtPcmRlcnMtPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57JElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnskSUR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBjb21iaW5lZCBsaW5rZWQgb2JqZWN0cyBmcm9tIHdvcmtvcmRlciB0byBsaW5rZWQgb2JqZWN0cyBmcm9tIGNoYW5nZSBvYmplY3QKICAgICRMaW5rTGlzdFdpdGhEYXRhID0gewogICAgICAgICV7JExpbmtMaXN0V2l0aERhdGF9LAogICAgICAgICV7JExpbmtMaXN0V2l0aERhdGFDb21iaW5lZFdvcmtPcmRlcnN9LAogICAgfTsKCiAgICAjIGdldCBsaW5rIHRhYmxlIHZpZXcgbW9kZQogICAgbXkgJExpbmtUYWJsZVZpZXdNb2RlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIGxpbmsgdGFibGUKICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZScgLiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1RhYmxlU3RyZyA9PiAkTGlua1RhYmxlU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgbXkgJUF0dGFjaG1lbnRzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlSUR9LAogICAgKTsKCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlRJRDoKICAgIGZvciBteSAkQXR0YWNobWVudElEICgga2V5cyAlQXR0YWNobWVudHMgKSB7CgogICAgICAgICMgZ2V0IGluZm8gYWJvdXQgZmlsZQogICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudEdldCgKICAgICAgICAgICAgRmlsZUlEID0+ICRBdHRhY2htZW50SUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgYXR0YWNobWVudCBpbmZvcm1hdGlvbgogICAgICAgIG5leHQgQVRUQUNITUVOVElEIGlmICEkQXR0YWNobWVudERhdGE7CgogICAgICAgICMgc2hvdyBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50RGF0YX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlRGVsZXRlLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgdGVtcGxhdGUgZGVsZXRlIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVEZWxldGUucG0sdiAxLjIgMjAxMC8wMS8yOCAxMzo0NTozNSBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01UZW1wbGF0ZURlbGV0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VGVtcGxhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbiEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIFRlbXBsYXRlSUQKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFRlbXBsYXRlSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGUgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFRlbXBsYXRlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJUZW1wbGF0ZSAnJFRlbXBsYXRlSUQnIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZURlbGV0ZScgKSB7CgogICAgICAgIG15ICRDb3VsZERlbGV0ZVRlbXBsYXRlID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJENvdWxkRGVsZXRlVGVtcGxhdGUpIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gY2hhbmdlIHpvb20gbWFzaywgd2hlbiB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXciLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIGRlbGV0ZSBmYWlsZWQKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSB0ZW1wbGF0ZSAkVGVtcGxhdGVJRCEiLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICdEZWxldGUnLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01UZW1wbGF0ZURlbGV0ZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJXskVGVtcGxhdGV9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlRWRpdC5wbSAtIHRoZSB0ZW1wbGF0ZSBlZGl0IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVFZGl0LnBtLHYgMS40IDIwMTAvMDEvMjggMTM6NDU6MzUgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNVGVtcGxhdGVFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9uISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgVGVtcGxhdGVJRAogICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gVGVtcGxhdGVJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KFRlbXBsYXRlTmFtZSBDb21tZW50IFZhbGlkSUQpKSB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgbXkgQFZhbGlkYXRpb25FcnJvcnM7CgogICAgIyB1cGRhdGUgdGhlIHRlbXBsYXRlCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlVGVtcGxhdGUnICkgewoKICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSB0ZW1wbGF0ZSBuYW1lCiAgICAgICAgbXkgJFRlbXBsYXRlTmFtZSA9ICRHZXRQYXJhbXtUZW1wbGF0ZU5hbWV9OwogICAgICAgIGlmICggISRUZW1wbGF0ZU5hbWUgKSB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkVGVtcGxhdGVOYW1lJzsKICAgICAgICB9CgogICAgICAgIGlmICggIUBWYWxpZGF0aW9uRXJyb3JzICkgewogICAgICAgICAgICBteSAkQ291bGRVcGRhdGVUZW1wbGF0ZSA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRHZXRQYXJhbXtUZW1wbGF0ZU5hbWV9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICA9PiAkR2V0UGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRDb3VsZFVwZGF0ZVRlbXBsYXRlKSB7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIG1hc2ssIFRPRE86IHVzZSB0aGUgc3RvcmVkIGxhc3QgdmlldwogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldhcyBub3QgYWJsZSB0byB1cGRhdGUgVGVtcGxhdGUgJFRlbXBsYXRlSUQhIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBpbml0aWFsbHkgdXNlIHRoZSBkYXRhIGZyb20gJFRlbXBsYXRlCiAgICAgICAgJUdldFBhcmFtID0gKCk7CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRUZW1wbGF0ZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiVGVtcGxhdGUgJyRUZW1wbGF0ZUlEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZpeCB1cCB0aGUgbmFtZQogICAgJFRlbXBsYXRlLT57VGVtcGxhdGVOYW1lfSA9ICRUZW1wbGF0ZS0+e05hbWV9OwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICRUZW1wbGF0ZS0+e1RlbXBsYXRlTmFtZX0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICBteSAkVmFsaWRTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCksCiAgICAgICAgfSwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXtWYWxpZElEfQogICAgICAgICAgICB8fCAkVGVtcGxhdGUtPntWYWxpZElEfQogICAgICAgICAgICB8fCAoICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpIClbMF0sCiAgICAgICAgU29ydCA9PiAnTnVtZXJpY0tleScsCiAgICApOwoKICAgICMgYWRkIHRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzCiAgICBmb3IgbXkgJEJsb2NrTmFtZSAoQFZhbGlkYXRpb25FcnJvcnMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICRCbG9ja05hbWUgKTsKICAgIH0KCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVRlbXBsYXRlRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJXskVGVtcGxhdGV9LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFZhbGlkU2VsZWN0aW9uU3RyaW5nID0+ICRWYWxpZFNlbGVjdGlvblN0cmluZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXcucG0gLSB0aGUgdGVtcGxhdGUgb3ZlcnZpZXcgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3LnBtLHYgMS4xMyAyMDEwLzA0LzI3IDIwOjM2OjU3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNVGVtcGxhdGVPdmVydmlldzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VGVtcGxhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGZpbHRlciBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuLCB1c2VkIGZvciBiYWNrbGlua3MKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblRlbXBsYXRlcycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgc29ydGluZyBwYXJhbWV0ZXJzCiAgICBteSAkU29ydEJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J1NvcnRCeTo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1RlbXBsYXRlSUQnOwoKICAgICMgZ2V0IG9yZGVyaW5nIHBhcmFtZXRlcnMKICAgIG15ICRPcmRlckJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ1VwJzsKCiAgICBteSBAU29ydEJ5QXJyYXkgID0gKCRTb3J0QnkpOwogICAgbXkgQE9yZGVyQnlBcnJheSA9ICgkT3JkZXJCeSk7CgogICAgIyBpbnZlc3RpZ2F0ZSByZWZyZXNoCiAgICBteSAkUmVmcmVzaCA9ICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSA/IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9IDogdW5kZWY7CgogICAgIyBzdGFydGluZyB3aXRoIHBhZ2UgLi4uCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2ggKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgICRPdXRwdXQgPSAnJzsKCiAgICAjIGZpbmQgb3V0IHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHNob3duCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dDb2x1bW5zfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHBvc3NpYmxlIGNvbHVtbnMgZnJvbSBjb25maWcKICAgICAgICBteSAlUG9zc2libGVDb2x1bW4gPSAleyAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gfTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIEBTaG93Q29sdW1ucyA9IGdyZXAgeyAkUG9zc2libGVDb2x1bW57JF99IH0ga2V5cyAlUG9zc2libGVDb2x1bW47CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBzZXQgb3RoZXIgZmlsdGVycyBiYXNlZCBvbiB0ZW1wbGF0ZSB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OlRlbXBsYXRlVHlwZXMnfSApIHsKCiAgICAgICAgIyBkZWZpbmUgcG9zaXRpb24gb2YgdGhlIGZpbHRlciBpbiB0aGUgZnJvbnRlbmQKICAgICAgICBteSAkUHJpb0NvdW50ZXIgPSAxMDAwOwoKICAgICAgICAjIGdldCBhbGwgdGVtcGxhdGUgdHlwZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBmaWx0ZXJzCiAgICAgICAgVEVNUExBVEVfVFlQRToKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlVHlwZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OlRlbXBsYXRlVHlwZXMnfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IHRlbXBsYXRlIHR5cGVzCiAgICAgICAgICAgIG5leHQgVEVNUExBVEVfVFlQRSBpZiAhJFRlbXBsYXRlVHlwZTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIHRlbXBsYXRlIHR5cGUgaXMgdmFsaWQgYnkgbG9va2luZyB1cCB0aGUgaWQKICAgICAgICAgICAgbXkgJFRlbXBsYXRlVHlwZUlEID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAkVGVtcGxhdGVUeXBlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGludmFsaWQgdGVtcGxhdGUgdHlwZXMKICAgICAgICAgICAgbmV4dCBURU1QTEFURV9UWVBFIGlmICEkVGVtcGxhdGVUeXBlSUQ7CgogICAgICAgICAgICAjIGluY3JlYXNlIHRoZSBQcmlvQ291bnRlcgogICAgICAgICAgICAkUHJpb0NvdW50ZXIrKzsKCiAgICAgICAgICAgICMgYWRkIGZpbHRlciB3aXRoIHBhcmFtcyBmb3IgdGhlIHNlYXJjaCBtZXRob2QKICAgICAgICAgICAgJEZpbHRlcnN7JFRlbXBsYXRlVHlwZX0gPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJFRlbXBsYXRlVHlwZSwKICAgICAgICAgICAgICAgIFByaW8gICA9PiAkUHJpb0NvdW50ZXIsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZXMgICAgPT4gWyRUZW1wbGF0ZVR5cGVdLAogICAgICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFxAT3JkZXJCeUFycmF5LAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgb25seSBvbmUgZmlsdGVyIGV4aXN0cwogICAgaWYgKCBzY2FsYXIga2V5cyAlRmlsdGVycyA9PSAxICkgewoKICAgICAgICAjIGdldCB0aGUgbmFtZSBvZiB0aGUgb25seSBmaWx0ZXIKICAgICAgICBteSAoJEZpbHRlck5hbWUpID0ga2V5cyAlRmlsdGVyczsKCiAgICAgICAgIyBhY3RpdmF0ZSB0aGlzIGZpbHRlcgogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRGaWx0ZXJOYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgYWRkIGRlZmF1bHQgZmlsdGVyLCB3aGljaCBzaG93cyBhbGwgaXRlbXMKICAgICAgICAkRmlsdGVyc3tBbGx9ID0gewogICAgICAgICAgICBOYW1lICAgPT4gJ0FsbCcsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBcQFNvcnRCeUFycmF5LAogICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMTAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggISRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkludmFsaWQgRmlsdGVyOiAkU2VsZi0+e0ZpbHRlcn0hIiApOwogICAgfQoKICAgICMgc2VhcmNoIHRlbXBsYXRlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkSURzUmVmID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlU2VhcmNoKAogICAgICAgICV7ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e1NlYXJjaH0gfSwKICAgICk7CgogICAgIyBkaXNwbGF5IGFsbCBuYXZiYXIgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyICgga2V5cyAlRmlsdGVycyApIHsKCiAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIGZpbHRlcgogICAgICAgIG15ICRDb3VudCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZVNlYXJjaCgKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0tPntTZWFyY2h9IH0sCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSB0aGUgbmF2YmFyIGZpbHRlcgogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgQ291bnQgID0+ICRDb3VudCwKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIHNob3cgdGhlIGxpc3QKICAgIG15ICRMaW5rUGFnZSA9ICdGaWx0ZXI9JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57RmlsdGVyfSApCiAgICAgICAgLiAnO1NvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJztPcmRlckJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJzsnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICc7JzsKICAgIG15ICRMaW5rRmlsdGVyID0gJ1NvcnRCeT0nCiAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnOyc7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SVRTTVRlbXBsYXRlTGlzdFNob3coCgogICAgICAgIFRlbXBsYXRlSURzID0+ICRJRHNSZWYsCiAgICAgICAgVG90YWwgICAgICAgPT4gc2NhbGFyIEB7JElEc1JlZn0sCgogICAgICAgIEZpbHRlciAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgIEZpbHRlcnMgICAgPT4gXCVOYXZCYXJGaWx0ZXIsCiAgICAgICAgRmlsdGVyTGluayA9PiAkTGlua0ZpbHRlciwKCiAgICAgICAgVGl0bGVOYW1lID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdPdmVydmlldycpCiAgICAgICAgICAgIC4gJzogJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUZW1wbGF0ZScpLAoKICAgICAgICBUaXRsZVZhbHVlID0+ICRGaWx0ZXJzeyAkU2VsZi0+e0ZpbHRlcn0gfS0+e05hbWV9LAoKICAgICAgICBFbnYgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgPT4gJExpbmtTb3J0LAoKICAgICAgICBTaG93Q29sdW1ucyA9PiBcQFNob3dDb2x1bW5zLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVVzZXJTZWFyY2gucG0gLSBhIG1vZHVsZSB1c2VkIGZvciB0aGUgYXV0b2NvbXBsZXRlIGZlYXR1cmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVVzZXJTZWFyY2gucG0sdiAxLjE1IDIwMTAvMDUvMTEgMTU6MjE6MjYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Vc2VyU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBHcm91cE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEpTT04gPSAnJzsKCiAgICAjIHNlYXJjaCB1c2VycwogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewoKICAgICAgICAjIGdldCBuZWVkZWQgcGFyYW1zCiAgICAgICAgbXkgJFNlYXJjaCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaCcgKSB8fCAnJzsKICAgICAgICBteSAkR3JvdXBzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnR3JvdXBzJyApIHx8ICcnOwoKICAgICAgICAjIGdldCBhbGwgbWVtYmVycyBvZiB0aGUgZ3JvdXBzCiAgICAgICAgbXkgJUdyb3VwVXNlcnM7CiAgICAgICAgaWYgKCRHcm91cHMpIHsKICAgICAgICAgICAgbXkgQEdyb3VwTmFtZXMgPSBzcGxpdCAvLFxzKy8sICRHcm91cHM7CgogICAgICAgICAgICBHUk9VUE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXBOYW1lIChAR3JvdXBOYW1lcykgewoKICAgICAgICAgICAgICAgICMgYWxsb3cgdHJhaWxpbmcgY29tbWEKICAgICAgICAgICAgICAgIG5leHQgR1JPVVBOQU1FIGlmICEkR3JvdXBOYW1lOwoKICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgIEdyb3VwID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgR1JPVVBOQU1FIGlmICEkR3JvdXBJRDsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VycyBpbiBncm91cAogICAgICAgICAgICAgICAgbXkgJVVzZXJzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15IEBVc2VySURzID0ga2V5cyAlVXNlcnM7CiAgICAgICAgICAgICAgICBAR3JvdXBVc2Vyc3tAVXNlcklEc30gPSBAVXNlcklEczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB3b3JrYXJvdW5kLCBhbGwgYXV0byBjb21wbGV0aW9uIHJlcXVlc3RzIGdldCBwb3N0ZWQgYnkgdXRmOCBhbnl3YXkKICAgICAgICAjIGNvbnZlcnQgYW55IHRvIDhiaXQgc3RyaW5nIGlmIGFwcGxpY2F0aW9uIGlzIG5vdCBydW5uaW5nIGluIHV0ZjgKICAgICAgICBpZiAoICEkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZUludGVybmFsVXNlZCgpICkgewogICAgICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntFbmNvZGVPYmplY3R9LT5Db252ZXJ0KAogICAgICAgICAgICAgICAgVGV4dCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgICAgICAgICAgICAgVG8gICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIGxpc3QKICAgICAgICBteSAlVXNlckxpc3QgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgc2VudCBhcyByZXNwb25zZQogICAgICAgIG15IEBEYXRhOwoKICAgICAgICBVU0VSSUQ6CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IHsgJFVzZXJMaXN0eyRhfSBjbXAgJFVzZXJMaXN0eyRifSB9IGtleXMgJVVzZXJMaXN0ICkgewoKICAgICAgICAgICAgIyBpZiBncm91cHMgYXJlIHJlcXVpcmVkIGFuZCB1c2VyIGlzIG5vdCBtZW1iZXIgb2Ygb25lIG9mIHRoZSBncm91cHMKICAgICAgICAgICAgIyB0aGVuIHNraXAgdGhlIHVzZXIKICAgICAgICAgICAgaWYgKCAkR3JvdXBzICYmICEkR3JvdXBVc2Vyc3skVXNlcklEfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVVNFUklEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFRoZSB2YWx1ZXMgaW4gJVVzZXJMaXN0IGFyZSBpbiB0aGUgZm9ybTogJ21tIE1heCBNdXN0ZXJtYW5uJy4KICAgICAgICAgICAgIyBTbyBhc3NlbWJsZSBhIG5lYXRlciBzdHJpbmcgZm9yIGRpc3BsYXkuCiAgICAgICAgICAgICMgKEFjdHVhbGx5IFVzZXJTZWFyY2goKSBjb250YWlucyBjb2RlIGZvciBmb3JtYXRpbmcsIGJ1dCB0aGF0IGlzIHVzdWFsbHkgbm90IGNhbGxlZC4pCiAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAkUGFyYW17VmFsaWR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkVXNlclZhbHVlUGxhaW4gPSBzcHJpbnRmICciJXMgJXMiIDwlcz4nLAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckVtYWlsfTsKCiAgICAgICAgICAgICMgaHRtbCBxdW90ZSBjaGFyYWN0ZXJzIGxpa2UgPD4KICAgICAgICAgICAgbXkgJFVzZXJWYWx1ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFVzZXJWYWx1ZVBsYWluLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICAgICAgVXNlcktleSAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJWYWx1ZSAgICAgID0+ICRVc2VyVmFsdWUsCiAgICAgICAgICAgICAgICBVc2VyVmFsdWVQbGFpbiA9PiAkVXNlclZhbHVlUGxhaW4sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT04oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgICAgIFJlc3VsdHMgPT4gXEBEYXRhLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckFkZC5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IHdvcmtvcmRlciBhZGQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJBZGQucG0sdiAxLjU5IDIwMTAvMDYvMjkgMTM6NDg6MDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJBZGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41OSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VGVtcGxhdGVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBDaGFuZ2VJRAogICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbmdlSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRDaGFuZ2VJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gQ2hhbmdlSUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRoZSBhZGQgbWFzawogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zIG9uIHRoZSBjaGFuZ2UhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2hhbmdlICckQ2hhbmdlSUQnIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KAogICAgICAgIFdvcmtPcmRlclRpdGxlIEluc3RydWN0aW9uIFdvcmtPcmRlclR5cGVJRAogICAgICAgIFBsYW5uZWRFZmZvcnQKICAgICAgICBTYXZlQXR0YWNobWVudCBGaWxlSUQKICAgICAgICBNb3ZlVGltZVR5cGUgTW92ZVRpbWVZZWFyIE1vdmVUaW1lTW9udGggTW92ZVRpbWVEYXkgTW92ZVRpbWVIb3VyCiAgICAgICAgTW92ZVRpbWVNaW51dGUgVGVtcGxhdGVJRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlndXJlZCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGQgbnVtYmVycwogICAgbXkgQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcwogICAgICAgID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXRDb25maWd1cmVkRnJlZVRleHRGaWVsZHMoKTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgZnJlZXRleHQgcGFyYW1zCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRQYXJhbTsKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgICMgY29uc2lkZXIgb25seSBmcmVldGV4dCBmaWVsZHMgd2hpY2ggYXJlIGFjdGl2YXRlZCBpbiB0aGlzIGZyb250ZW5kCiAgICAgICAgbmV4dCBOVU1CRVIgaWYgISRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9OwoKICAgICAgICBteSAkS2V5ICAgPSAnV29ya09yZGVyRnJlZUtleScgLiAkTnVtYmVyOwogICAgICAgIG15ICRWYWx1ZSA9ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyOwoKICAgICAgICAkV29ya09yZGVyRnJlZVRleHRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyBzdG9yZSB0aW1lIHJlbGF0ZWQgZmllbGRzIGluICVHZXRQYXJhbQogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSBNb3ZlVGltZSkpIHsKICAgICAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICBteSAkUGFyYW1OYW1lID0gJFRpbWVUeXBlIC4gJFRpbWVQYXJ0OwogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBzYXZpbmcgd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICAjIFRoZSBlbnRyaWVzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgcmVtZW1iZXIgdGhlIG51bWJlcnMgb2YgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgd2l0aCB2YWxpZGF0aW9uIGVycm9ycwogICAgbXkgJVdvcmtPcmRlckZyZWVUZXh0VmFsaWRhdGlvbkVycm9yczsKCiAgICAjIGdldCBtZXRhIGRhdGEgZm9yIGFsbCBhbHJlYWR5IHVwbG9hZGVkIGZpbGVzCiAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgcmVzZXQgc3ViYWN0aW9uCiAgICAjIGlmIGF0dGFjaG1lbnQgdXBsb2FkIGlzIHJlcXVlc3RlZAogICAgaWYgKCAkR2V0UGFyYW17U2F2ZUF0dGFjaG1lbnR9ICkgewoKICAgICAgICAjIGdldCB1cGxvYWQgZGF0YQogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAnQXR0YWNobWVudE5ldycsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpbGUgd2FzIGFscmVhZHkgdXBsb2FkZWQKICAgICAgICBteSAkRmlsZUFscmVhZHlVcGxvYWRlZCA9IDA7CiAgICAgICAgZm9yIG15ICRGaWxlTWV0YURhdGEgKEBBdHRhY2htZW50cykgewogICAgICAgICAgICBpZiAoICRGaWxlTWV0YURhdGEtPntGaWxlbmFtZX0gZXEgJFVwbG9hZFN0dWZme0ZpbGVuYW1lfSApIHsKICAgICAgICAgICAgICAgICRGaWxlQWxyZWFkeVVwbG9hZGVkID0gMTsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ZpbGVBbHJlYWR5VXBsb2FkZWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkRmlsZUFscmVhZHlVcGxvYWRlZCApIHsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgYXR0YWNobWVudCBsaXN0LCBhcyBhbiBhdHRhY2htZW50IHdhcyBhZGRlZAogICAgICAgICAgICBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICdTYXZlQXR0YWNobWVudCc7CiAgICB9CgogICAgIyByZXNldCBzdWJhY3Rpb24KICAgICMgaWYgYXR0YWNobWVudCBzaG91bGQgYmUgZGVsZXRlZAogICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0RlbGV0ZUF0dGFjaG1lbnQnIC4gJEF0dGFjaG1lbnQtPntGaWxlSUR9ICkgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGF0dGFjaG1lbnQKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRBdHRhY2htZW50LT57RmlsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IG1hcmtlciB0aGF0IHRoZSBhdHRhY2htZW50IGxpc3QgbmVlZHMgdG8gYmUgcmVsb2FkZWQKICAgICAgICAgICAgJFNlbGYtPntTdWJhY3Rpb259ID0gJ0RlbGV0ZUF0dGFjaG1lbnQnOwogICAgICAgIH0KICAgIH0KCiAgICAjIHBlcmZvcm0gdGhlIGFkZGluZwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewoKICAgICAgICAjIHRoZSB0aXRsZSBpcyByZXF1aXJlZAogICAgICAgIGlmICggISRHZXRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkVGl0bGUnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBXb3JrT3JkZXJUeXBlSUQKICAgICAgICBteSAkV29ya09yZGVyVHlwZSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRXb3JrT3JkZXJUeXBlICkgewogICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFR5cGUnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIGNvbXBsZXRlIHRpbWVzIGFyZSBwYXNzZWQgYW5kIGJ1aWxkIHRoZSB0aW1lIHN0YW1wcwogICAgICAgIG15ICVTeXN0ZW1UaW1lOwogICAgICAgIFRJTUVUWVBFOgogICAgICAgIGZvciBteSAkVGltZVR5cGUgKHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUpKSB7CiAgICAgICAgICAgIGZvciBteSAkVGltZVBhcnQgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgbXkgJFBhcmFtTmFtZSA9ICRUaW1lVHlwZSAuICRUaW1lUGFydDsKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRQYXJhbU5hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1OYW1lISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFRJTUVUWVBFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvcm1hdCBhcyB0aW1lc3RhbXAKICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lVHlwZX0gPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnWWVhcicgfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ01vbnRoJyB9LAogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9LAogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnSG91cicgfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ01pbnV0ZScgfTsKCiAgICAgICAgICAgICMgc2FuaXR5IGNoZWNrIHRoZSBhc3NlbWJsZWQgdGltZXN0YW1wCiAgICAgICAgICAgICRTeXN0ZW1UaW1leyRUaW1lVHlwZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17JFRpbWVUeXBlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgdGltZSBmb3JtYXQgaXMgaW52YWxpZAogICAgICAgICAgICBpZiAoICEkU3lzdGVtVGltZXskVGltZVR5cGV9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgIkludmFsaWQkVGltZVR5cGUiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBvcmRlcmluZyBvZiB0aGUgdGltZXMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTeXN0ZW1UaW1le1BsYW5uZWRTdGFydFRpbWV9CiAgICAgICAgICAgICYmICRTeXN0ZW1UaW1le1BsYW5uZWRFbmRUaW1lfQogICAgICAgICAgICAmJiAkU3lzdGVtVGltZXtQbGFubmVkU3RhcnRUaW1lfSA+PSAkU3lzdGVtVGltZXtQbGFubmVkRW5kVGltZX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRQbGFubmVkRW5kVGltZSc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvcm1hdCBvZiBwbGFubmVkIGVmZm9ydCwgZW1wdHkgaXMgYWxsb3dlZAogICAgICAgIGlmICggJEdldFBhcmFte1BsYW5uZWRFZmZvcnR9ICF+IG17IFxBIFxkKiAoPzogWy5dIFxkezEsMn0gKT8gXHogfXhtcyApIHsKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRQbGFubmVkRWZmb3J0JzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZm9yIHJlcXVpcmVkIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn0KICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9ID09IDIKICAgICAgICAgICAgICAgICYmICRXb3JrT3JkZXJGcmVlVGV4dFBhcmFteyAnV29ya09yZGVyRnJlZVRleHQnIC4gJE51bWJlciB9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIHRoZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGQgbnVtYmVyIHdpdGggdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnN7JE51bWJlcn0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgb25seSB3aGVuIHRoZXJlIGFyZSBubyBpbnB1dCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgIGlmICggIUBWYWxpZGF0aW9uRXJyb3JzICYmICElV29ya09yZGVyRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzICkgewogICAgICAgICAgICBteSAkV29ya09yZGVySUQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAkR2V0UGFyYW17V29ya09yZGVyVGl0bGV9LAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICA9PiAkR2V0UGFyYW17SW5zdHJ1Y3Rpb259LAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAkR2V0UGFyYW17UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICRHZXRQYXJhbXtQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9LAogICAgICAgICAgICAgICAgUGxhbm5lZEVmZm9ydCAgICA9PiAkR2V0UGFyYW17UGxhbm5lZEVmZm9ydH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICVXb3JrT3JkZXJGcmVlVGV4dFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGRpbmcgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgaWYgKCRXb3JrT3JkZXJJRCkgewoKICAgICAgICAgICAgICAgICMgbW92ZSBhdHRhY2htZW50cyBmcm9tIGNhY2hlIHRvIHZpcnR1YWwgZnMKICAgICAgICAgICAgICAgIG15IEBDYWNoZWRBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRDYWNoZWRBdHRhY2htZW50IChAQ2FjaGVkQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQ2FjaGVkQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgZmlsZSBmcm9tIGNhY2hlIGlmIG1vdmUgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDYWNoZWRBdHRhY2htZW50LT57RmlsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW5ub3QgbW92ZSBGaWxlIGZyb20gQ2FjaGUgdG8gVmlydHVhbEZTJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIigkeyRDYWNoZWRBdHRhY2htZW50fXtGaWxlbmFtZX0pIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIG1hc2sgb2YgdGhlIG5ldyB3b3Jrb3JkZXIsIHdoZW4gYWRkaW5nIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb20mV29ya09yZGVySUQ9JFdvcmtPcmRlcklEIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UsIHdoZW4gYWRkaW5nIGZhaWxlZAogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnV2FzIG5vdCBhYmxlIHRvIGFkZCB3b3Jrb3JkZXIhJywKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgd29ya29yZGVyIGZyb20gdGVtcGxhdGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVGcm9tVGVtcGxhdGUnICkgewoKICAgICAgICBteSAkTmV3VGltZTsKCiAgICAgICAgIyBjaGVjayB2YWxpZGl0eSBvZiB0aGUgdGltZSB0eXBlCiAgICAgICAgbXkgJE1vdmVUaW1lVHlwZSA9ICRHZXRQYXJhbXtNb3ZlVGltZVR5cGV9OwogICAgICAgIGlmICgKICAgICAgICAgICAgIWRlZmluZWQgJE1vdmVUaW1lVHlwZQogICAgICAgICAgICB8fCAoICRNb3ZlVGltZVR5cGUgbmUgJ1BsYW5uZWRTdGFydFRpbWUnICYmICRNb3ZlVGltZVR5cGUgbmUgJ1BsYW5uZWRFbmRUaW1lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkVGltZVR5cGUnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgY29tcGxldGVuZXNzIG9mIHRoZSB0aW1lIHBhcmFtZXRlciBsaXN0LAogICAgICAgICMgb25seSBob3VyIGFuZCBtaW51dGUgYXJlIGFsbG93ZWQgdG8gYmUgJzAnCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJEdldFBhcmFte01vdmVUaW1lWWVhcn0KICAgICAgICAgICAgfHwgISRHZXRQYXJhbXtNb3ZlVGltZU1vbnRofQogICAgICAgICAgICB8fCAhJEdldFBhcmFte01vdmVUaW1lRGF5fQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkR2V0UGFyYW17TW92ZVRpbWVIb3VyfQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkR2V0UGFyYW17TW92ZVRpbWVNaW51dGV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkTW92ZVRpbWUnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIHN5c3RlbSB0aW1lIGZyb20gdGhlIGlucHV0LCBpZiBpdCBjYW4ndCBiZSBkZXRlcm1pbmVkIHdlIGhhdmUgYSB2YWxpZGF0aW9uIGVycm9yCiAgICAgICAgaWYgKCAhQFZhbGlkYXRpb25FcnJvcnMgKSB7CgogICAgICAgICAgICAjIGZvcm1hdCBhcyB0aW1lc3RhbXAKICAgICAgICAgICAgbXkgJFBsYW5uZWRUaW1lID0gc3ByaW50ZiAnJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwJywKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZVllYXJ9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lRGF5fSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtNb3ZlVGltZUhvdXJ9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte01vdmVUaW1lTWludXRlfTsKCiAgICAgICAgICAgICMgc2FuaXR5IGNoZWNrIG9mIHRoZSBhc3NlbWJsZWQgdGltZXN0YW1wCiAgICAgICAgICAgICROZXdUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBsYW5uZWRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJE5ld1RpbWUgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZE1vdmVUaW1lJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIGEgdGVtcGxhdGUgd2FzIHNlbGVjdGVkCiAgICAgICAgaWYgKCAhJEdldFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFRlbXBsYXRlJzsKICAgICAgICB9CgogICAgICAgIGlmICggIUBWYWxpZGF0aW9uRXJyb3JzICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgdGVtcGxhdGUgYmFzZWQgb24gdGhlIHRlbXBsYXRlCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZURlU2VyaWFsaXplKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgICA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIE5ld1RpbWVJbkVwb2NoZSA9PiAkTmV3VGltZSwKICAgICAgICAgICAgICAgIE1vdmVUaW1lVHlwZSAgICA9PiAkR2V0UGFyYW17TW92ZVRpbWVUeXBlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hhbmdlIGNvdWxkIG5vdCBiZSBjcmVhdGVkCiAgICAgICAgICAgIGlmICggISRXb3JrT3JkZXJJRCApIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSwgd2hlbiBhZGRpbmcgZmFpbGVkCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdXYXMgbm90IGFibGUgdG8gY3JlYXRlIHdvcmtvcmRlciBmcm9tIHRlbXBsYXRlIScsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzayBvZiB0aGUgbmV3IHdvcmtvcmRlciwgd2hlbiBhZGRpbmcgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb20mV29ya09yZGVySUQ9JFdvcmtPcmRlcklEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgc2FhdmVhdHRhY2htZW50IHN1YmFjdGlvbgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmVBdHRhY2htZW50JyApIHsKCiAgICAgICAgIyBub3RoaW5nIHRvIGRvCiAgICAgICAgIyBhdHRhY2htZW50cyB3ZXJlIGFscmVhZHkgc2F2ZWQgYWJvdmUKICAgIH0KCiAgICAjIGhhbmRsZSBhdHRhY2htZW50IGRlbGV0aW9uCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlQXR0YWNobWVudCcgKSB7CgogICAgICAgICMgcmVsb2FkIHRoZSBhdHRhY2htZW50IGxpc3QsCiAgICAgICAgIyBhcyBhdCBsZWFzdCBvbmUgYXR0YWNobWVudCB3YXMgZGVsZXRlZCBhYm92ZQogICAgICAgIEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGhhbmRsZSBhdHRhY2htZW50IGRvd25sb2FkcwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkQXR0YWNobWVudCcgKSB7CgogICAgICAgICMgZ2V0IG1ldGEtZGF0YSBhbmQgY29udGVudCBvZiB0aGUgY2FjaGVkIGF0dGFjaG1lbnRzCiAgICAgICAgbXkgQENhY2hlZEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkYXRhIGZvciByZXF1ZXN0ZWQgYXR0YWNobWVudAogICAgICAgIG15ICgkQXR0YWNobWVudERhdGEpID0gZ3JlcCB7ICRfLT57RmlsZUlEfSA9PSAkR2V0UGFyYW17RmlsZUlEfSB9IEBDYWNoZWRBdHRhY2htZW50czsKCiAgICAgICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgICAgIGlmICggISRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkR2V0UGFyYW17RmlsZUlEfSkhIE1heSBiZSBhbiBhdHRhY2shISEiLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgVHlwZSA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHRlbXBsYXRlIGRyb3Bkb3duCiAgICBteSAkVGVtcGxhdGVMaXN0ID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBDb21tZW50TGVuZ3RoID0+IDE1LAogICAgICAgIFRlbXBsYXRlVHlwZSAgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgKTsKICAgIG15ICRUZW1wbGF0ZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdUZW1wbGF0ZUlEJywKICAgICAgICBEYXRhICAgICAgICAgPT4gJFRlbXBsYXRlTGlzdCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgIyBidWlsZCBkcm9wLWRvd24gd2l0aCB0aW1lIHR5cGVzCiAgICBteSAkTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IFsKICAgICAgICAgICAgeyBLZXkgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLCBWYWx1ZSA9PiAnUGxhbm5lZFN0YXJ0VGltZScgfSwKICAgICAgICAgICAgeyBLZXkgPT4gJ1BsYW5uZWRFbmRUaW1lJywgICBWYWx1ZSA9PiAnUGxhbm5lZEVuZFRpbWUnIH0sCiAgICAgICAgXSwKICAgICAgICBOYW1lID0+ICdNb3ZlVGltZVR5cGUnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte01vdmVUaW1lVHlwZX0gfHwgJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgKTsKCiAgICAjIHRpbWUgcGVyaW9kIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhlIEdVSQogICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgIyBhZGQgc2VsZWN0aW9uIGZvciB0aGUgdGltZQogICAgbXkgJE1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgUHJlZml4ID0+ICdNb3ZlVGltZScsCiAgICAgICAgJVRpbWVQZXJpb2QsCiAgICApOwoKICAgICMgcmVtb3ZlIEFKQVgtTG9hZGluZyBpbWFnZXMgaW4gZGF0ZSBzZWxlY3Rpb24gZmllbGRzIHRvIGF2b2lkIGppdHRlciBlZmZlY3QKICAgICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVtb3ZlQUpBWExvYWRpbmdJbWFnZSgKICAgICAgICBIVE1MU3RyaW5nID0+ICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZywKICAgICk7CgogICAgIyBzaG93IGJsb2NrIHdpdGggdGVtcGxhdGUgZHJvcGRvd24KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGVtcGxhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICBUZW1wbGF0ZVNlbGVjdGlvblN0cmluZyAgICAgPT4gJFRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICBNb3ZlVGltZVR5cGVTZWxlY3Rpb25TdHJpbmcgPT4gJE1vdmVUaW1lVHlwZVNlbGVjdGlvblN0cmluZywKICAgICAgICAgICAgTW92ZVRpbWVTZWxlY3Rpb25TdHJpbmcgICAgID0+ICRNb3ZlVGltZVNlbGVjdGlvblN0cmluZywKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgdmFsaWRhdGlvbiBlcnJvcnMgaW4gV29ya09yZGVyVGVtcGxhdGUgYmxvY2sKICAgIG15ICVWYWxpZGF0aW9uRXJyb3JOYW1lczsKICAgIEBWYWxpZGF0aW9uRXJyb3JOYW1lc3tAVmFsaWRhdGlvbkVycm9yc30gPSAoMSkgeCBAVmFsaWRhdGlvbkVycm9yczsKICAgIGZvciBteSAkQ2hhbmdlVGVtcGxhdGVWYWxpZGF0aW9uRXJyb3IgKHF3KEludmFsaWRNb3ZlVGltZVR5cGUgSW52YWxpZE1vdmVUaW1lIEludmFsaWRUZW1wbGF0ZSkpCiAgICB7CiAgICAgICAgaWYgKCAkVmFsaWRhdGlvbkVycm9yTmFtZXN7JENoYW5nZVRlbXBsYXRlVmFsaWRhdGlvbkVycm9yfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJENoYW5nZVRlbXBsYXRlVmFsaWRhdGlvbkVycm9yLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAnQWRkJywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IHNlbGVjdGVkIHR5cGUKICAgIG15ICVTZWxlY3RlZEluZm8gPSAoCiAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgKTsKCiAgICBpZiAoICRHZXRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ICkgewogICAgICAgICVTZWxlY3RlZEluZm8gPSAoIFNlbGVjdGVkID0+ICRHZXRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9LCApCiAgICB9CgogICAgIyBnZXQgV29ya09yZGVyVHlwZSBsaXN0CiAgICBteSAkV29ya09yZGVyVHlwZUxpc3QgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgJVNlbGVjdGVkSW5mbywKICAgICkgfHwgW107CgogICAgIyBidWlsZCB0aGUgZHJvcGRvd24KICAgIG15ICRXb3JrT3JkZXJUeXBlRHJvcERvd24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclR5cGVJRCcsCiAgICAgICAgRGF0YSA9PiAkV29ya09yZGVyVHlwZUxpc3QsCiAgICApOwoKICAgICMgc2hvdyBibG9jayB3aXRoIFdvcmtPcmRlclR5cGUgZHJvcGRvd24KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVHlwZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFR5cGVTdHJnID0+ICRXb3JrT3JkZXJUeXBlRHJvcERvd24sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBjb25maWcgYW5kIGZpbGx1cCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICAjIGZyb20gZGVmYXVsdHMgKGlmIGNvbmZpZ3VyZWQpCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRDb25maWc7CiAgICBOVU1CRVI6CiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoV29ya09yZGVyRnJlZUtleSBXb3JrT3JkZXJGcmVlVGV4dCkpIHsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHRzIGZvciB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIGlmIHBhZ2UgaXMgbG9hZGVkIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRQYXJhbXsgJFR5cGUgLiAkTnVtYmVyIH0KICAgICAgICAgICAgICAgICAgICB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRUeXBlIC4gJE51bWJlciAuICc6OkRlZmF1bHRTZWxlY3Rpb24nICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZwogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRUeXBlIC4gJE51bWJlciApOwoKICAgICAgICAgICAgbmV4dCBUWVBFIGlmICEkQ29uZmlnOwogICAgICAgICAgICBuZXh0IFRZUEUgaWYgcmVmICRDb25maWcgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgd29ya29yZGVyIGZyZWV0ZXh0IGNvbmZpZwogICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRDb25maWd7ICRUeXBlIC4gJE51bWJlciB9ID0gJENvbmZpZzsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0aGUgd29ya29yZGVyIGZyZWV0ZXh0IEhUTUwKICAgIG15ICVXb3JrT3JkZXJGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRnJlZVRleHRIVE1MKAogICAgICAgIENvbmZpZyAgICAgICAgICAgICAgICAgICA9PiBcJVdvcmtPcmRlckZyZWVUZXh0Q29uZmlnLAogICAgICAgIFdvcmtPcmRlckRhdGEgICAgICAgICAgICA9PiBcJVdvcmtPcmRlckZyZWVUZXh0UGFyYW0sCiAgICAgICAgQ29uZmlndXJlZEZyZWVUZXh0RmllbGRzID0+IFxAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzLAogICAgKTsKCiAgICAjIHNob3cgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgbXkgJFdvcmtPcmRlckZyZWVUZXh0U2hvd247CiAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgZnJlZXRleHQgZmllbGQgc2hvdWxkIGJlIHNob3duIGluIHRoaXMgZnJvbnRlbmQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9ICkgewoKICAgICAgICAgICAgIyByZW1lbWJlciB0aGF0IGF0IGxlYXN0IG9uZSBmcmVldGV4dCBmaWVsZCBpcyBzaG93bgogICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRTaG93biA9IDE7CgogICAgICAgICAgICAjIHNob3cgc2luZ2xlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlV29ya09yZGVyRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyB3b3Jrb3JkZXIgZnJlZXRleHQgdmFsaWRhdGlvbiBlcnJvciBmb3Igc2luZ2xlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZAogICAgICAgICAgICBpZiAoICRXb3JrT3JkZXJGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnN7JE51bWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludmFsaWRXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlV29ya09yZGVyRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYWxsIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXlGaWVsZCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRIVE1MeyAnV29ya09yZGVyRnJlZUtleUZpZWxkJyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dEZpZWxkID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dEhUTUx7ICdXb3JrT3JkZXJGcmVlVGV4dEZpZWxkJyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgYWxsIHdvcmtvcmRlciBmcmVldGV4dCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICBpZiAoICRXb3JrT3JkZXJGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnN7JE51bWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludmFsaWRXb3JrT3JkZXJGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVXb3JrT3JkZXJGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHNwYWNlIGFmdGVyIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgIGlmICgkV29ya09yZGVyRnJlZVRleHRTaG93bikgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dFNwYWNlcicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHdvcmtvcmRlciBmcmVldGV4dCBqYXZhIHNjcmlwdCBjaGVjawogICAgTlVNQkVSOgogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgbmV4dCBOVU1CRVIgaWYgISRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9OwoKICAgICAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCB3b3Jrb3JkZXIgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5RmllbGQgID0+ICdXb3JrT3JkZXJGcmVlS2V5JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHRGaWVsZCA9PiAnV29ya09yZGVyRnJlZVRleHQnIC4gJE51bWJlciwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHRoZSB0aW1lIHNlbGVjdGlvbnMKICAgIGZvciBteSAkVGltZVR5cGUgKHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUpKSB7CgogICAgICAgICMgc2V0IGRlZmF1bHQgdmFsdWUgZm9yICREaWZmVGltZQogICAgICAgICMgV2hlbiBubyB0aW1lIGlzIGdpdmVuIHlldCwgdGhlbiB1c2UgdGhlIGN1cnJlbnQgdGltZSBwbHVzIHRoZSBkaWZmdGltZQogICAgICAgICMgV2hlbiBhbiBleHBsaWNpdCB0aW1lIHdhcyByZXRyaWV2ZWQsICREaWZmVGltZSBpcyBub3QgdXNlZAogICAgICAgIG15ICREaWZmVGltZSA9ICRUaW1lVHlwZSBlcSAnUGxhbm5lZFN0YXJ0VGltZScgPyAwIDogNjAgKiA2MDsKCiAgICAgICAgIyBhZGQgc2VsZWN0aW9uIGZvciB0aGUgdGltZQogICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1N0cmluZycgfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgUHJlZml4ICAgPT4gJFRpbWVUeXBlLAogICAgICAgICAgICBEaWZmVGltZSA9PiAkRGlmZlRpbWUsCiAgICAgICAgICAgICVUaW1lUGVyaW9kLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHBsYW5uZWQgZWZmb3J0IGlmIGl0IGlzIGNvbmZpZ3VyZWQKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UGxhbm5lZEVmZm9ydH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2hvd1BsYW5uZWRFZmZvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgPT4gJEdldFBhcmFte1BsYW5uZWRFZmZvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgdGhlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMKICAgIGZvciBteSAkQmxvY2tOYW1lIChAVmFsaWRhdGlvbkVycm9ycykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJEJsb2NrTmFtZSApOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNV29ya09yZGVyQWRkJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckFnZW50LnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgd29ya29yZGVyIGFnZW50IGVkaXQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJBZ2VudC5wbSx2IDEuMzcgMjAxMC8wMi8wNSAxODozNToxNCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVdvcmtPcmRlckFnZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjM3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBHcm91cE9iamVjdCBDb25maWdPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBXb3JrT3JkZXJJRAogICAgbXkgJFdvcmtPcmRlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnV29ya09yZGVySUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRXb3JrT3JkZXJJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zIG9uIHRoZSBjaGFuZ2UhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgIyBFeHBhbmRVc2VyTmFtZTE6IGZpbmQgb3V0IHdoZXRoZXIgJ1NlYXJjaCBVc2VyJyB3YXMgY2xpY2tlZAogICAgIyBFeHBhbmRVc2VyTmFtZTI6IGZpbmQgb3V0IHdoZXRoZXIgJ1Rha2UgdGhpcyBVc2VyJyB3YXMgY2xpY2tlZAogICAgIyBDbGVhclVzZXI6IGZpbmQgb3V0IHdoZXRoZXIgJ0NsZWFyIFVzZXInIHdhcyBjbGlja2VkCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoVXNlciBFeHBhbmRVc2VyTmFtZTEgRXhwYW5kVXNlck5hbWUyIFNlbGVjdGVkVXNlciBDbGVhclVzZXIpKSB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyAkRG9Ob3RTYXZlIGltcGxpZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgbm90IGJlIHNhdmVkIGFzIHdvcmtvcmRlciBhZ2VudAogICAgbXkgJERvTm90U2F2ZSA9ICRHZXRQYXJhbXtFeHBhbmRVc2VyTmFtZTF9CiAgICAgICAgfHwgJEdldFBhcmFte0V4cGFuZFVzZXJOYW1lMn0KICAgICAgICB8fCAkR2V0UGFyYW17Q2xlYXJVc2VyfQogICAgICAgIHx8IDA7CgogICAgIyBoYW5kbGUgdGhlICdTYXZlJyBzdWJhY3Rpb24KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyB3b3Jrb3JkZXIgYWdlbnQgaXMgZW1wdHkgYW5kIG5vIGJ1dHRvbiBidXQgdGhlICdTYXZlJyBidXR0b24gaXMgY2xpY2tlZAogICAgICAgIGlmICggISRHZXRQYXJhbXtVc2VyfSAmJiAhJERvTm90U2F2ZSApIHsKCiAgICAgICAgICAgICMgc2V0dGluZyB3b3Jrb3JkZXIgYWdlbnQgdG8gZW1wdHkKICAgICAgICAgICAgbXkgJENvdWxkVXBkYXRlV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEID0+IHVuZGVmLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJENvdWxkVXBkYXRlV29ya09yZGVyKSB7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIG1hc2sKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+ICRTZWxmLT57TGFzdFdvcmtPcmRlclZpZXd9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAiV2FzIG5vdCBhYmxlIHRvIHNldCB0aGUgd29ya29yZGVyIGFnZW50IG9mIHRoZSB3b3Jrb3JkZXIgJyRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0nIHRvIGVtcHR5ISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgd29ya29yZGVyIGFnZW50IGlzIHNlbGVjdGVkIGFuZCBubyBidXR0b24gYnV0IHRoZSAnU2F2ZScgYnV0dG9uIGlzIGNsaWNrZWQKICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtTZWxlY3RlZFVzZXJ9ICYmICEkRG9Ob3RTYXZlICkgewoKICAgICAgICAgICAgIyB3b3Jrb3JkZXIgYWdlbnQgaXMgcmVxdWlyZWQgZm9yIGFuIHVwZGF0ZQogICAgICAgICAgICBteSAlRXJyb3JBbGxSZXF1aXJlZCA9ICRTZWxmLT5fQ2hlY2tXb3JrT3JkZXJBZ2VudCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgIyBpZiBldmVyeXRoaW5nIGlzIGZpbmUKICAgICAgICAgICAgaWYgKCAhJUVycm9yQWxsUmVxdWlyZWQgKSB7CgogICAgICAgICAgICAgICAgbXkgJENvdWxkVXBkYXRlV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgICA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SUQgPT4gJEdldFBhcmFte1NlbGVjdGVkVXNlcn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICgkQ291bGRVcGRhdGVXb3JrT3JkZXIpIHsKCiAgICAgICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIG1hc2sKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tJldvcmtPcmRlcklEPSRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcyBub3QgYWJsZSB0byB1cGRhdGUgdGhlIHdvcmtvcmRlciAnJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSchIiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICggJEVycm9yQWxsUmVxdWlyZWR7VXNlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52YWxpZFVzZXInLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFte1NlbGVjdGVkVXNlcn0gJiYgISREb05vdFNhdmUgKSB7CgogICAgICAgICAgICAjIGlmIG5vIHVzZXIgaXMgZ2l2ZW4gYW5kIGl0IGlzIGNsaWNrZWQgJ1NhdmUnCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkVXNlcicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG9uZSBvZiB0aGUgYnV0dG9ucyAndGFrZSB0aGlzIHVzZXInLCAnc2VhcmNoIHVzZXInLCAnY2xlYXIgdXNlcicgaXMgY2xpY2tlZAogICAgICAgIGVsc2lmICgkRG9Ob3RTYXZlKSB7CgogICAgICAgICAgICAjIGlmICdzZWFyY2ggdXNlcicgaXMgY2xpY2tlZAogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmRVc2VyTmFtZTF9ICkgewoKICAgICAgICAgICAgICAgICMgc2VhcmNoIGFnZW50cwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXInICkgLiAnKic7CiAgICAgICAgICAgICAgICBteSAlVXNlckZvdW5kID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlclNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBVc2VyU2VhcmNoKCkgcmV0dXJucyB2YWx1ZXMgd2l0aCBhIHRyYWlsaW5nIHNwYWNlLCBnZXQgcmlkIG9mIGl0CiAgICAgICAgICAgICAgICBmb3IgbXkgJE5hbWUgKCB2YWx1ZXMgJVVzZXJGb3VuZCApIHsKICAgICAgICAgICAgICAgICAgICAkTmFtZSA9fiBzeyBccysgXHogfXt9eG1zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGdyb3VwIG9mIGdyb3VwIGl0c20tY2hhbmdlCiAgICAgICAgICAgICAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAnaXRzbS1jaGFuZ2UnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBtZW1iZXJzIG9mIGdyb3VwCiAgICAgICAgICAgICAgICBteSAlSVRTTUNoYW5nZVVzZXJzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZmlsdGVyIHRoZSBpdHNtLWNoYW5nZSB1c2VycyBpbiBmb3VuZCB1c2VycwogICAgICAgICAgICAgICAgbXkgJUZpbHRlcmVkVXNlckxpc3Q7CiAgICAgICAgICAgICAgICBDSEFOR0VVU0VSSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJENoYW5nZVVzZXJJRCAoIGtleXMgJUlUU01DaGFuZ2VVc2VycyApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IENIQU5HRVVTRVJJRCBpZiAhJFVzZXJGb3VuZHskQ2hhbmdlVXNlcklEfTsKCiAgICAgICAgICAgICAgICAgICAgJEZpbHRlcmVkVXNlckxpc3R7JENoYW5nZVVzZXJJRH0gPSAkVXNlckZvdW5keyRDaGFuZ2VVc2VySUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgICAgICMgaWYganVzdCBvbmUsIGZpbGx1cCBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICAgICAgbXkgQEtleXNVc2VyTGlzdCA9IGtleXMgJUZpbHRlcmVkVXNlckxpc3Q7CiAgICAgICAgICAgICAgICBpZiAoIHNjYWxhciBAS2V5c1VzZXJMaXN0ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VzZXJ9ID0gJEZpbHRlcmVkVXNlckxpc3R7ICRLZXlzVXNlckxpc3RbMF0gfTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkS2V5c1VzZXJMaXN0WzBdLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJFVzZXJEYXRhe1VzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaWYgbW9yZSB0aGUgb25lIHVzZXIgZXhpc3RzLCBzaG93IGxpc3QKICAgICAgICAgICAgICAgICMgYW5kIGNsZWFuIFVzZXJJRAogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVc2VySUR9ID0gJyc7CgogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlRmlsdGVyZWRVc2VyTGlzdCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUYWtlVXNlcicsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjbGVhciB0byBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgICAgIGlmICggISVGaWx0ZXJlZFVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VXNlcn0gICA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17VXNlcklEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyAndGFrZSB0aGlzIHVzZXInIGJ1dHRvbiBpcyBjbGlja2VkCiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte0V4cGFuZFVzZXJOYW1lMn0gKSB7CgogICAgICAgICAgICAgICAgIyBzaG93IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXJJRCcgKTsKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFuIGFwcHJvcHJpYXRlIHVzZXIgaXMgZm91bmQgZmlsbCB0aGUgdGV4dGZpZWxkCiAgICAgICAgICAgICAgICBpZiAoJVVzZXJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyfSAgID0gc3ByaW50ZiAnIiVzICVzIiA8JXM+JywKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGN1cnJlbnQgd29ya29yZGVyIGFnZW50CiAgICBpZiAoICEkRG9Ob3RTYXZlICYmICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSApIHsKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17VXNlcklEfSA9ICRVc2VyRGF0YXtVc2VySUR9OwogICAgICAgICRQYXJhbXtVc2VyfSAgID0gc3ByaW50ZiAnIiVzICVzIiA8JXM+JywKICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAkVXNlckRhdGF7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHRoYXQgd29ya29yZGVyIGJlbG9uZ3MgdG8KICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB3aGV0aGVyIGNoYW5nZSB3YXMgZm91bmQKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBmaW5kIENoYW5nZSBmb3IgV29ya09yZGVyICRXb3JrT3JkZXJJRCEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgdXNlciBzZWFyY2ggYXV0b2NvbXBsZXRlIGZpZWxkCiAgICBteSAkQXV0b0NvbXBsZXRlQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlVzZXJTZWFyY2hBdXRvQ29tcGxldGUnKTsKCiAgICAjIGlmIGF1dG9jb21wbGV0aW9uIGlzIHR1cm5lZCBvbgogICAgaWYgKCAkQXV0b0NvbXBsZXRlQ29uZmlnLT57QWN0aXZlfSApIHsKCiAgICAgICAgIyBzaG93IGphdmFzY3JpcHQgcGFydHMgZm9yIGF1dG9jb21wbGV0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXNlclNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVc2VyU2VhcmNoQXV0b0NvbXBsZXRlQ29kZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgbWluUXVlcnlMZW5ndGggICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWluUXVlcnlMZW5ndGh9ICAgICAgfHwgMiwKICAgICAgICAgICAgICAgIHF1ZXJ5RGVsYXkgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1F1ZXJ5RGVsYXl9ICAgICAgICAgIHx8IDAuMSwKICAgICAgICAgICAgICAgIHR5cGVBaGVhZCAgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1R5cGVBaGVhZH0gICAgICAgICAgIHx8ICdmYWxzZScsCiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzRGlzcGxheWVkID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNYXhSZXN1bHRzRGlzcGxheWVkfSB8fCAyMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJTZWFyY2hBdXRvQ29tcGxldGVSZXR1cm5FbGVtZW50cycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGh0bWwgcGFydCBmb3IgYXV0b2NvbXBsZXRpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVc2VyU2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXNlclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHNob3cgYnV0dG9ucyB3aGVuIGF1dG9jb21wbGV0aW9uIGlzIHR1cm5lZCBvZmYKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hVc2VyQnV0dG9uJywKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJUaXRsZX0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlckFnZW50JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfQ2hlY2tXb3JrT3JkZXJBZ2VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaGFzaCBmb3IgZXJyb3IgaW5mbwogICAgbXkgJUVycm9yczsKCiAgICAjIGNoZWNrIHdvcmtvcmRlciBhZ2VudAogICAgaWYgKCAhJFBhcmFte1VzZXJ9IHx8ICEkUGFyYW17U2VsZWN0ZWRVc2VyfSApIHsKICAgICAgICAkRXJyb3Jze1VzZXJ9ID0gMTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgYWdlbnQgZGF0YQogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17U2VsZWN0ZWRVc2VyfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3IgaWYgdXNlciBub3QgZXhpc3RzCiAgICAgICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgICAgICRFcnJvcnN7VXNlcn0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY29tcGFyZSBpbnB1dCB2YWx1ZSB3aXRoIHVzZXIgZGF0YQogICAgICAgICAgICBteSAkQ2hlY2tTdHJpbmcgPSBzcHJpbnRmICciJXMgJXMiIDwlcz4nLAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckVtYWlsfTsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvcgogICAgICAgICAgICBpZiAoICRDaGVja1N0cmluZyBuZSAkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3Jze1VzZXJ9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUVycm9ycwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckRlbGV0ZS5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IHdvcmtvcmRlciBkZWxldGUgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUucG0sdiAxLjEwIDIwMTAvMDIvMDIgMTQ6NTE6NDIgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNV29ya09yZGVyRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTAgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBXb3JrT3JkZXJJRAogICAgbXkgJFdvcmtPcmRlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnV29ya09yZGVySUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRXb3JrT3JkZXJJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB3b3Jrb3JkZXIgZGVsZXRlIG1hc2sKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyBvbiB0aGUgY2hhbmdlISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnV29ya09yZGVyRGVsZXRlJyApIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIHdvcmtvcmRlcgogICAgICAgIG15ICRDb3VsZERlbGV0ZVdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyRGVsZXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRDb3VsZERlbGV0ZVdvcmtPcmRlcikgewoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBjaGFuZ2UsIHdoZW4gdGhlIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tJkNoYW5nZUlEPSRXb3JrT3JkZXItPntDaGFuZ2VJRH0iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlLCB3aGVuIGRlbGV0ZSBmYWlsZWQKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJXYXMgbm90IGFibGUgdG8gZGVsZXRlIHRoZSB3b3Jrb3JkZXIgJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSEiLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB0aGF0IHdvcmtvcmRlciBiZWxvbmdzIHRvCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgY2hhbmdlIGlzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgZmluZCBDaGFuZ2UgZm9yIFdvcmtPcmRlciAkV29ya09yZGVySUQhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAnRGVsZXRlJywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2V0IGFmZmVjdGVkIGNvbmRpdGlvbiBpZHMKICAgIG15ICRBZmZlY3RlZENvbmRpdGlvbklEcyA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uTGlzdEJ5T2JqZWN0VHlwZSgKICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBTZWxlY3RvciAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgQ2hhbmdlSUQgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKSB8fCBbXTsKCiAgICAjIGRpc3BsYXkgbGlzdCBvZiBhZmZlY3RlZCBjb25kaXRpb25zCiAgICBpZiAoIEB7JEFmZmVjdGVkQ29uZGl0aW9uSURzfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJJbkNvbmRpdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgQ09ORElUSU9OSUQ6CiAgICAgICAgZm9yIG15ICRDb25kaXRpb25JRCAoIEB7JEFmZmVjdGVkQ29uZGl0aW9uSURzfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmRpdGlvbgogICAgICAgICAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25HZXQoCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgICAgICAgICBuZXh0IENPTkRJVElPTklEIGlmICEkQ29uZGl0aW9uOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckluQ29uZGl0aW9uUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JENvbmRpdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb1dvcmtPcmRlckluQ29uZGl0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiAkV29ya09yZGVyLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJEZWxldGUnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckVkaXQucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCB3b3Jrb3JkZXIgZWRpdCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckVkaXQucG0sdiAxLjQ3IDIwMTAvMDYvMjkgMTM6NDg6MDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQ3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZAogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1dvcmtPcmRlcklEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIExheW91dE9iamVjdCBoYXMgVHJhbnNsYXRpb25PYmplY3QKICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9ICkgewoKICAgICAgICAjIHRyYW5zbGF0ZSB3b3Jrb3JkZXIgdHlwZQogICAgICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJUeXBlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAkV29ya09yZGVyLT57V29ya09yZGVyVHlwZX0KICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zIG9uIHRoZSBjaGFuZ2UhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKAogICAgICAgIHF3KAogICAgICAgIFdvcmtPcmRlclRpdGxlIEluc3RydWN0aW9uCiAgICAgICAgUGxhbm5lZEVmZm9ydAogICAgICAgIFNhdmVBdHRhY2htZW50IEZpbGVJRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlndXJlZCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGQgbnVtYmVycwogICAgbXkgQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcwogICAgICAgID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXRDb25maWd1cmVkRnJlZVRleHRGaWVsZHMoKTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgZnJlZXRleHQgcGFyYW1zCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRQYXJhbTsKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgICMgY29uc2lkZXIgb25seSBmcmVldGV4dCBmaWVsZHMgd2hpY2ggYXJlIGFjdGl2YXRlZCBpbiB0aGlzIGZyb250ZW5kCiAgICAgICAgbmV4dCBOVU1CRVIgaWYgISRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9OwoKICAgICAgICBteSAkS2V5ICAgPSAnV29ya09yZGVyRnJlZUtleScgLiAkTnVtYmVyOwogICAgICAgIG15ICRWYWx1ZSA9ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyOwoKICAgICAgICAkV29ya09yZGVyRnJlZVRleHRQYXJhbXskS2V5fSAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0UGFyYW17JFZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFZhbHVlICk7CiAgICB9CgogICAgIyBzdG9yZSB0aW1lIHJlbGF0ZWQgZmllbGRzIGluICVHZXRQYXJhbQogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSkpIHsKICAgICAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbXkgJFBhcmFtTmFtZSA9ICRUaW1lVHlwZSAuICRUaW1lUGFydDsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgYXR0YWNobWVudCB1cGxvYWQgaXMgcmVxdWVzdGVkCiAgICBpZiAoICRHZXRQYXJhbXtTYXZlQXR0YWNobWVudH0gKSB7CiAgICAgICAgJFNlbGYtPntTdWJhY3Rpb259ID0gJ1NhdmVBdHRhY2htZW50JzsKICAgIH0KCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSAlQXR0YWNobWVudHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICk7CgogICAgIyBjaGVjayBpZiBhdHRhY2htZW50IHNob3VsZCBiZSBkZWxldGVkCiAgICBmb3IgbXkgJEF0dGFjaG1lbnRJRCAoIGtleXMgJUF0dGFjaG1lbnRzICkgewogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVsZXRlQXR0YWNobWVudCcgLiAkQXR0YWNobWVudElEICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICdEZWxldGVBdHRhY2htZW50JzsKICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBzYXZpbmcgd2FzIG5vdCBhdHRlbXB0ZWQuCiAgICAjIFRoZSBpdGVtcyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBkdGwgdmFsaWRhdGlvbiBlcnJvciBibG9ja3MuCiAgICBteSBAVmFsaWRhdGlvbkVycm9yczsKCiAgICAjIHJlbWVtYmVyIHRoZSBudW1iZXJzIG9mIHRoZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIHdpdGggdmFsaWRhdGlvbiBlcnJvcnMKICAgIG15ICVXb3JrT3JkZXJGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnM7CgogICAgIyB1cGRhdGUgd29ya29yZGVyCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CgogICAgICAgICMgdXBkYXRlIG9ubHkgaWYgV29ya09yZGVyVGl0bGUgaXMgZ2l2ZW4KICAgICAgICBpZiAoICEkR2V0UGFyYW17V29ya09yZGVyVGl0bGV9ICkgewogICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnSW52YWxpZFRpdGxlJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgd2hldGhlciBjb21wbGV0ZSB0aW1lcyBhcmUgcGFzc2VkIGFuZCBidWlsZCB0aGUgdGltZSBzdGFtcHMKICAgICAgICBteSAlU3lzdGVtVGltZTsKICAgICAgICBUSU1FVFlQRToKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKSkgewogICAgICAgICAgICBmb3IgbXkgJFRpbWVQYXJ0IChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIG15ICRQYXJhbU5hbWUgPSAkVGltZVR5cGUgLiAkVGltZVBhcnQ7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXskUGFyYW1OYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtTmFtZSEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBUSU1FVFlQRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmb3JtYXQgYXMgdGltZXN0YW1wCiAgICAgICAgICAgICRHZXRQYXJhbXskVGltZVR5cGV9ID0gc3ByaW50ZiAnJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwJywKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1llYXInIH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0RheScgfSwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0hvdXInIH0sCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNaW51dGUnIH07CgogICAgICAgICAgICAjIHNhbml0eSBjaGVjayB0aGUgYXNzZW1ibGVkIHRpbWVzdGFtcAogICAgICAgICAgICAkU3lzdGVtVGltZXskVGltZVR5cGV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFteyRUaW1lVHlwZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGlmIHRpbWUgZm9ybWF0IGlzIGludmFsaWQKICAgICAgICAgICAgaWYgKCAhJFN5c3RlbVRpbWV7JFRpbWVUeXBlfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICJJbnZhbGlkJFRpbWVUeXBlIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgb3JkZXJpbmcgb2YgdGhlIHRpbWVzCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU3lzdGVtVGltZXtQbGFubmVkU3RhcnRUaW1lfQogICAgICAgICAgICAmJiAkU3lzdGVtVGltZXtQbGFubmVkRW5kVGltZX0KICAgICAgICAgICAgJiYgJFN5c3RlbVRpbWV7UGxhbm5lZFN0YXJ0VGltZX0gPj0gJFN5c3RlbVRpbWV7UGxhbm5lZEVuZFRpbWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkUGxhbm5lZEVuZFRpbWUnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3JtYXQgb2YgcGxhbm5lZCBlZmZvcnQsIGVtcHR5IGlzIGFsbG93ZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtQbGFubmVkRWZmb3J0fSAhfiBteyBcQSBcZCogKD86IFsuXSBcZHsxLDJ9ICk/IFx6IH14bXMgKSB7CiAgICAgICAgICAgIHB1c2ggQFZhbGlkYXRpb25FcnJvcnMsICdJbnZhbGlkUGxhbm5lZEVmZm9ydCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciByZXF1aXJlZCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9CiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0tPnskTnVtYmVyfSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkV29ya09yZGVyRnJlZVRleHRQYXJhbXsgJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXIgfSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0aGUgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkIG51bWJlciB3aXRoIHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgYWxsIHBhc3NlZCBkYXRhIGlzIHZhbGlkCiAgICAgICAgaWYgKCAhQFZhbGlkYXRpb25FcnJvcnMgJiYgISVXb3JrT3JkZXJGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnMgKSB7CiAgICAgICAgICAgIG15ICRDb3VsZFVwZGF0ZVdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgICA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAkR2V0UGFyYW17V29ya09yZGVyVGl0bGV9LAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICA9PiAkR2V0UGFyYW17SW5zdHJ1Y3Rpb259LAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAkR2V0UGFyYW17UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICRHZXRQYXJhbXtQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkRWZmb3J0ICAgID0+ICRHZXRQYXJhbXtQbGFubmVkRWZmb3J0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgJVdvcmtPcmRlckZyZWVUZXh0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJENvdWxkVXBkYXRlV29ya09yZGVyKSB7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIG1hc2ssIHdoZW4gdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAkU2VsZi0+e0xhc3RXb3JrT3JkZXJWaWV3fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UsIHdoZW4gdXBkYXRlIGZhaWxlZAogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiV2FzIG5vdCBhYmxlIHRvIHVwZGF0ZSBXb3JrT3JkZXIgJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBhdHRhY2htZW50IGFjdGlvbnMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlQXR0YWNobWVudCcgKSB7CgogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAiQXR0YWNobWVudE5ldyIsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpbGUgd2FzIGFscmVhZHkgdXBsb2FkZWQKICAgICAgICBteSAkRmlsZUFscmVhZHlVcGxvYWRlZCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudEV4aXN0cygKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJFVwbG9hZFN0dWZme0ZpbGVuYW1lfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB3cml0ZSB0byB2aXJ0dWFsIGZzCiAgICAgICAgaWYgKCAkVXBsb2FkU3R1ZmZ7RmlsZW5hbWV9ICYmICEkRmlsZUFscmVhZHlVcGxvYWRlZCApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBWYWxpZGF0aW9uRXJyb3JzLCAnRmlsZUFscmVhZHlVcGxvYWRlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVsb2FkIGF0dGFjaG1lbnQgbGlzdAogICAgICAgICAgICAlQXR0YWNobWVudHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ZpbGVBbHJlYWR5VXBsb2FkZWQnOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGVBdHRhY2htZW50JyApIHsKCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50SUQgKCBrZXlzICVBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZWxldGVBdHRhY2htZW50JyAuICRBdHRhY2htZW50SUQgKSApIHsKCiAgICAgICAgICAgICAgICAjIGRlbGV0ZSBhdHRhY2htZW50CiAgICAgICAgICAgICAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEICAgICAgPT4gJEF0dGFjaG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVsb2FkIGF0dGFjaG1lbnQgbGlzdAogICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50TGlzdCgKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICdEZWxldGVBdHRhY2htZW50JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBhdHRhY2htZW50IGRvd25sb2FkcwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkQXR0YWNobWVudCcgKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZm9yIGF0dGFjaG1lbnQKICAgICAgICBteSAkQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnRHZXQoCiAgICAgICAgICAgIEZpbGVJRCA9PiAkR2V0UGFyYW17RmlsZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICAgICAgaWYgKCAhJEF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgKCRHZXRQYXJhbXtGaWxlSUR9KSEgTWF5IGJlIGFuIGF0dGFjayEhISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgJXskQXR0YWNobWVudERhdGF9LAogICAgICAgICAgICBUeXBlID0+ICdhdHRhY2htZW50JywKICAgICAgICApOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGRlbGV0ZSBhbGwga2V5cyBmcm9tIEdldFBhcmFtIHdoZW4gaXQgaXMgbm8gU3ViYWN0aW9uCiAgICAgICAgJUdldFBhcmFtID0gKCk7CgogICAgICAgICMgYWxzbyByZXNldCB0aGUgdGltZSBmaWVsZHMKICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKSkgewoKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyLT57JFRpbWVUeXBlfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBwbGFubmVkIHN0YXJ0IHRpbWUgZnJvbSB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRXb3JrT3JkZXItPnskVGltZVR5cGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgcGFyYW1ldGVyIGhhc2ggZm9yIEJ1aWxkRGF0ZVNlbGVjdGlvbigpCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTWludXRlJyB9ID0gJE1pbnV0ZTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ01vbnRoJyB9ICA9ICRNb250aDsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSB0aGF0IHdvcmtvcmRlciBiZWxvbmdzIHRvCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgd2hldGhlciBjaGFuZ2Ugd2FzIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgZmluZCBDaGFuZ2UgZm9yIFdvcmtPcmRlciAkV29ya09yZGVySUQhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAkV29ya09yZGVyLT57V29ya09yZGVyVGl0bGV9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBjb25maWcgYW5kIGZpbGx1cCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIGZyb20gd29ya29yZGVyIGRhdGEKICAgIG15ICVXb3JrT3JkZXJGcmVlVGV4dENvbmZpZzsKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhXb3JrT3JkZXJGcmVlS2V5IFdvcmtPcmRlckZyZWVUZXh0KSkgewoKICAgICAgICAgICAgIyBnZXQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIHdvcmtvcmRlciBpZiBwYWdlIGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0UGFyYW17ICRUeXBlIC4gJE51bWJlciB9IHx8PSAkV29ya09yZGVyLT57ICRUeXBlIC4gJE51bWJlciB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBjb25maWcKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAkVHlwZSAuICROdW1iZXIgKTsKCiAgICAgICAgICAgIG5leHQgVFlQRSBpZiAhJENvbmZpZzsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIHJlZiAkQ29uZmlnIG5lICdIQVNIJzsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBjb25maWcKICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0Q29uZmlneyAkVHlwZSAuICROdW1iZXIgfSA9ICRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBIVE1MCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEZyZWVUZXh0SFRNTCgKICAgICAgICBDb25maWcgICAgICAgICAgICAgICAgICAgPT4gXCVXb3JrT3JkZXJGcmVlVGV4dENvbmZpZywKICAgICAgICBXb3JrT3JkZXJEYXRhICAgICAgICAgICAgPT4gXCVXb3JrT3JkZXJGcmVlVGV4dFBhcmFtLAogICAgICAgIENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcyA9PiBcQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcywKICAgICk7CgogICAgIyBzaG93IHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgIG15ICRXb3JrT3JkZXJGcmVlVGV4dFNob3duOwogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIGZyZWV0ZXh0IGZpZWxkIHNob3VsZCBiZSBzaG93biBpbiB0aGlzIGZyb250ZW5kCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0tPnskTnVtYmVyfSApIHsKCiAgICAgICAgICAgICMgcmVtZW1iZXIgdGhhdCBhdCBsZWFzdCBvbmUgZnJlZXRleHQgZmllbGQgaXMgc2hvd24KICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0U2hvd24gPSAxOwoKICAgICAgICAgICAgIyBzaG93IHNpbmdsZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVdvcmtPcmRlckZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgd29ya29yZGVyIGZyZWV0ZXh0IHZhbGlkYXRpb24gZXJyb3IgZm9yIHNpbmdsZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGQKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkV29ya09yZGVyRnJlZVRleHQnIC4gJE51bWJlciwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVdvcmtPcmRlckZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFsbCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5RmllbGQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0SFRNTHsgJ1dvcmtPcmRlckZyZWVLZXlGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHRGaWVsZCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRIVE1MeyAnV29ya09yZGVyRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGFsbCB3b3Jrb3JkZXIgZnJlZXRleHQgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkV29ya09yZGVyRnJlZVRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlV29ya09yZGVyRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBzcGFjZSBhZnRlciB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICBpZiAoJFdvcmtPcmRlckZyZWVUZXh0U2hvd24pIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyRnJlZVRleHRTcGFjZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCB3b3Jrb3JkZXIgZnJlZXRleHQgamF2YSBzY3JpcHQgY2hlY2sKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgIG5leHQgTlVNQkVSIGlmICEkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0tPnskTnVtYmVyfTsKCiAgICAgICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgd29ya29yZGVyIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleUZpZWxkICA9PiAnV29ya09yZGVyRnJlZUtleScgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0RmllbGQgPT4gJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpbWUgcGVyaW9kIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhlIEdVSQogICAgbXkgJVRpbWVQZXJpb2QgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGltZVBlcmlvZCcpIH07CgogICAgIyBzZXQgdGhlIHRpbWUgc2VsZWN0aW9ucwogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSkpIHsKCiAgICAgICAgIyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgJERpZmZUaW1lCiAgICAgICAgIyBXaGVuIG5vIHRpbWUgaXMgZ2l2ZW4geWV0LCB0aGVuIHVzZSB0aGUgY3VycmVudCB0aW1lIHBsdXMgdGhlIGRpZmZ0aW1lCiAgICAgICAgIyBXaGVuIGFuIGV4cGxpY2l0IHRpbWUgd2FzIHJldHJpZXZlZCwgJERpZmZUaW1lIGlzIG5vdCB1c2VkCiAgICAgICAgbXkgJERpZmZUaW1lID0gJFRpbWVUeXBlIGVxICdQbGFubmVkU3RhcnRUaW1lJyA/IDAgOiA2MCAqIDYwOwoKICAgICAgICAjIGFkZCBzZWxlY3Rpb24gZm9yIHRoZSB0aW1lCiAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnU3RyaW5nJyB9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBQcmVmaXggICA9PiAkVGltZVR5cGUsCiAgICAgICAgICAgIERpZmZUaW1lID0+ICREaWZmVGltZSwKICAgICAgICAgICAgJVRpbWVQZXJpb2QsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcGxhbm5lZCBlZmZvcnQgaWYgaXQgaXMgY29uZmlndXJlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQbGFubmVkRWZmb3J0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93UGxhbm5lZEVmZm9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIHRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzCiAgICBmb3IgbXkgJEJsb2NrTmFtZSAoQFZhbGlkYXRpb25FcnJvcnMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICRCbG9ja05hbWUgKTsKICAgIH0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIGZvciBteSAkQXR0YWNobWVudElEICgga2V5cyAlQXR0YWNobWVudHMgKSB7CgogICAgICAgICMgZ2V0IGluZm8gYWJvdXQgZmlsZQogICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudEdldCgKICAgICAgICAgICAgRmlsZUlEID0+ICRBdHRhY2htZW50SUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnREYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNV29ya09yZGVyRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckhpc3RvcnkucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCB3b3Jrb3JkZXIgaGlzdG9yeSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckhpc3RvcnkucG0sdiAxLjIxIDIwMTAvMDEvMjggMTM6NDU6MzUgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3Rvcnk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnktPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscy0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgd29ya29yZGVyIGlkCiAgICBteSAkV29ya09yZGVySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdXb3JrT3JkZXJJRCcgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3Qgc2hvdyBoaXN0b3J5LCBhcyBubyBXb3JrT3JkZXJJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIGluZm9ybWF0aW9uCiAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFdvcmtPcmRlciApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiV29ya09yZGVyICckV29ya09yZGVySUQnIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBpbmZvcm1hdGlvbgogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDaGFuZ2UgJyRXb3JrT3JkZXItPntDaGFuZ2VJRH0nIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgU3RvcmUgTGFzdFNjcmVlbkhpc3RvcnksIGZvciBiYWNrbGlua3MgaW4gSGlzdG9yeVpvb20KICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbkhpc3RvcnknLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgZ2V0IGhpc3RvcnkgZW50cmllcwogICAgbXkgJEhpc3RvcnlFbnRyaWVzUmVmID0gJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+V29ya09yZGVySGlzdG9yeUdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKSB8fCBbXTsKCiAgICAjIGdldCBvcmRlciBkaXJlY3Rpb24KICAgIG15IEBIaXN0b3J5TGluZXMgPSBAeyRIaXN0b3J5RW50cmllc1JlZn07CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6SGlzdG9yeU9yZGVyJykgZXEgJ3JldmVyc2UnICkgewogICAgICAgIEBIaXN0b3J5TGluZXMgPSByZXZlcnNlIEB7JEhpc3RvcnlFbnRyaWVzUmVmfTsKICAgIH0KCiAgICAjIG1heCBsZW5ndGggb2Ygc3RyaW5ncwogICAgbXkgJE1heExlbmd0aCA9IDMwOwoKICAgICMgY3JlYXRlIHRhYmxlCiAgICBteSAkQ291bnRlciA9IDE7CiAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoQEhpc3RvcnlMaW5lcykgewogICAgICAgICRDb3VudGVyKys7CgogICAgICAgICMgZGF0YSBmb3IgYSBzaW5nbGUgcm93LCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZHRsCiAgICAgICAgbXkgJURhdGEgPSAleyRIaXN0b3J5RW50cnl9OwoKICAgICAgICAjIGRldGVybWluZSB3aGF0IHNob3VsZCBiZSBzaG93bgogICAgICAgIG15ICRIaXN0b3J5VHlwZSA9ICRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZX07CiAgICAgICAgaWYgKCAkSGlzdG9yeVR5cGUgZXEgJ1dvcmtPcmRlclVwZGF0ZScgKSB7CgogICAgICAgICAgICAjIFRoZSBkaXNwbGF5ZWQgZmllbGRuYW1lIG1pZ2h0IGJlIGNoYW5nZWQgaW4gdGhlIGZvbGxvd2luZyBsb29wCiAgICAgICAgICAgIG15ICREaXNwbGF5ZWRGaWVsZG5hbWUgPSAkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfTsKCiAgICAgICAgICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBzb21lIGtleXMKICAgICAgICAgICAgZm9yIG15ICRDb250ZW50TmV3T3JPbGQgKHF3KENvbnRlbnROZXcgQ29udGVudE9sZCkpIHsKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEhpc3RvcnlFbnRyeS0+eyRDb250ZW50TmV3T3JPbGR9ICkgewogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9ICctJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGUgSUQgZmllbGRzLCB3ZSByZXBsYWNlIElEIHdpdGggaXRzIHRleHR1YWwgdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkVHlwZSkgPSAkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfSA9fiBtewogICAgICAgICAgICAgICAgICAgICAgICAgICAgXEEgICAgICAgICAgIyBzdHJpbmcgc3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICggICAgICAgICAgICMgc3RhcnQgY2FwdHVyZSBvZiAkVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlIHwgV29ya09yZGVyVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV29ya09yZGVyQWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICMgZW5kIGNhcHR1cmUgb2YgJFR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEICAgICAgICAgICMgcHJvY2Vzc2luZyBvbmx5IGZvciB0aGUgJ0lEJyBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgfXhtcwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUcmFuc2xhdGlvbk5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRUeXBlIGVxICdXb3JrT3JkZXJTdGF0ZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlclR5cGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVHlwZSBlcSAnV29ya09yZGVyQWdlbnQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbG9naW4gbmFtZXMgYXJlIG5vdCB0byBiZSB0cmFuc2xhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRyYW5zbGF0aW9uTmVlZGVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJVbmtub3duIHR5cGUgJyRUeXBlJyBlbmNvdW50ZXJlZCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRS5nLiB0aGUgdXNlcm5hbWVzIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRWYWx1ZSA9ICRUcmFuc2xhdGlvbk5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPSBzcHJpbnRmICclcyAoSUQ9JXMpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVHJhbnNsYXRlZFZhbHVlLCAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57JENvbnRlbnROZXdPck9sZH0gPSAnLSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvbnRlbnQgaGFzIGNoYW5nZWQsIHNvIGNoYW5nZSB0aGUgZGlzcGxheWVkIGZpZWxkbmFtZSBhcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgICREaXNwbGF5ZWRGaWVsZG5hbWUgPSAkVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBIVE1MIGJyZWFrcyB3aXRoIHNpbmdsZSBzcGFjZQogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPnskQ29udGVudE5ld09yT2xkfSA9fiBzeyA8IGJyIFxzKiAvPyA+IH17IH14bXNnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRyYW5zbGF0ZSBmaWVsZG5hbWUgZm9yIGRpc3BsYXkKICAgICAgICAgICAgJERpc3BsYXllZEZpZWxkbmFtZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgJERpc3BsYXllZEZpZWxkbmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdHJpbSBzdHJpbmdzIHRvIGEgbWF4IGxlbmd0aCBvZiAkTWF4TGVuZ3RoCiAgICAgICAgICAgIG15ICRDb250ZW50TmV3ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSB8fCAnLScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDb250ZW50T2xkID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfSB8fCAnLScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgWy4uLl0gZm9yIHRvbyBsb25nIHN0cmluZ3MKICAgICAgICAgICAgZm9yIG15ICRDb250ZW50ICggJENvbnRlbnROZXcsICRDb250ZW50T2xkICkgewogICAgICAgICAgICAgICAgaWYgKCAkQ29udGVudCAmJiAoIGxlbmd0aCAkQ29udGVudCA+ICRNYXhMZW5ndGggKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udGVudCA9IHN1YnN0ciggJENvbnRlbnQsIDAsICRNYXhMZW5ndGggKSAuICdbLi4uXSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IGRlc2NyaXB0aW9uCiAgICAgICAgICAgICREYXRhe0NvbnRlbnR9ID0gam9pbiAnJSUnLCAkRGlzcGxheWVkRmllbGRuYW1lLCAkQ29udGVudE5ldywgJENvbnRlbnRPbGQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fTsKICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSB0ZXh0CiAgICAgICAgaWYgKCAkRGF0YXtDb250ZW50fSApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgJSUKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPX4gc3sgXEEgJSUgfXt9eG1zZzsKCiAgICAgICAgICAgICMgc3BsaXQgdGhlIGNvbnRlbnQgYnkgJSUKICAgICAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0KCAvJSUvLCAkRGF0YXtDb250ZW50fSApOwoKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPSAnJzsKCiAgICAgICAgICAgICMgY2xlYW4gdGhlIHZhbHVlcwogICAgICAgICAgICBmb3IgbXkgJFZhbHVlIChAVmFsdWVzKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NvbnRlbnR9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0NvbnRlbnR9IC49ICciLCAnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICREYXRhe0NvbnRlbnR9IC49IHFxeyIkVmFsdWV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdlIG5lZWQgYXQgbGVhc3QgYSBkb3VibGUgcXVvdGUKICAgICAgICAgICAgaWYgKCAhJERhdGF7Q29udGVudH0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtDb250ZW50fSA9ICciICc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyAnbmljZScgb3V0cHV0IHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9uCiAgICAgICAgICAgICMgc2FtcGxlIGlucHV0OgogICAgICAgICAgICAjIENoYW5nZUhpc3Rvcnk6OkNoYW5nZUxpbmtBZGQiLCAiVGlja2V0IiwgIjEKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICdXb3JrT3JkZXJIaXN0b3J5OjonIC4gJERhdGF7SGlzdG9yeVR5cGV9IC4gJyIsICcgLiAkRGF0YXtDb250ZW50fQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZW1vdmUgbm90IG5lZWRlZCBwbGFjZSBob2xkZXIKICAgICAgICAgICAgJERhdGF7Q29udGVudH0gPX4gc3sgJSBzIH17fXhtc2c7CiAgICAgICAgfQoKICAgICAgICAjIHNlcGFyYXRlIGVhY2ggc2VhcmNocmVzdWx0IGxpbmUgYnkgdXNpbmcgc2V2ZXJhbCBjc3MKICAgICAgICAkRGF0YXtjc3N9ID0gJENvdW50ZXIgJSAyID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgIERhdGEgPT4geyVEYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYSAnbW9yZSBpbmZvJyBsaW5rCiAgICAgICAgaWYgKAogICAgICAgICAgICAoICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSAmJiBsZW5ndGgoICRIaXN0b3J5RW50cnktPntDb250ZW50TmV3fSApID4gJE1heExlbmd0aCApCiAgICAgICAgICAgIHx8ICggJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnRPbGR9ICYmIGxlbmd0aCggJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnRPbGR9ICkgPiAkTWF4TGVuZ3RoICkKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2hvdyBoaXN0b3J5em9vbSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSGlzdG9yeVpvb20nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkb24ndCBzaG93IGEgbGluawogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSGlzdG9yeVpvb21EYXNoJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclpvb20nLAogICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgKTsKCiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gJ1dvcmtPcmRlckhpc3RvcnknLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgd29ya29yZGVyIGhpc3Rvcnkgem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tLnBtLHYgMS43IDIwMTAvMDEvMjggMTM6NDU6MzUgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnktPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNV29ya09yZGVyOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIGNoYW5nZSBpZAogICAgbXkgJEhpc3RvcnlFbnRyeUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnSGlzdG9yeUVudHJ5SUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRIaXN0b3J5RW50cnlJRCApIHsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IHNob3cgaGlzdG9yeSB6b29tLCBubyBIaXN0b3J5RW50cnlJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGhpc3RvcnkgZW50cmllcwogICAgbXkgJEhpc3RvcnlFbnRyeSA9ICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlFbnRyeUdldCgKICAgICAgICBIaXN0b3J5RW50cnlJRCA9PiAkSGlzdG9yeUVudHJ5SUQsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkSGlzdG9yeUVudHJ5ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJIaXN0b3J5RW50cnkgJyRIaXN0b3J5RW50cnlJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkSGlzdG9yeUVudHJ5LT57V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4KICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIGluZm9ybWF0aW9uCiAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJEhpc3RvcnlFbnRyeS0+e1dvcmtPcmRlcklEfScgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGluZm9ybWF0aW9uCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJEhpc3RvcnlFbnRyeS0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNoYW5nZSAnJEhpc3RvcnlFbnRyeS0+e0NoYW5nZUlEfScgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGRhc2ggKCctJykgd2hlbiB0aGUgZmllbGQgaXMgZW1wdHkKICAgIGZvciBteSAkRmllbGQgKHF3KENvbnRlbnROZXcgQ29udGVudE9sZCkpIHsKICAgICAgICAkSGlzdG9yeUVudHJ5LT57JEZpZWxkfSB8fD0gJy0nCiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyCiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgVGl0bGUgPT4gJ1dvcmtPcmRlckhpc3Rvcnlab29tJywKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgJXskSGlzdG9yeUVudHJ5fSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclJlcG9ydC5wbSAtIHRoZSBPVFJTOjpJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50IHdvcmtvcmRlciByZXBvcnQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQucG0sdiAxLjI4IDIwMTAvMDYvMjkgMTM6NDg6NDYgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJSZXBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjggJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1dvcmtPcmRlcklEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISRXb3JrT3JkZXIgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldvcmtPcmRlciAnJFdvcmtPcmRlcklEJyBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0b3JlIG5lZWRlZCBwYXJhbWV0ZXJzIGluICVHZXRQYXJhbSB0byBtYWtlIHRoaXMgcGFnZSByZWxvYWRhYmxlCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAocXcoUmVwb3J0IFdvcmtPcmRlclN0YXRlSUQgQWNjb3VudGVkVGltZSkpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWd1cmVkIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZCBudW1iZXJzCiAgICBteSBAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzCiAgICAgICAgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcygpOwoKICAgICMgZ2V0IHdvcmtvcmRlciBmcmVldGV4dCBwYXJhbXMKICAgIG15ICVXb3JrT3JkZXJGcmVlVGV4dFBhcmFtOwogICAgTlVNQkVSOgogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgIyBjb25zaWRlciBvbmx5IGZyZWV0ZXh0IGZpZWxkcyB3aGljaCBhcmUgYWN0aXZhdGVkIGluIHRoaXMgZnJvbnRlbmQKICAgICAgICBuZXh0IE5VTUJFUiBpZiAhJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn07CgogICAgICAgIG15ICRLZXkgICA9ICdXb3JrT3JkZXJGcmVlS2V5JyAuICROdW1iZXI7CiAgICAgICAgbXkgJFZhbHVlID0gJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXI7CgogICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dFBhcmFteyRLZXl9ICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkV29ya09yZGVyRnJlZVRleHRQYXJhbXskVmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVmFsdWUgKTsKICAgIH0KCiAgICAjIHN0b3JlIGFjdHVhbCB0aW1lIHJlbGF0ZWQgZmllbGRzIGluICVHZXRQYXJhbQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY3R1YWxUaW1lU3Bhbn0gKSB7CiAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAocXcoQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CiAgICAgICAgICAgIGZvciBteSAkVGltZVBhcnQgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIFVzZWQpKSB7CiAgICAgICAgICAgICAgICBteSAkUGFyYW1OYW1lID0gJFRpbWVUeXBlIC4gJFRpbWVQYXJ0OwogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbU5hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1OYW1lICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBSZW1lbWJlciB0aGUgcmVhc29uIHdoeSBwZXJmb21pbmcgdGhlIHN1YmFjdGlvbiB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGVudHJpZXMgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZHRsIHZhbGlkYXRpb24gZXJyb3IgYmxvY2tzLgogICAgbXkgJVZhbGlkYXRpb25FcnJvcjsKCiAgICAjIHJlbWVtYmVyIHRoZSBudW1iZXJzIG9mIHRoZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIHdpdGggdmFsaWRhdGlvbiBlcnJvcnMKICAgIG15ICVXb3JrT3JkZXJGcmVlVGV4dFZhbGlkYXRpb25FcnJvcnM7CgogICAgIyB1cGRhdGUgd29ya29yZGVyCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CgogICAgICAgICMgdmFsaWRhdGUgdGhlIGFjdHVhbCB0aW1lIHJlbGF0ZWQgcGFyYW1ldGVycwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QWN0dWFsVGltZVNwYW59ICkgewogICAgICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKCiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdVc2VkJyB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHdoZW4gdGhlIGJ1dHRvbiB3YXMgbm90IGNoZWNrZWQsIHRoZW4gY2xlYXIgdGhlIHRpbWUKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFRpbWVUeXBlfSA9IHVuZGVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ1llYXInIH0KICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfQogICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0RheScgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnSG91cicgfQogICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnTWludXRlJyB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIGZvcm1hdCBhcyB0aW1lc3RhbXAsIHdoZW4gYWxsIHJlcXVpcmVkIHRpbWUgcGFyYW1zIHdlcmUgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lVHlwZX0gPSBzcHJpbnRmICclMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6MDAnLAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnRGF5JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdIb3VyJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNaW51dGUnIH07CgogICAgICAgICAgICAgICAgICAgICMgc2FuaXR5IGNoZWNrIG9mIHRoZSBhc3NlbWJsZWQgdGltZXN0YW1wCiAgICAgICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXskVGltZVR5cGV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IHNhdmUgd2hlbiB0aW1lIGlzIGludmFsaWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFZhbGlkYXRpb25FcnJvcnsgJ0ludmFsaWQnIC4gJFRpbWVUeXBlIH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGl0IHdhcyBpbmRpY2F0ZWQgdGhhdCB0aGUgdGltZSBzaG91bGQgYmUgc2V0LAogICAgICAgICAgICAgICAgICAgICMgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGUgcmVxdWlyZWQgdGltZSBwYXJhbXMgaXMgbWlzc2luZwogICAgICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7ICdJbnZhbGlkJyAuICRUaW1lVHlwZSB9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB2YWxpZGF0ZSBmb3JtYXQgb2YgYWNjb3VudGVkIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtBY2NvdW50ZWRUaW1lfSAhfiBteyBcQSAtPyBcZCogKD86IFsuXSBcZHsxLDJ9ICk/IFx6IH14bXMgKSB7CiAgICAgICAgICAgICRWYWxpZGF0aW9uRXJyb3J7J0ludmFsaWRBY2NvdW50ZWRUaW1lJ30gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgcmVxdWlyZWQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgbXkgJE51bWJlciAoQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcykgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0tPnskTnVtYmVyfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57V29ya09yZGVyRnJlZVRleHR9LT57JE51bWJlcn0gPT0gMgogICAgICAgICAgICAgICAgJiYgJFdvcmtPcmRlckZyZWVUZXh0UGFyYW17ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyIH0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZCBudW1iZXIgd2l0aCB2YWxpZGF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0VmFsaWRhdGlvbkVycm9yc3skTnVtYmVyfSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIGlucHV0IHZhbGlkYXRpb24gZXJyb3JzCiAgICAgICAgaWYgKCAhJVZhbGlkYXRpb25FcnJvciAmJiAhJVdvcmtPcmRlckZyZWVUZXh0VmFsaWRhdGlvbkVycm9ycyApIHsKCiAgICAgICAgICAgICMgdGhlIGFjdHVhbCB0aW1lIHJlbGF0ZWQgZmllbGRzIGFyZSBjb25maWd1cmFibGUKICAgICAgICAgICAgbXkgJUFkZGl0aW9uYWxQYXJhbTsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY3R1YWxUaW1lU3Bhbn0gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKCiAgICAgICAgICAgICAgICAgICAgIyAkR2V0UGFyYW17JFRpbWVUeXBlfSBpcyBlaXRoZXIgYSB2YWxpZCB0aW1lc3RhbXAgb3IgdW5kZWYKICAgICAgICAgICAgICAgICAgICAkQWRkaXRpb25hbFBhcmFteyRUaW1lVHlwZX0gPSAkR2V0UGFyYW17JFRpbWVUeXBlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdWxkVXBkYXRlV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZXBvcnR9LAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkR2V0UGFyYW17V29ya09yZGVyU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEFjY291bnRlZFRpbWUgICAgPT4gJEdldFBhcmFte0FjY291bnRlZFRpbWV9LAogICAgICAgICAgICAgICAgJUFkZGl0aW9uYWxQYXJhbSwKICAgICAgICAgICAgICAgICVXb3JrT3JkZXJGcmVlVGV4dFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiB3b3Jrb3JkZXIgdXBkYXRlIHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgIGlmICgkQ291bGRVcGRhdGVXb3JrT3JkZXIpIHsKCiAgICAgICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gJFNlbGYtPntMYXN0V29ya09yZGVyVmlld30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgc2hvdyBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJXYXMgbm90IGFibGUgdG8gdXBkYXRlIFdvcmtPcmRlciAkV29ya09yZGVyLT57V29ya09yZGVySUR9ISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgaW5pdGlhbGl6ZSB0aGUgYWN0dWFsIHRpbWUgcmVsYXRlZCBmaWVsZHMKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FjdHVhbFRpbWVTcGFufSApIHsKICAgICAgICAgICAgVElNRVRZUEU6CiAgICAgICAgICAgIGZvciBteSAkVGltZVR5cGUgKHF3KEFjdHVhbFN0YXJ0VGltZSBBY3R1YWxFbmRUaW1lKSkgewoKICAgICAgICAgICAgICAgIG5leHQgVElNRVRZUEUgaWYgISRXb3JrT3JkZXItPnskVGltZVR5cGV9OwoKICAgICAgICAgICAgICAgICMgZ2V0IHRoZSB0aW1lIGZyb20gdGhlIHdvcmtvcmRlcgogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFdvcmtPcmRlci0+eyRUaW1lVHlwZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lICk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIHBhcmFtZXRlciBoYXNoIGZvciBCdWlsZERhdGVTZWxlY3Rpb24oKQogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkVGltZVR5cGUgLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ01pbnV0ZScgfSA9ICRNaW51dGU7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdIb3VyJyB9ICAgPSAkSG91cjsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFRpbWVUeXBlIC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRUaW1lVHlwZSAuICdZZWFyJyB9ICAgPSAkWWVhcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgdGhhdCB0aGUgd29ya29yZGVyIGJlbG9uZ3MgdG8KICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBubyBjaGFuZ2UgZm91bmQKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBmaW5kIENoYW5nZSBmb3IgV29ya09yZGVyICRXb3JrT3JkZXJJRCEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBzdGF0ZSBsaXN0CiAgICBteSAkV29ya09yZGVyUG9zc2libGVTdGF0ZXMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgYnVpbGQgZHJvcC1kb3duIHdpdGggd29ya29yZGVyIHN0YXRlcwogICAgJFBhcmFte1N0YXRlU2VsZWN0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkV29ya09yZGVyUG9zc2libGVTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnV29ya09yZGVyU3RhdGVJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGVJRH0sCiAgICApOwoKICAgICMgc2hvdyBzdGF0ZSBkcm9wZG93bgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAkV29ya09yZGVyLT57V29ya09yZGVyVGl0bGV9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBjb25maWcgYW5kIGZpbGx1cCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIGZyb20gd29ya29yZGVyIGRhdGEKICAgIG15ICVXb3JrT3JkZXJGcmVlVGV4dENvbmZpZzsKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhXb3JrT3JkZXJGcmVlS2V5IFdvcmtPcmRlckZyZWVUZXh0KSkgewoKICAgICAgICAgICAgIyBnZXQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIHdvcmtvcmRlciBpZiBwYWdlIGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0UGFyYW17ICRUeXBlIC4gJE51bWJlciB9IHx8PSAkV29ya09yZGVyLT57ICRUeXBlIC4gJE51bWJlciB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBjb25maWcKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAkVHlwZSAuICROdW1iZXIgKTsKCiAgICAgICAgICAgIG5leHQgVFlQRSBpZiAhJENvbmZpZzsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIHJlZiAkQ29uZmlnIG5lICdIQVNIJzsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBjb25maWcKICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0Q29uZmlneyAkVHlwZSAuICROdW1iZXIgfSA9ICRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBIVE1MCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEZyZWVUZXh0SFRNTCgKICAgICAgICBDb25maWcgICAgICAgICAgICAgICAgICAgPT4gXCVXb3JrT3JkZXJGcmVlVGV4dENvbmZpZywKICAgICAgICBXb3JrT3JkZXJEYXRhICAgICAgICAgICAgPT4gXCVXb3JrT3JkZXJGcmVlVGV4dFBhcmFtLAogICAgICAgIENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcyA9PiBcQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcywKICAgICk7CgogICAgIyBzaG93IHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgIG15ICRXb3JrT3JkZXJGcmVlVGV4dFNob3duOwogICAgZm9yIG15ICROdW1iZXIgKEBDb25maWd1cmVkV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIGZyZWV0ZXh0IGZpZWxkIHNob3VsZCBiZSBzaG93biBpbiB0aGlzIGZyb250ZW5kCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0tPnskTnVtYmVyfSApIHsKCiAgICAgICAgICAgICMgcmVtZW1iZXIgdGhhdCBhdCBsZWFzdCBvbmUgZnJlZXRleHQgZmllbGQgaXMgc2hvd24KICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0U2hvd24gPSAxOwoKICAgICAgICAgICAgIyBzaG93IHNpbmdsZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVdvcmtPcmRlckZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgd29ya29yZGVyIGZyZWV0ZXh0IHZhbGlkYXRpb24gZXJyb3IgZm9yIHNpbmdsZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGQKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkV29ya09yZGVyRnJlZVRleHQnIC4gJE51bWJlciwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVdvcmtPcmRlckZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFsbCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5RmllbGQgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFdvcmtPcmRlckZyZWVUZXh0SFRNTHsgJ1dvcmtPcmRlckZyZWVLZXlGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHRGaWVsZCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkV29ya09yZGVyRnJlZVRleHRIVE1MeyAnV29ya09yZGVyRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGFsbCB3b3Jrb3JkZXIgZnJlZXRleHQgdmFsaWRhdGlvbiBlcnJvcnMKICAgICAgICAgICAgaWYgKCAkV29ya09yZGVyRnJlZVRleHRWYWxpZGF0aW9uRXJyb3JzeyROdW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZhbGlkV29ya09yZGVyRnJlZVRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlV29ya09yZGVyRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBzcGFjZSBiZWZvcmUgYW5kIGFmdGVyIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgIGlmICgkV29ya09yZGVyRnJlZVRleHRTaG93bikgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dFNwYWNlclRvcCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyRnJlZVRleHRTcGFjZXJCb3R0b20nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCB3b3Jrb3JkZXIgZnJlZXRleHQgamF2YSBzY3JpcHQgY2hlY2sKICAgIE5VTUJFUjoKICAgIGZvciBteSAkTnVtYmVyIChAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzKSB7CgogICAgICAgIG5leHQgTlVNQkVSIGlmICEkU2VsZi0+e0NvbmZpZ30tPntXb3JrT3JkZXJGcmVlVGV4dH0tPnskTnVtYmVyfTsKCiAgICAgICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgd29ya29yZGVyIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1dvcmtPcmRlckZyZWVUZXh0fS0+eyROdW1iZXJ9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleUZpZWxkICA9PiAnV29ya09yZGVyRnJlZUtleScgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0RmllbGQgPT4gJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FjdHVhbFRpbWVTcGFufSApIHsKCiAgICAgICAgIyBlbmFibGUgdGhlIHRpbWUgY2hlY2tzLCBvbmx5IHdoZW4gQWN0dWFsU3RhcnRUaW1lIGFuZCBBY3R1YWxFbmRUaW1lIGFyZSBzZWxlY3RhYmxlCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0dWFsVGltZVNwYW5KUycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRUaW1lVHlwZSAocXcoQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CgogICAgICAgICAgICAjIHRpbWUgcGVyaW9kIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhlIEdVSQogICAgICAgICAgICBteSAlVGltZVBlcmlvZCA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNV29ya09yZGVyOjpUaW1lUGVyaW9kJykgfTsKCiAgICAgICAgICAgICMgYWRkIHNlbGVjdGlvbiBmb3IgdGhlIHRpbWUKICAgICAgICAgICAgbXkgJFRpbWVTZWxlY3Rpb25TdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgPT4gJFRpbWVUeXBlLAogICAgICAgICAgICAgICAgIiR7VGltZVR5cGV9T3B0aW9uYWwiID0+IDEsCiAgICAgICAgICAgICAgICAlVGltZVBlcmlvZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyB0aW1lIGZpZWxkCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRUaW1lVHlwZSwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICRUaW1lVHlwZSAuICdTZWxlY3Rpb25TdHJpbmcnID0+ICRUaW1lU2VsZWN0aW9uU3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyB0aW1lIHZhbGlkYXRpb24gZXJyb3IKICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvbkVycm9yeyAnSW52YWxpZCcgLiAkVGltZVR5cGUgfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52YWxpZCcgLiAkVGltZVR5cGUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGRlbGV0ZSAkVmFsaWRhdGlvbkVycm9yeyAnSW52YWxpZCcgLiAkVGltZVR5cGUgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgYWNjb3VudGVkIHRpbWUgb25seSB3aGVuIGZvcm0gd2FzIHN1Ym1pdHRlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBY2NvdW50ZWRUaW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTaG93QWNjb3VudGVkVGltZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWNjb3VudGVkIHRpbWUgb25seSB3aGVuIGZvcm0gd2FzIHN1Ym1pdHRlZAogICAgbXkgJEFjY291bnRlZFRpbWUgPSAnJzsKICAgIGlmICggJEdldFBhcmFte0FjY291bnRlZFRpbWV9ICkgewogICAgICAgICRBY2NvdW50ZWRUaW1lID0gJEdldFBhcmFte0FjY291bnRlZFRpbWV9OwogICAgfQoKICAgICMgc2hvdyB2YWxpZGF0aW9uIGVycm9ycwogICAgZm9yIG15ICRFcnJvciAoIGtleXMgJVZhbGlkYXRpb25FcnJvciApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRFcnJvciwKICAgICAgICApOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENoYW5nZX0sCiAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIEFjY291bnRlZFRpbWUgPT4gJEFjY291bnRlZFRpbWUsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclRha2UucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCB3b3Jrb3JkZXIgdGFrZSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlclRha2UucG0sdiAxLjUgMjAxMC8wMi8wMyAwMDowMDo1MiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVdvcmtPcmRlclRha2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCBVc2VyT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01Xb3JrT3JkZXI6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgV29ya09yZGVySUQKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1dvcmtPcmRlcklEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkV29ya09yZGVySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFdvcmtPcmRlcklEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkV29ya09yZGVyICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJXb3JrT3JkZXIgJyRXb3JrT3JkZXJJRCcgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgIyBxdWVyeSB0aGUgcGVybWlzc2lvbiBtb2R1bGVzIHJlZ2lzdGVyZWQgaW4gJ0lUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uJwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgUGVybWlzc2lvblJlZ2lzdHJ5ID0+ICdJVFNNV29ya09yZGVyOjpUYWtlUGVybWlzc2lvbicsCiAgICAgICAgV29ya09yZGVySUQgICAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnV29ya09yZGVyVGFrZScgKSB7CgogICAgICAgICMgc2V0IHRoZSBjdXJyZW50IHVzZXIgYXMgdGhlIHdvcmtvcmRlciBhZ2VudAogICAgICAgIG15ICRDb3VsZFVwZGF0ZVdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ291bGRVcGRhdGVXb3JrT3JkZXIpIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gd29ya29yZGVyLCB3aGVuIHRoZSB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAkU2VsZi0+e0xhc3RXb3JrT3JkZXJWaWV3fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIldhcyBub3QgYWJsZSB0byB0YWtlIHRoZSB3b3Jrb3JkZXIgJyRXb3JrT3JkZXJJRCchIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIExvZ2luIG5hbWUgb2YgdGhlIGN1cnJlbnQgd29ya29yZGVyIGFnZW50CiAgICBteSAkV29ya09yZGVyQWdlbnQgPSAnLSc7CiAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSApIHsKICAgICAgICAkV29ya09yZGVyQWdlbnQgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHRoYXQgd29ya29yZGVyIGJlbG9uZ3MgdG8KICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgaXMgZm91bmQKICAgIGlmICggISRDaGFuZ2UgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBmaW5kIENoYW5nZSBmb3IgV29ya09yZGVyICRXb3JrT3JkZXJJRCEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgIFRpdGxlID0+ICdUYWtlIFdvcmtvcmRlcicsCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVdvcmtPcmRlclRha2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgV29ya09yZGVyQWdlbnQgPT4gJFdvcmtPcmRlckFnZW50LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgYWRkIHRlbXBsYXRlIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUucG0sdiAxLjEwIDIwMTAvMDYvMjkgMTM6NDU6MTcgc2IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJUZW1wbGF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBXb3JrT3JkZXJJRAogICAgbXkgJFdvcmtPcmRlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnV29ya09yZGVySUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRXb3JrT3JkZXJJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgTGF5b3V0T2JqZWN0IGhhcyBUcmFuc2xhdGlvbk9iamVjdAogICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0gKSB7CgogICAgICAgICMgdHJhbnNsYXRlIHdvcmtvcmRlciB0eXBlCiAgICAgICAgJFdvcmtPcmRlci0+e1dvcmtPcmRlclR5cGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICRXb3JrT3JkZXItPntXb3JrT3JkZXJUeXBlfQogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFdvcmtPcmRlciApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiV29ya09yZGVyICckV29ya09yZGVySUQnIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgc3RvcmUgbmVlZGVkIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtIHRvIG1ha2UgaXQgcmVsb2FkYWJsZQogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbU5hbWUgKHF3KFRlbXBsYXRlTmFtZSBDb21tZW50IFZhbGlkSUQgU3RhdGVSZXNldCkpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtTmFtZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbU5hbWUgKTsKICAgIH0KCiAgICAjIFJlbWVtYmVyIHRoZSByZWFzb24gd2h5IHNhdmluZyB3YXMgbm90IGF0dGVtcHRlZC4KICAgICMgVGhlIGl0ZW1zIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGR0bCB2YWxpZGF0aW9uIGVycm9yIGJsb2Nrcy4KICAgIG15IEBWYWxpZGF0aW9uRXJyb3JzOwoKICAgICMgYWRkIGEgdGVtcGxhdGUKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRUZW1wbGF0ZScgKSB7CgogICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIHRlbXBsYXRlIG5hbWUKICAgICAgICBpZiAoICEkR2V0UGFyYW17VGVtcGxhdGVOYW1lfSApIHsKICAgICAgICAgICAgcHVzaCBAVmFsaWRhdGlvbkVycm9ycywgJ0ludmFsaWRUZW1wbGF0ZU5hbWUnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhQFZhbGlkYXRpb25FcnJvcnMgKSB7CgogICAgICAgICAgICAjIHNlcmlhbGl6ZSB0aGUgd29ya29yZGVyCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUNvbnRlbnQgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgU3RhdGVSZXNldCAgID0+ICRHZXRQYXJhbXtTdGF0ZVJlc2V0fSB8fCAwLAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVDb250ZW50ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiVGhlIHdvcmtvcmRlciAnJFdvcmtPcmRlcklEJyBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgc2VyaWFsaXplZCB3b3Jrb3JkZXIKICAgICAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEdldFBhcmFte1RlbXBsYXRlTmFtZX0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJEdldFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgPT4gJFRlbXBsYXRlQ29udGVudCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBhZGQgdGhlIHRlbXBsYXRlLiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsLCByZWRpcmVjdCB0byB6b29tIG1hc2sKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAkU2VsZi0+e0xhc3RXb3JrT3JkZXJWaWV3fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBubyBzdWJhY3Rpb24sCiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHRoYXQgdGhlIHdvcmtvcmRlciBiZWxvbmdzIHRvCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgbm8gY2hhbmdlIGZvdW5kCiAgICBpZiAoICEkQ2hhbmdlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgZmluZCBDaGFuZ2UgZm9yIFdvcmtPcmRlciAkV29ya09yZGVySUQhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAnVGVtcGxhdGUnLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgbXkgJFZhbGlkU2VsZWN0aW9uU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17VmFsaWRJRH0gfHwgKCAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKSApWzBdLAogICAgICAgIFNvcnQgICAgICAgPT4gJ051bWVyaWNLZXknLAogICAgKTsKCiAgICAjIGFkZCB0aGUgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcwogICAgZm9yIG15ICRCbG9ja05hbWUgKEBWYWxpZGF0aW9uRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAkQmxvY2tOYW1lICk7CiAgICB9CgogICAgIyBzZXQgY2hlY2tib3ggZm9yIHN0YXRlIHJlc2V0CiAgICBpZiAoICRHZXRQYXJhbXtTdGF0ZVJlc2V0fSApIHsKICAgICAgICAkR2V0UGFyYW17U3RhdGVSZXNldH0gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgfQoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJXskQ2hhbmdlfSwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgVmFsaWRTZWxlY3Rpb25TdHJpbmcgPT4gJFZhbGlkU2VsZWN0aW9uU3RyaW5nLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVdvcmtPcmRlclpvb20ucG0gLSB0aGUgT1RSUzo6SVRTTTo6Q2hhbmdlTWFuYWdlbWVudCB3b3Jrb3JkZXIgem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlclpvb20ucG0sdiAxLjQwIDIwMTAvMDcvMDQgMDk6NDQ6NTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Xb3JrT3JkZXJab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNDAgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBXb3JrT3JkZXJJRAogICAgbXkgJFdvcmtPcmRlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnV29ya09yZGVySUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRXb3JrT3JkZXJJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gV29ya09yZGVySUQgaXMgZ2l2ZW4hJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFdvcmtPcmRlciApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiV29ya09yZGVyICckV29ya09yZGVySUQnIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgaGFuZGxlIERvd25sb2FkQXR0YWNobWVudAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkQXR0YWNobWVudCcgKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZm9yIGF0dGFjaG1lbnQKICAgICAgICBteSAkRmlsZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsZUlEJyApOwogICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudEdldCgKICAgICAgICAgICAgRmlsZUlEID0+ICRGaWxlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgICAgIGlmICggISRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZUlEKSEgTWF5IGJlIGFuIGF0dGFjayEhISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgJXskQXR0YWNobWVudERhdGF9LAogICAgICAgICAgICBUeXBlID0+ICdhdHRhY2htZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgTGF5b3V0T2JqZWN0IGhhcyBUcmFuc2xhdGlvbk9iamVjdAogICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0gKSB7CgogICAgICAgICMgdHJhbnNsYXRlIHBhcmFtZXRlcgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KFdvcmtPcmRlclR5cGUpKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBwYXJhbWV0ZXIKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFdvcmtPcmRlci0+eyRQYXJhbX07CgogICAgICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgICAgICAkV29ya09yZGVyLT57JFBhcmFtfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+eyRQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgU3RvcmUgTGFzdFdvcmtPcmRlclZpZXcsIGZvciBiYWNrbGlua3MgZnJvbSB3b3Jrb3JkZXIgc3BlY2lmaWMgcGFnZXMKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFdvcmtPcmRlclZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgU3RvcmUgTGFzdFNjcmVlbk92ZXJ2aWV3LCBmb3IgYmFja2xpbmtzIGZyb20gQWdlbnRMaW5rT2JqZWN0CiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVyVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBTdG9yZSBMYXN0U2NyZWVuT3ZlcnZpZXcsIGZvciBiYWNrbGlua3MgZnJvbSAnQWdlbnRMaW5rT2JqZWN0JwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBicmVhayBpbnN0cnVjdGlvbiBhZnRlciA4MCBjaGFycwogICAgaWYgKCAkV29ya09yZGVyLT57SW5zdHJ1Y3Rpb259ICkgewogICAgICAgICRXb3JrT3JkZXItPntJbnN0cnVjdGlvbn0gPX4gc3sgKFxTezgwfSkgfXskMSB9eG1zZzsKICAgIH0KCiAgICAjIGJyZWFrIHJlcG9ydCBhZnRlciA4MCBjaGFycwogICAgaWYgKCAkV29ya09yZGVyLT57UmVwb3J0fSApIHsKICAgICAgICAkV29ya09yZGVyLT57UmVwb3J0fSA9fiBzeyAoXFN7ODB9KSB9eyQxIH14bXNnOwogICAgfQoKICAgICMgZ2V0IHRoZSBjaGFuZ2UgdGhhdCB3b3Jrb3JkZXIgYmVsb25ncyB0bwogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXItPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHJ1biB3b3Jrb3JkZXIgbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgZ2V0IGl0ZW1zIGZvciBtZW51CiAgICAgICAgbXkgJU1lbnVzICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyID0+ICRXb3JrT3JkZXIsCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICBUaXRsZSA9PiAkV29ya09yZGVyLT57V29ya09yZGVyVGl0bGV9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlci0+e0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgQ3JlYXRlQnkgdXNlciBpbmZvcm1hdGlvbgogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJFdvcmtPcmRlci0+eyAnQ3JlYXRlJyAuICRQb3N0Zml4IH0gPSAkQ3JlYXRlVXNlcnskUG9zdGZpeH07CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHVzZXIgZGF0YQogICAgbXkgJUNoYW5nZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlci0+e0NoYW5nZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgQ2hhbmdlQnkgdXNlciBpbmZvcm1hdGlvbgogICAgZm9yIG15ICRQb3N0Zml4IChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJFdvcmtPcmRlci0+eyAnQ2hhbmdlJyAuICRQb3N0Zml4IH0gPSAkQ2hhbmdlVXNlcnskUG9zdGZpeH07CiAgICB9CgogICAgIyBvdXRwdXQgbWV0YSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgdmFsdWVzIG9yIGRhc2ggKCctJykKICAgIGZvciBteSAkQmxvY2tOYW1lICgKICAgICAgICBxdyhXb3JrT3JkZXJUeXBlIFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFdvcmtPcmRlci0+eyRCbG9ja05hbWV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQmxvY2tOYW1lLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJEJsb2NrTmFtZSA9PiAkV29ya09yZGVyLT57JEJsb2NrTmFtZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VtcHR5JyAuICRCbG9ja05hbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBjb25maWd1cmFibGUgYmxvY2tzCiAgICBCTE9DS05BTUU6CiAgICBmb3IgbXkgJEJsb2NrTmFtZSAocXcoUGxhbm5lZEVmZm9ydCBBY2NvdW50ZWRUaW1lKSkgewoKICAgICAgICAjIHNraXAgaWYgYmxvY2sgaXMgc3dpdGNoZWQgb2ZmIGluIFN5c0NvbmZpZwogICAgICAgIG5leHQgQkxPQ0tOQU1FIGlmICEkU2VsZi0+e0NvbmZpZ30tPnskQmxvY2tOYW1lfTsKCiAgICAgICAgIyBzaG93IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2hvdycgLiAkQmxvY2tOYW1lLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB2YWx1ZSBvciBkYXNoCiAgICAgICAgaWYgKCAkV29ya09yZGVyLT57JEJsb2NrTmFtZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRCbG9ja05hbWUsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAkQmxvY2tOYW1lID0+ICRXb3JrT3JkZXItPnskQmxvY2tOYW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHknIC4gJEJsb2NrTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIHdvcmtvcmRlciBmcmVla2V5IGFuZCBmcmVldGV4dCBudW1iZXJzIGZyb20gd29ya29yZGVyCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRGaWVsZHM7CiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJXskV29ya09yZGVyfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIGZyZWV0ZXh0IG51bWJlciwgb25seSBsb29rIGF0IHRoZSBmcmVldGV4dCBmaWVsZCwKICAgICAgICAjIGFzIHdlIGRvIG5vdCB3YW50IHRvIHNob3cgZW1wdHkgZmllbGRzIGluIHRoZSB6b29tIHZpZXcKICAgICAgICBpZiAoICRBdHRyaWJ1dGUgPX4gbXsgKCBXb3JrT3JkZXJGcmVlVGV4dCApICggXGQrICkgfXhtcyApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHNob3cgZW1wdHkgZnJlZXRleHQgdmFsdWVzCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICRXb3JrT3JkZXItPnskQXR0cmlidXRlfSBlcSAnJzsKCiAgICAgICAgICAgICMgcmVtZW1iZXIgdGhlIGZyZWV0ZXh0IG51bWJlcgogICAgICAgICAgICBteSAkTnVtYmVyID0gJDI7CiAgICAgICAgICAgICRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkc3skTnVtYmVyfSsrOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdGhlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgIGZvciBteSAkTnVtYmVyICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJVdvcmtPcmRlckZyZWVUZXh0RmllbGRzICkgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleSAgPT4gJFdvcmtPcmRlci0+eyAnV29ya09yZGVyRnJlZUtleScgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dCA9PiAkV29ya09yZGVyLT57ICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGZyZWV0ZXh0IGZpZWxkIGFzIGxpbmsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnV29ya09yZGVyRnJlZVRleHQnIC4gJE51bWJlciAuICc6OkxpbmsnICkgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyRnJlZVRleHRMaW5rJyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckZyZWVUZXh0TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dExpbmsgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyIC4gJzo6TGluaycKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXkgID0+ICRXb3JrT3JkZXItPnsgJ1dvcmtPcmRlckZyZWVLZXknIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0ID0+ICRXb3JrT3JkZXItPnsgJ1dvcmtPcmRlckZyZWVUZXh0JyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgZnJlZXRleHQgZmllbGQgYXMgcGxhaW4gdGV4dAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyRnJlZVRleHRQbGFpbicgLiAkTnVtYmVyLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJGcmVlVGV4dFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleSAgPT4gJFdvcmtPcmRlci0+eyAnV29ya09yZGVyRnJlZUtleScgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQgPT4gJFdvcmtPcmRlci0+eyAnV29ya09yZGVyRnJlZVRleHQnIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHNwYWNlIGJldHdlZW4gd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBhbmQgdGhlIGZvbGxvd2luZyBmaWVsZHMKICAgIGlmICglV29ya09yZGVyRnJlZVRleHRGaWVsZHMpIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyRnJlZVRleHRTcGFjZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGJ1aWxkZXIgdXNlcgogICAgbXkgJUNoYW5nZUJ1aWxkZXJVc2VyOwogICAgaWYgKCAkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfSApIHsKICAgICAgICAlQ2hhbmdlQnVpbGRlclVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9LAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBidWlsZGVyIGluZm9ybWF0aW9uCiAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAkV29ya09yZGVyLT57ICdDaGFuZ2VCdWlsZGVyJyAuICRQb3N0Zml4IH0gPSAkQ2hhbmdlQnVpbGRlclVzZXJ7JFBvc3RmaXh9IHx8ICcnOwogICAgfQoKICAgICMgb3V0cHV0IGNoYW5nZSBidWlsZGVyIGJsb2NrCiAgICBpZiAoJUNoYW5nZUJ1aWxkZXJVc2VyKSB7CgogICAgICAgICMgc2hvdyBuYW1lIGFuZCBtYWlsIGFkZHJlc3MgaWYgdXNlciBleGlzdHMKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VCdWlsZGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzaG93IGRhc2ggaWYgbm8gY2hhbmdlIGJ1aWxkZXIgZXhpc3RzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHlDaGFuZ2VCdWlsZGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBhZ2VudCB1c2VyCiAgICBpZiAoICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSApIHsKICAgICAgICBteSAlV29ya09yZGVyQWdlbnRVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICglV29ya09yZGVyQWdlbnRVc2VyKSB7CgogICAgICAgICAgICAjIGdldCBXb3JrT3JkZXJBZ2VudCBpbmZvcm1hdGlvbgogICAgICAgICAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXItPnsgJ1dvcmtPcmRlckFnZW50JyAuICRQb3N0Zml4IH0gPSAkV29ya09yZGVyQWdlbnRVc2VyeyRQb3N0Zml4fSB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgV29ya09yZGVyQWdlbnQgaW5mb3JtYXRpb24KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBpZiBubyBXb3JrT3JkZXJBZ2VudCBpcyBmb3VuZAogICAgaWYgKCAhJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50VXNlckxvZ2lufSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFbXB0eVdvcmtPcmRlckFnZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBLZXkgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAjIGNyZWF0ZSB0aGUgbGluayB0YWJsZQogICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgKTsKCiAgICAjIG91dHB1dCB0aGUgbGluayB0YWJsZQogICAgaWYgKCRMaW5rVGFibGVTdHJnKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlJyAuICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBteSAlQXR0YWNobWVudHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICApOwoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgZm9yIG15ICRBdHRhY2htZW50SUQgKCBrZXlzICVBdHRhY2htZW50cyApIHsKCiAgICAgICAgIyBnZXQgaW5mbyBhYm91dCBmaWxlCiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50R2V0KAogICAgICAgICAgICBGaWxlSUQgPT4gJEF0dGFjaG1lbnRJRCwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYmxvY2sKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgICAgICAgICAgJXskQXR0YWNobWVudERhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01Xb3JrT3JkZXJab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAleyRDaGFuZ2V9LAogICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVySVRTTUNoYW5nZVNjaGVkdWxlLnBtIC0gdGhlIE9UUlM6OklUU006OkNoYW5nZU1hbmFnZW1lbnQgY3VzdG9tZXIgY2hhbmdlIHNjaGVkdWxlIG92ZXJ2aWV3IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ3VzdG9tZXJJVFNNQ2hhbmdlU2NoZWR1bGUucG0sdiAxLjQgMjAxMC8wMi8wMiAxMTowNTo1OCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lcklUU01DaGFuZ2VTY2hlZHVsZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGZpbHRlciBhbmQgdmlldyBwYXJhbXMKICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnQWxsJzsKICAgICRTZWxmLT57Vmlld30gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgICB8fCAnJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICBpZiAoCiAgICAgICAgISRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0Q2hhbmdlVmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlciggVGl0bGUgPT4gJ0Vycm9yJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckVycm9yKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgQ3VzdG9tZXJJRAogICAgaWYgKCAhJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJFcnJvciggTWVzc2FnZSA9PiAnTmVlZCBDdXN0b21lcklEIScgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGdldCBzb3J0aW5nIHBhcmFtZXRlcnMKICAgIG15ICRTb3J0QnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnUGxhbm5lZFN0YXJ0VGltZSc7CgogICAgIyBnZXQgb3JkZXJpbmcgcGFyYW1ldGVycwogICAgbXkgJE9yZGVyQnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlckJ5JyApCiAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgIG15IEBTb3J0QnlBcnJheSAgPSAoJFNvcnRCeSk7CiAgICBteSBAT3JkZXJCeUFycmF5ID0gKCRPcmRlckJ5KTsKCiAgICAjIGludmVzdGlnYXRlIHJlZnJlc2gKICAgIG15ICRSZWZyZXNoID0gJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ID8gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX0gOiB1bmRlZjsKCiAgICAjIHN0YXJ0aW5nIHdpdGggcGFnZSAuLi4KICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKAogICAgICAgIFJlZnJlc2ggPT4gJFJlZnJlc2gsCiAgICAgICAgVGl0bGUgICA9PiAnJywKICAgICk7CgogICAgIyBidWlsZCBOYXZpZ2F0aW9uQmFyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0ICk7CiAgICAkT3V0cHV0ID0gJyc7CgogICAgIyBmaW5kIG91dCB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBzaG93bgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTaG93Q29sdW1uc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBwb3NzaWJsZSBjb2x1bW5zIGZyb20gY29uZmlnCiAgICAgICAgbXkgJVBvc3NpYmxlQ29sdW1uID0gJXsgJFNlbGYtPntDb25maWd9LT57U2hvd0NvbHVtbnN9IH07CgogICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZXMgdGhhdCBzaG91bGQgYmUgc2hvd24KICAgICAgICBDT0xVTU5OQU1FOgogICAgICAgIGZvciBteSAkTmFtZSAoIGtleXMgJVBvc3NpYmxlQ29sdW1uICkgewogICAgICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgISRQb3NzaWJsZUNvbHVtbnskTmFtZX07CiAgICAgICAgICAgIHB1c2ggQFNob3dDb2x1bW5zLCAkTmFtZTsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSB0aGUgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBzZXQgb3RoZXIgZmlsdGVycyBiYXNlZCBvbiBjaGFuZ2Ugc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gKSB7CgogICAgICAgICMgZGVmaW5lIHBvc2l0aW9uIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGZyb250ZW5kCiAgICAgICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAgICAgIyBnZXQgYWxsIGNoYW5nZSBzdGF0ZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBmaWx0ZXJzCiAgICAgICAgQ0hBTkdFU1RBVEU6CiAgICAgICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoIEB7ICRTZWxmLT57Q29uZmlnfS0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9IH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgY2hhbmdlIHN0YXRlcwogICAgICAgICAgICBuZXh0IENIQU5HRVNUQVRFIGlmICEkQ2hhbmdlU3RhdGU7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHN0YXRlIGlzIHZhbGlkIGJ5IGxvb2tpbmcgdXAgdGhlIHN0YXRlIGlkCiAgICAgICAgICAgIG15ICRDaGFuZ2VTdGF0ZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBpbnZhbGlkIGNoYW5nZSBzdGF0ZXMKICAgICAgICAgICAgbmV4dCBDSEFOR0VTVEFURSBpZiAhJENoYW5nZVN0YXRlSUQ7CgogICAgICAgICAgICAjIGluY3JlYXNlIHRoZSBQcmlvQ291bnRlcgogICAgICAgICAgICAkUHJpb0NvdW50ZXIrKzsKCiAgICAgICAgICAgICMgYWRkIGZpbHRlciBmb3IgdGhlIGN1cnJlbnQgY2hhbmdlIHN0YXRlCiAgICAgICAgICAgICRGaWx0ZXJzeyRDaGFuZ2VTdGF0ZX0gPSB7CiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJENoYW5nZVN0YXRlLAogICAgICAgICAgICAgICAgUHJpbyAgID0+ICRQcmlvQ291bnRlciwKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiBbJENoYW5nZVN0YXRlXSwKICAgICAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFxAU29ydEJ5QXJyYXksCiAgICAgICAgICAgICAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBcQE9yZGVyQnlBcnJheSwKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiBvbmx5IG9uZSBmaWx0ZXIgZXhpc3RzCiAgICBpZiAoIHNjYWxhciBrZXlzICVGaWx0ZXJzID09IDEgKSB7CgogICAgICAgICMgZ2V0IHRoZSBuYW1lIG9mIHRoZSBvbmx5IGZpbHRlcgogICAgICAgIG15ICgkRmlsdGVyTmFtZSkgPSBrZXlzICVGaWx0ZXJzOwoKICAgICAgICAjIGFjdGl2YXRlIHRoaXMgZmlsdGVyCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJEZpbHRlck5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgZGVmYXVsdCBmaWx0ZXIKICAgICAgICAkRmlsdGVyc3tBbGx9ID0gewogICAgICAgICAgICBOYW1lICAgPT4gJ0FsbCcsCiAgICAgICAgICAgIFByaW8gICA9PiAxMDAwLAogICAgICAgICAgICBTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVzICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gXEBTb3J0QnlBcnJheSwKICAgICAgICAgICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gXEBPcmRlckJ5QXJyYXksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGZpbHRlciBpcyB2YWxpZAogICAgaWYgKCAhJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiSW52YWxpZCBGaWx0ZXI6ICRTZWxmLT57RmlsdGVyfSEiICk7CiAgICB9CgogICAgIyBzZWFyY2ggY2hhbmdlcyB3aGljaCBtYXRjaCB0aGUgc2VsZWN0ZWQgZmlsdGVyCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgJXsgJEZpbHRlcnN7ICRTZWxmLT57RmlsdGVyfSB9LT57U2VhcmNofSB9LAogICAgKTsKICAgIG15IEBDaGFuZ2VJRHMgPSBAeyRDaGFuZ2VJRHNSZWZ9OwoKICAgICMgaWYgY29uZmlndXJlZCwgZ2V0IG9ubHkgY2hhbmdlcyB3aGljaCBoYXZlIHdvcmtvcmRlcnMgdGhhdCBhcmUgbGlua2VkIHdpdGggYSBzZXJ2aWNlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dPbmx5Q2hhbmdlc1dpdGhBbGxvd2VkU2VydmljZXN9ICkgewoKICAgICAgICAjIGdldCBhbGwgc2VydmljZXMgdGhlIGN1c3RvbWVyIHVzZXIgaXMgYWxsb3dlZCB0byB1c2UKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyU2VydmljZXMgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVVuaXF1ZUNoYW5nZUlEczsKICAgICAgICBDSEFOR0VJRDoKICAgICAgICBmb3IgbXkgJENoYW5nZUlEIChAQ2hhbmdlSURzKSB7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgICAgICAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB3b3Jrb3JkZXIgaWRzCiAgICAgICAgICAgIG15IEBXb3JrT3JkZXJJRHMgPSBAeyAkQ2hhbmdlLT57V29ya09yZGVySURzfSB9OwoKICAgICAgICAgICAgIyBkb24ndCBzaG93IGNoYW5nZXMgd2l0aCBubyB3b3Jrb3JkZXJzIChhcyB0aGV5IGNhbiBub3QgYmUgbGlua2VkIHdpdGggYSBzZXJ2aWNlKQogICAgICAgICAgICBuZXh0IENIQU5HRUlEIGlmICFAV29ya09yZGVySURzOwoKICAgICAgICAgICAgV09SS09SREVSSUQ6CiAgICAgICAgICAgIGZvciBteSAkV29ya09yZGVySUQgKEBXb3JrT3JkZXJJRHMpIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgbGlzdCBvZiBsaW5rZWQgc2VydmljZXMKICAgICAgICAgICAgICAgIG15ICVMaW5rS2V5TGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtLZXlMaXN0KAogICAgICAgICAgICAgICAgICAgIE9iamVjdDEgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIEtleTEgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgd29ya29yZGVyIGhhcyBubyBsaW5rZWQgc2VydmljZQogICAgICAgICAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAhJUxpbmtLZXlMaXN0OwoKICAgICAgICAgICAgICAgIFNFUlZJQ0VJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICgga2V5cyAlTGlua0tleUxpc3QgKSB7CgogICAgICAgICAgICAgICAgICAgICMgb25seSB1c2Ugc2VydmljZXMgd2hlcmUgdGhlIGN1c3RvbWVyIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBzZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgbmV4dCBTRVJWSUNFSUQgaWYgISRDdXN0b21lclVzZXJTZXJ2aWNlc3skU2VydmljZUlEfTsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgY2hhbmdlIGlkIHRvIGxpc3Qgb2YgdmlzaWJsZSBjaGFuZ2VzIGZvciB0aGUgY3VzdG9tZXIKICAgICAgICAgICAgICAgICAgICAkVW5pcXVlQ2hhbmdlSURzeyRDaGFuZ2VJRH0rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQENoYW5nZUlEcyA9IGtleXMgJVVuaXF1ZUNoYW5nZUlEczsKICAgIH0KCiAgICAjIGRpc3BsYXkgYWxsIG5hdmJhciBmaWx0ZXJzCiAgICBteSAlTmF2QmFyRmlsdGVyOwogICAgZm9yIG15ICRGaWx0ZXIgKCBrZXlzICVGaWx0ZXJzICkgewoKICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBmaWx0ZXIgY291bnQgaW4gY3VzdG9tZXIgaW50ZXJmYWNlLAogICAgICAgICMgaWYgdGhlIGZlYXR1cmUgU2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlcyBpcyBhY3RpdmV2YXRlZAogICAgICAgICMgYmVjYXVzZSBpdCBpcyBub3QgYWNjdXJhdGUgZHVlIHRvIHNlcnZpY2UgcmVzdHJpY3Rpb25zIGZvciBjdXN0b21lciB1c2VycwogICAgICAgIG15ICRDb3VudDsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Nob3dPbmx5Q2hhbmdlc1dpdGhBbGxvd2VkU2VydmljZXN9ICkgewogICAgICAgICAgICAkQ291bnQgPSB1bmRlZjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgY2hhbmdlcyBmb3IgZWFjaCBmaWx0ZXIKICAgICAgICAgICAgJENvdW50ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkaXNwbGF5IHRoZSBuYXZiYXIgZmlsdGVyCiAgICAgICAgJE5hdkJhckZpbHRlcnsgJEZpbHRlcnN7JEZpbHRlcn0tPntQcmlvfSB9ID0gewogICAgICAgICAgICBDb3VudCAgPT4gJENvdW50LAogICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlciwKICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0gfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2hvdyBjaGFuZ2VzCiAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgIC4gJyZWaWV3PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgLiAnJlNvcnRCeT0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTb3J0QnkgKQogICAgICAgIC4gJyZPcmRlckJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJyYnOwogICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAuICcmVmlldz0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgIC4gJyYnOwogICAgbXkgJExpbmtGaWx0ZXIgPSAnU29ydEJ5PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnJk9yZGVyQnk9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkT3JkZXJCeSApCiAgICAgICAgLiAnJlZpZXc9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1ZpZXd9ICkKICAgICAgICAuICcmJzsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5JVFNNQ2hhbmdlTGlzdFNob3coCgogICAgICAgIENoYW5nZUlEcyA9PiBcQENoYW5nZUlEcywKICAgICAgICBUb3RhbCAgICAgPT4gc2NhbGFyIEBDaGFuZ2VJRHMsCgogICAgICAgIFZpZXcgPT4gJFNlbGYtPntWaWV3fSwKCiAgICAgICAgRmlsdGVyICAgICA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRmlsdGVycyAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rID0+ICRMaW5rRmlsdGVyLAoKICAgICAgICBUaXRsZU5hbWUgID0+ICdPdmVydmlldzogQ2hhbmdlIFNjaGVkdWxlJywKICAgICAgICBUaXRsZVZhbHVlID0+ICRTZWxmLT57RmlsdGVyfSwKCiAgICAgICAgRW52ICAgICAgPT4gJFNlbGYsCiAgICAgICAgTGlua1BhZ2UgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ID0+ICRMaW5rU29ydCwKCiAgICAgICAgU2hvd0NvbHVtbnMgPT4gXEBTaG93Q29sdW1ucywKCiAgICAgICAgRnJvbnRlbmQgPT4gJ0N1c3RvbWVyJywKICAgICk7CgogICAgIyBnZXQgcGFnZSBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlTWVudUdlbmVyaWMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2VNZW51R2VuZXJpYy5wbSx2IDEuNiAyMDA5LzExLzIzIDEzOjMwOjQzIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNoYW5nZU1lbnVHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDaGFuZ2VPYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NoYW5nZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoYW5nZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgdGhlIHJlbGV2YW50IGFjdGlvbgogICAgbXkgJEZyb250ZW5kQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICggJEZyb250ZW5kQ29uZmlnICYmICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdiBmcm9tIHRoZSBmcm9udGVuZCBjb25maWd1cmF0aW9uCiAgICAgICAgJFJlcXVpcmVkUHJpdiA9ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gZXEgJ0FnZW50TGlua09iamVjdCcgKSB7CgogICAgICAgICMgdGhlIExpbmstbGluayBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgaXQgaXMgbm90IHNwZWNpZmljIHRvIElUU01DaGFuZ2UKICAgICAgICAkUmVxdWlyZWRQcml2ID0gJ3J3JzsKICAgIH0KCiAgICBteSAkQWNjZXNzOwogICAgaWYgKCAhJFJlcXVpcmVkUHJpdiApIHsKCiAgICAgICAgIyBEaXNwbGF5IHRoZSBtZW51LWxpbmssIHdoZW4gbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkCiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucywgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHByaXZpbGVnZQogICAgICAgICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRSZXF1aXJlZFByaXYsCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2V9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yLCB3aGVuIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBtZW51IGl0ZW0KICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17Q2hhbmdlfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlTWVudVRpbWVTbG90LnBtIC0gTWVudSBtb2R1bGUgd2l0aCBjaGVjawojIHdoZXRoZXIgdGhlcmUgYXJlIHdvcmtvcmRlcnMgYW5kIHdoZXRoZXIgdGhlIGNoYW5nZSBoYXMgbm90IHN0YXJ0ZWQgeWV0CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlTWVudVRpbWVTbG90LnBtLHYgMS4xIDIwMDkvMTIvMzAgMTM6NDk6MjMgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlTWVudVRpbWVTbG90OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDaGFuZ2VPYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NoYW5nZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoYW5nZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHdvcmtvcmRlcnMgeWV0CiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkUGFyYW17Q2hhbmdlfS0+e1dvcmtPcmRlckNvdW50fTsKCiAgICAjIFRoZSBjaGFuZ2UgY2FuIG5vIGxvbmdlciBiZSBtb3ZlZCwgd2hlbiB0aGUgY2hhbmdlIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICRQYXJhbXtDaGFuZ2V9LT57QWN0dWFsU3RhcnRUaW1lfTsKCiAgICAjIGdldCBjb25maWcgZm9yIHRoZSByZWxldmFudCBhY3Rpb24KICAgIG15ICRGcm9udGVuZENvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlLCAncm8nIG9yICdydycKICAgIG15ICRSZXF1aXJlZFByaXY7CiAgICBpZiAoJEZyb250ZW5kQ29uZmlnKSB7CgogICAgICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2IGZyb20gdGhlIGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KICAgICAgICAkUmVxdWlyZWRQcml2ID0gJEZyb250ZW5kQ29uZmlnLT57UGVybWlzc2lvbn07CiAgICB9CgogICAgbXkgJEFjY2VzczsKICAgIGlmICggISRSZXF1aXJlZFByaXYgKSB7CgogICAgICAgICMgRGlzcGxheSB0aGUgbWVudS1saW5rLCB3aGVuIG5vIHByaXZpbGVnZSBpcyByZXF1aXJlZAogICAgICAgICRBY2Nlc3MgPSAxOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMsIGJhc2VkIG9uIHRoZSByZXF1aXJlZCBwcml2aWxlZ2UKICAgICAgICAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkUmVxdWlyZWRQcml2LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEFjY2VzczsKCiAgICAjIG91dHB1dCBtZW51IGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICMgb3V0cHV0IHNlcGVyYXRvciwgd2hlbiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgbWVudSBpdGVtCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte0NoYW5nZX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlTWVudVdvcmtPcmRlcnNOZWVkZWQucG0gLSBNZW51IHdpdGggY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgd29ya29yZGVycwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZU1lbnVXb3JrT3JkZXJzTmVlZGVkLnBtLHYgMS43IDIwMTAvMDMvMTkgMTA6MTM6MTYgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ2hhbmdlTWVudVdvcmtPcmRlcnNOZWVkZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKIyBBcyBvZiAyMDEwLTAzLTE5IHRoaXMgbW9kdWxlIGlzIHVudXNlZC4KIyBCdXQgaXQgaXMga2VwdCBpbiB0aGUgZGlzdHJpYnV0aW9uLCBhcyBpdCBwcm92aWRlcyB1c2VmdWwgZnVuY3Rpb25hbGl0eSBmb3IgZnV0dXJlIHVzZS4KCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDaGFuZ2VPYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NoYW5nZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoYW5nZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHdvcmtvcmRlcnMgeWV0CiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkUGFyYW17Q2hhbmdlfS0+e1dvcmtPcmRlckNvdW50fTsKCiAgICAjIGdldCBjb25maWcgZm9yIHRoZSByZWxldmFudCBhY3Rpb24KICAgIG15ICRGcm9udGVuZENvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIklUU01DaGFuZ2U6OkZyb250ZW5kOjokUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlLCAncm8nIG9yICdydycKICAgIG15ICRSZXF1aXJlZFByaXY7CiAgICBpZiAoJEZyb250ZW5kQ29uZmlnKSB7CgogICAgICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2IGZyb20gdGhlIGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KICAgICAgICAkUmVxdWlyZWRQcml2ID0gJEZyb250ZW5kQ29uZmlnLT57UGVybWlzc2lvbn07CiAgICB9CgogICAgbXkgJEFjY2VzczsKICAgIGlmICggISRSZXF1aXJlZFByaXYgKSB7CgogICAgICAgICMgRGlzcGxheSB0aGUgbWVudS1saW5rLCB3aGVuIG5vIHByaXZpbGVnZSBpcyByZXF1aXJlZAogICAgICAgICRBY2Nlc3MgPSAxOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMsIGJhc2VkIG9uIHRoZSByZXF1aXJlZCBwcml2aWxlZ2UKICAgICAgICAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkUmVxdWlyZWRQcml2LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEFjY2VzczsKCiAgICAjIG91dHB1dCBtZW51IGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICMgb3V0cHV0IHNlcGVyYXRvciwgd2hlbiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgbWVudSBpdGVtCiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51SXRlbVNwbGl0JyApOwogICAgfQoKICAgICMgb3V0cHV0IG1lbnUgaXRlbQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte0NoYW5nZX0gfSwKICAgICAgICAgICAgJXsgJFBhcmFte0NvbmZpZ30gfSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ2hhbmdlT3ZlcnZpZXdTbWFsbC5wbS5wbQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZU92ZXJ2aWV3U21hbGwucG0sdiAxLjEyIDIwMTAvMDIvMDUgMTg6MTM6NTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01DaGFuZ2VPdmVydmlld1NtYWxsOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBVc2VyT2JqZWN0IE1haW5PYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKCiAgICAjIHdoZW4gY2FsbGVkIGZyb20gdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgaWYgKCAhJFNlbGYtPntVc2VyT2JqZWN0fS0+Y2FuKCdHZXRVc2VyRGF0YScpICkgewoKICAgICAgICAjIHdvcmthcm91bmQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgICMgaW4gdGhlIGN1c3RvbWVyIGludGVyZmFjZSB0aGUgVXNlck9iamVjdCBpcyBpbiBmYWN0IHRoZSBDdXN0b21lclVzZXJPYmplY3QKICAgICAgICAjIHNvIHdlIG5lZWQgdG8gY29ycmVjdCB0aGlzIGhlcmUgYnkgY3JlYXRpbmcgYSBuZXcgVXNlck9iamVjdAogICAgICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9ICRTZWxmLT57VXNlck9iamVjdH07CiAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyglUGFyYW0pOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZVNob3duIFN0YXJ0SGl0KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbmVlZCBDaGFuZ2VJRHMgb3IgV29ya09yZGVySURzCiAgICBpZiAoICEkUGFyYW17Q2hhbmdlSURzfSAmJiAhJFBhcmFte1dvcmtPcmRlcklEc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIHRoZSBDaGFuZ2VJRHMgb3IgdGhlIFdvcmtPcmRlcklEcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgb25seSBvbmUgb2YgQ2hhbmdlSURzIG9yIFdvcmtPcmRlcklEcyBjYW4gYmUgdXNlZAogICAgaWYgKCAkUGFyYW17Q2hhbmdlSURzfSAmJiAkUGFyYW17V29ya09yZGVySURzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIHRoZSBDaGFuZ2VJRHMgb3IgdGhlIFdvcmtPcmRlcklEcywgbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluIHRoZSBjdXN0b21lciBmcm9udGVuZAogICAgbXkgJUN1c3RvbWVyVXNlclNlcnZpY2VzOwogICAgaWYgKCAkUGFyYW17RnJvbnRlbmR9IGVxICdDdXN0b21lcicgJiYgJFNlbGYtPntDb25maWd9LT57U2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBzZXJ2aWNlcyB0aGUgY3VzdG9tZXIgdXNlciBpcyBhbGxvd2VkIHRvIHVzZQogICAgICAgICVDdXN0b21lclVzZXJTZXJ2aWNlcyA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgRGVmYXVsdFNlcnZpY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVmaW5lIGluY2lkZW50IHNpZ25hbHMsIG5lZWRlZCBmb3Igc2VydmljZXMKICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgKTsKCiAgICAjIHN0b3JlIGVpdGhlciB0aGUgQ2hhbmdlSURzIG9yIHRoZSBXb3JrT3JkZXJJRHMKICAgIG15IEBJRHM7CiAgICBpZiAoICRQYXJhbXtDaGFuZ2VJRHN9ICYmIHJlZiAkUGFyYW17Q2hhbmdlSURzfSBlcSAnQVJSQVknICkgewogICAgICAgIEBJRHMgPSBAeyAkUGFyYW17Q2hhbmdlSURzfSB9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17V29ya09yZGVySURzfSAmJiByZWYgJFBhcmFte1dvcmtPcmRlcklEc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICBASURzID0gQHsgJFBhcmFte1dvcmtPcmRlcklEc30gfTsKICAgIH0KCiAgICAjIGNoZWNrIFNob3dDb2x1bW5zIHBhcmFtZXRlcgogICAgbXkgQFNob3dDb2x1bW5zOwogICAgaWYgKCAkUGFyYW17U2hvd0NvbHVtbnN9ICYmIHJlZiAkUGFyYW17U2hvd0NvbHVtbnN9IGVxICdBUlJBWScgKSB7CiAgICAgICAgQFNob3dDb2x1bW5zID0gQHsgJFBhcmFte1Nob3dDb2x1bW5zfSB9OwogICAgfQoKICAgICMgYnVpbGQgY29sdW1uIGhlYWRlciBibG9ja3MKICAgIGlmIChAU2hvd0NvbHVtbnMpIHsKICAgICAgICBmb3IgbXkgJENvbHVtbiAoQFNob3dDb2x1bW5zKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbiAuICdIZWFkZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3V0cHV0ICAgPSAnJzsKICAgIG15ICRDb3VudGVyICA9IDA7CiAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgIElEOgogICAgZm9yIG15ICRJRCAoQElEcykgewogICAgICAgICRDb3VudGVyKys7CiAgICAgICAgaWYgKCAkQ291bnRlciA+PSAkUGFyYW17U3RhcnRIaXR9ICYmICRDb3VudGVyIDwgKCAkUGFyYW17UGFnZVNob3dufSArICRQYXJhbXtTdGFydEhpdH0gKSApIHsKCiAgICAgICAgICAgICMgdG8gc3RvcmUgYWxsIGRhdGEKICAgICAgICAgICAgbXkgJURhdGE7CgogICAgICAgICAgICAjIHRvIHN0b3JlIGRhdGEgb2Ygc3ViLWVsZW1lbnRzCiAgICAgICAgICAgIG15ICVTdWJFbGVtZW50RGF0YTsKCiAgICAgICAgICAgIG15ICRDaGFuZ2VJRDsKICAgICAgICAgICAgaWYgKCAkUGFyYW17Q2hhbmdlSURzfSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBjaGFuZ2UgaWQKICAgICAgICAgICAgICAgICRDaGFuZ2VJRCA9ICRJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtXb3JrT3JkZXJJRHN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgICAgICAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJElELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgICAgICAgICAjIGFkZCB3b3Jrb3JkZXIgZGF0YQogICAgICAgICAgICAgICAgJURhdGEgPSAoICVEYXRhLCAleyRXb3JrT3JkZXJ9ICk7CgogICAgICAgICAgICAgICAgIyBzZXQgY2hhbmdlIGlkIGZyb20gd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgICAgICRDaGFuZ2VJRCA9ICRXb3JrT3JkZXItPntDaGFuZ2VJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICAgICAgICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgSUQgaWYgISRDaGFuZ2U7CgogICAgICAgICAgICAjIGFkZCBjaGFuZ2UgZGF0YSwKICAgICAgICAgICAgIyAoIGxldCB3b3Jrb3JkZXIgZGF0YSBvdmVyd3JpdGUKICAgICAgICAgICAgIyBzb21lIGNoYW5nZSBhdHRyaWJ1dGVzLCBpLmUuIFBsYW5uZWRTdGFydFRpbWUsIGV0Yy4uLiApCiAgICAgICAgICAgICVEYXRhID0gKCAleyRDaGFuZ2V9LCAlRGF0YSApOwoKICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhIGZvciBuZWVkZWQgdXNlciB0eXBlcwogICAgICAgICAgICBVU0VSX1RZUEU6CiAgICAgICAgICAgIGZvciBteSAkVXNlclR5cGUgKHF3KENoYW5nZUJ1aWxkZXIgQ2hhbmdlTWFuYWdlciBXb3JrT3JkZXJBZ2VudCkpIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIFVzZXJUeXBlIGF0dHJpYnV0ZSBleGlzdHMgZWl0aGVyIGluIGNoYW5nZSBvciB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgIGlmICggISRDaGFuZ2UtPnsgJFVzZXJUeXBlIC4gJ0lEJyB9ICYmICEkRGF0YXsgJFVzZXJUeXBlIC4gJ0lEJyB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgVVNFUl9UWVBFOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJENoYW5nZS0+eyAkVXNlclR5cGUgLiAnSUQnIH0gfHwgJERhdGF7ICRVc2VyVHlwZSAuICdJRCcgfSwKICAgICAgICAgICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAkRGF0YXsgJFVzZXJUeXBlIC4gJ1VzZXJMb2dpbicgfSAgICAgICAgPSAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdVc2VyRmlyc3RuYW1lJyB9ICAgID0gJFVzZXJ7VXNlckZpcnN0bmFtZX07CiAgICAgICAgICAgICAgICAkRGF0YXsgJFVzZXJUeXBlIC4gJ1VzZXJMYXN0bmFtZScgfSAgICAgPSAkVXNlcntVc2VyTGFzdG5hbWV9OwogICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdMZWZ0UGFyZW50aGVzaXMnIH0gID0gJygnOwogICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdSaWdodFBhcmVudGhlc2lzJyB9ID0gJyknOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRvIHN0b3JlIHRoZSBsaW5rZWQgc2VydmljZSBkYXRhCiAgICAgICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0ge307CgogICAgICAgICAgICBteSBAV29ya09yZGVySURzOwoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgY29tYmluZWQgbGlua2VkIHNlcnZpY2VzIGRhdGEgZnJvbSBhbGwgd29ya29yZGVycyBvZiB0aGlzIGNoYW5nZQogICAgICAgICAgICBpZiAoICRQYXJhbXtDaGFuZ2VJRHN9ICkgewogICAgICAgICAgICAgICAgQFdvcmtPcmRlcklEcyA9IEB7ICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc3RvcmUgb25seSB0aGUgbGlua2VkIHNlcnZpY2VzIGZvciB0aGlzIHdvcmtvcmRlcgogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtXb3JrT3JkZXJJRHN9ICkgewogICAgICAgICAgICAgICAgQFdvcmtPcmRlcklEcyA9ICgkSUQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHN0b3JlIHRoZSBjb21iaW5lZCBsaW5rZWQgc2VydmljZXMgZGF0YQogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEIChAV29ya09yZGVySURzKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlua2VkIG9iamVjdHMgb2YgdGhpcyB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgICAgICAgICBPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIEtleSAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgT0JKRUNUOgogICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3QgKCBrZXlzICV7JExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXJ9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIG9ubHkgc2hvdyBsaW5rZWQgc2VydmljZXMgb2Ygd29ya29yZGVyCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0IG5lICdTZXJ2aWNlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1Q7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBMSU5LVFlQRToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RJT046CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJXsgJExpbmtMaXN0V2l0aERhdGFXb3JrT3JkZXItPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rTGlzdFdpdGhEYXRhV29ya09yZGVyLT57JE9iamVjdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbWJpbmUgdGhlIGxpbmtlZCBvYmplY3QgZGF0YSBmcm9tIGFsbCB3b3Jrb3JkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtMaXN0V2l0aERhdGEtPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkTGlua0xpc3RXaXRoRGF0YVdvcmtPcmRlci0+eyRPYmplY3R9LT57JExpbmtUeXBlfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnskRGlyZWN0aW9ufS0+eyRJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHVuaXF1ZSBzZXJ2aWNlIGlkcwogICAgICAgICAgICBteSAlVW5pcXVlU2VydmljZUlEczsKICAgICAgICAgICAgbXkgJFNlcnZpY2VzUmVmID0gJExpbmtMaXN0V2l0aERhdGEtPntTZXJ2aWNlfSB8fCB7fTsKICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXskU2VydmljZXNSZWZ9ICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgICAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRTZXJ2aWNlc1JlZi0+eyRMaW5rVHlwZX07CgogICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFNlcnZpY2VzUmVmLT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgICAgICAgICAjIGNvbGxlY3QgdW5pcXVlIHNlcnZpY2UgaWRzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVW5pcXVlU2VydmljZUlEc3skU2VydmljZUlEfSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIGRhdGEgZm9yIGVhY2ggc2VydmljZQogICAgICAgICAgICBteSBAU2VydmljZXNEYXRhOwogICAgICAgICAgICBTRVJWSUNFSUQ6CiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICgga2V5cyAlVW5pcXVlU2VydmljZUlEcyApIHsKCiAgICAgICAgICAgICAgICAjIGluIHRoZSBjdXN0b21lciBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGcm9udGVuZH0gZXEgJ0N1c3RvbWVyJwogICAgICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1Nob3dPbmx5Q2hhbmdlc1dpdGhBbGxvd2VkU2VydmljZXN9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBzaG93IHRoaXMgc2VydmljZSBpZiBjdXN0b21lciBpcyBub3QgYWxsb3dlZCB0byB1c2UgaXQKICAgICAgICAgICAgICAgICAgICBuZXh0IFNFUlZJQ0VJRCBpZiAhJEN1c3RvbWVyVXNlclNlcnZpY2VzeyRTZXJ2aWNlSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBjdXJyZW50IGluY2lkZW50IHNpZ25hbAogICAgICAgICAgICAgICAgJFNlcnZpY2VEYXRhe0N1ckluY2lTaWduYWx9ID0gJEluY2lTaWduYWxzeyAkU2VydmljZURhdGF7Q3VySW5jaVN0YXRlVHlwZX0gfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIHNlcnZpY2UgZGF0YQogICAgICAgICAgICAgICAgcHVzaCBAU2VydmljZXNEYXRhLCBcJVNlcnZpY2VEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNvcnQgc2VydmljZXMgZGF0YSBieSBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAgQFNlcnZpY2VzRGF0YSA9IHNvcnQgeyAkYS0+e05hbWV9IGNtcCAkYi0+e05hbWV9IH0gQFNlcnZpY2VzRGF0YTsKCiAgICAgICAgICAgICMgaW4gdGhlIGN1c3RvbWVyIGZyb250ZW5kCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXtGcm9udGVuZH0gZXEgJ0N1c3RvbWVyJwogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U2hvd09ubHlDaGFuZ2VzV2l0aEFsbG93ZWRTZXJ2aWNlc30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgZG8gbm90IHNob3cgdGhlIGNoYW5nZSBpZiBpdCBoYXMgbm8gc2VydmljZXMKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgIUBTZXJ2aWNlc0RhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc3RvcmUgc2VydmljZXMgZGF0YQogICAgICAgICAgICAkU3ViRWxlbWVudERhdGF7U2VydmljZXN9ID0gXEBTZXJ2aWNlc0RhdGE7CgogICAgICAgICAgICAjIHNldCBjc3MgY2xhc3Mgb2YgdGhlIHJvdwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaHBhc3NpdmUnID8gJ3NlYXJjaGFjdGl2ZScgOiAnc2VhcmNocGFzc2l2ZSc7CgogICAgICAgICAgICAjIGJ1aWxkIHJlY29yZCBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBjb2x1bW4gcmVjb3JkIGJsb2NrcwogICAgICAgICAgICBpZiAoQFNob3dDb2x1bW5zKSB7CiAgICAgICAgICAgICAgICBDT0xVTU46CiAgICAgICAgICAgICAgICBmb3IgbXkgJENvbHVtbiAoQFNob3dDb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVjb3JkJyAuICRDb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGlzIGNvbHVtbiBjb250YWlucyBzdWItZWxlbWVudHMKICAgICAgICAgICAgICAgICAgICBpZiAoICRTdWJFbGVtZW50RGF0YXskQ29sdW1ufSAmJiByZWYgJFN1YkVsZW1lbnREYXRheyRDb2x1bW59IGVxICdBUlJBWScgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFN1YkVsZW1lbnQgKCBAeyAkU3ViRWxlbWVudERhdGF7JENvbHVtbn0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgc3ViLWVsZW1lbnRzIG9mIGNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbiAuICdTdWJFbGVtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskU3ViRWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3QgZGlzcGxheSBjb2x1bW5zIGFzIGxpbmtzIGluIHRoZSBjdXN0b21lciBmcm9udGVuZAogICAgICAgICAgICAgICAgICAgIG5leHQgQ09MVU1OIGlmICRQYXJhbXtGcm9udGVuZH0gZXEgJ0N1c3RvbWVyJzsKCiAgICAgICAgICAgICAgICAgICAgIyBzaG93IGxpbmtzIGlmIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uIC4gJ0xpbmtTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZWNvcmQnIC4gJENvbHVtbiAuICdMaW5rRW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdXNlIHRlbXBsYXRlCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdTbWFsbCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAkU2VsZi0+e1ZpZXdUeXBlfSwKICAgICAgICAgICAgQ29sdW1uQ291bnQgPT4gc2NhbGFyIEBTaG93Q29sdW1ucywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNVGVtcGxhdGVPdmVydmlld1NtYWxsLnBtLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNVGVtcGxhdGVPdmVydmlld1NtYWxsLnBtLHYgMS41IDIwMTAvMDQvMjcgMjA6MzY6NTcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01UZW1wbGF0ZU92ZXJ2aWV3U21hbGw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBVc2VyT2JqZWN0IE1haW5PYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZVNob3duIFN0YXJ0SGl0KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbmVlZCBUZW1wbGF0ZUlEcwogICAgaWYgKCAhJFBhcmFte1RlbXBsYXRlSURzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgdGhlIFRlbXBsYXRlSURzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzdG9yZSB0aGUgdGVtcGxhdGUgSURzCiAgICBteSBASURzID0gQHsgJFBhcmFte1RlbXBsYXRlSURzfSB9OwoKICAgICMgY2hlY2sgU2hvd0NvbHVtbnMgcGFyYW1ldGVyCiAgICBteSBAU2hvd0NvbHVtbnM7CiAgICBpZiAoICRQYXJhbXtTaG93Q29sdW1uc30gJiYgcmVmICRQYXJhbXtTaG93Q29sdW1uc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICBAU2hvd0NvbHVtbnMgPSBAeyAkUGFyYW17U2hvd0NvbHVtbnN9IH07CiAgICB9CgogICAgIyBidWlsZCBjb2x1bW4gaGVhZGVyIGJsb2NrcwogICAgaWYgKEBTaG93Q29sdW1ucykgewogICAgICAgIGZvciBteSAkQ29sdW1uIChAU2hvd0NvbHVtbnMpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uIC4gJ0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPdXRwdXQgICA9ICcnOwogICAgbXkgJENvdW50ZXIgID0gMDsKICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgSUQ6CiAgICBmb3IgbXkgJElEIChASURzKSB7CiAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICBpZiAoICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0gJiYgJENvdW50ZXIgPCAoICRQYXJhbXtQYWdlU2hvd259ICsgJFBhcmFte1N0YXJ0SGl0fSApICkgewoKICAgICAgICAgICAgIyBkaXNwbGF5IHRoZSB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgIG15ICRUZW1wbGF0ZSA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVEYXRhID0gJXskVGVtcGxhdGV9OwoKICAgICAgICAgICAgIyBodW1hbiByZWFkYWJsZSB2YWxpZGl0eQogICAgICAgICAgICAkRGF0YXtWYWxpZH0gPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkSUQgPT4gJERhdGF7VmFsaWRJRH0gKTsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YSBmb3IgbmVlZGVkIHVzZXIgdHlwZXMKICAgICAgICAgICAgVVNFUl9UWVBFOgogICAgICAgICAgICBmb3IgbXkgJFVzZXJUeXBlIChxdyhDcmVhdGVCeSBDaGFuZ2VCeSkpIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIFVzZXJUeXBlIGF0dHJpYnV0ZSBleGlzdHMgaW4gdGhlIHRlbXBsYXRlCiAgICAgICAgICAgICAgICBuZXh0IFVTRVJfVFlQRSBpZiAhJERhdGF7JFVzZXJUeXBlfTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICREYXRheyRVc2VyVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdVc2VyTG9naW4nIH0gICAgICAgID0gJFVzZXJ7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnVXNlckZpcnN0bmFtZScgfSAgICA9ICRVc2Vye1VzZXJGaXJzdG5hbWV9OwogICAgICAgICAgICAgICAgJERhdGF7ICRVc2VyVHlwZSAuICdVc2VyTGFzdG5hbWUnIH0gICAgID0gJFVzZXJ7VXNlckxhc3RuYW1lfTsKICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnTGVmdFBhcmVudGhlc2lzJyB9ICA9ICcoJzsKICAgICAgICAgICAgICAgICREYXRheyAkVXNlclR5cGUgLiAnUmlnaHRQYXJlbnRoZXNpcycgfSA9ICcpJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgY3NzIGNsYXNzIG9mIHRoZSByb3cKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJyA/ICdzZWFyY2hhY3RpdmUnIDogJ3NlYXJjaHBhc3NpdmUnOwoKICAgICAgICAgICAgIyBidWlsZCByZWNvcmQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVpbGQgY29sdW1uIHJlY29yZCBibG9ja3MKICAgICAgICAgICAgaWYgKEBTaG93Q29sdW1ucykgewogICAgICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKEBTaG93Q29sdW1ucykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlY29yZCcgLiAkQ29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB1c2UgdGVtcGxhdGUKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01UZW1wbGF0ZU92ZXJ2aWV3U21hbGwnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJFNlbGYtPntWaWV3VHlwZX0sCiAgICAgICAgICAgIENvbHVtbkNvdW50ID0+IHNjYWxhciBAU2hvd0NvbHVtbnMsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNV29ya09yZGVyTWVudUdlbmVyaWMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01Xb3JrT3JkZXJNZW51R2VuZXJpYy5wbSx2IDEuNSAyMDA5LzExLzIzIDEzOjMwOjQzIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTVdvcmtPcmRlck1lbnVHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBXb3JrT3JkZXJPYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFdvcmtPcmRlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgdGhlIHJlbGV2YW50IGFjdGlvbgogICAgbXkgJEZyb250ZW5kQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICggJEZyb250ZW5kQ29uZmlnICYmICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdiBmcm9tIHRoZSBmcm9udGVuZCBjb25maWd1cmF0aW9uCiAgICAgICAgJFJlcXVpcmVkUHJpdiA9ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gZXEgJ0FnZW50TGlua09iamVjdCcgKSB7CgogICAgICAgICMgdGhlIExpbmstbGluayBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgaXQgaXMgbm90IHNwZWNpZmljIHRvIElUU01DaGFuZ2UKICAgICAgICAkUmVxdWlyZWRQcml2ID0gJ3J3JzsKICAgIH0KCiAgICBteSAkQWNjZXNzOwogICAgaWYgKCAhJFJlcXVpcmVkUHJpdiApIHsKCiAgICAgICAgIyBEaXNwbGF5IHRoZSBtZW51LWxpbmssIHdoZW4gbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkCiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucywgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHByaXZpbGVnZQogICAgICAgICRBY2Nlc3MgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICRSZXF1aXJlZFByaXYsCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJ9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yLCB3aGVuIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBtZW51IGl0ZW0KICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17V29ya09yZGVyfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNV29ya09yZGVyTWVudVdpdGhQZXJtaXNzaW9uRnJvbUNoYW5nZS5wbQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTVdvcmtPcmRlck1lbnVXaXRoUGVybWlzc2lvbkZyb21DaGFuZ2UucG0sdiAxLjUgMjAxMC8wMS8yNiAxNDoxNzoyNCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXJNZW51V2l0aFBlcm1pc3Npb25Gcm9tQ2hhbmdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBXb3JrT3JkZXJPYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFdvcmtPcmRlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgdGhlIHJlbGV2YW50IGFjdGlvbgogICAgbXkgJEZyb250ZW5kQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICgkRnJvbnRlbmRDb25maWcpIHsKCiAgICAgICAgIyBnZXQgdGhlIHJlcXVpcmVkIHByaXYgZnJvbSB0aGUgZnJvbnRlbmQgY29uZmlndXJhdGlvbgogICAgICAgICRSZXF1aXJlZFByaXYgPSAkRnJvbnRlbmRDb25maWctPntQZXJtaXNzaW9ufTsKICAgIH0KCiAgICBteSAkQWNjZXNzOwogICAgaWYgKCAhJFJlcXVpcmVkUHJpdiApIHsKCiAgICAgICAgIyBEaXNwbGF5IHRoZSBtZW51LWxpbmssIHdoZW4gbm8gcHJpdmlsZWdlIGlzIHJlcXVpcmVkCiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucywgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHByaXZpbGVnZQogICAgICAgICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRSZXF1aXJlZFByaXYsCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtXb3JrT3JkZXJ9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkQWNjZXNzOwoKICAgICMgb3V0cHV0IG1lbnUgYmxvY2sKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnUnICk7CgogICAgIyBvdXRwdXQgc2VwZXJhdG9yLCB3aGVuIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBtZW51IGl0ZW0KICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17V29ya09yZGVyfSB9LAogICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNV29ya09yZGVyTWVudVdpdGhUYWtlUGVybWlzc2lvbi5wbQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTVdvcmtPcmRlck1lbnVXaXRoVGFrZVBlcm1pc3Npb24ucG0sdiAxLjEgMjAxMC8wMS8yNiAxNDoxNzoyNCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Xb3JrT3JkZXJNZW51V2l0aFRha2VQZXJtaXNzaW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBXb3JrT3JkZXJPYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFdvcmtPcmRlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBmb3IgdGhlIHJlbGV2YW50IGFjdGlvbgogICAgbXkgJEZyb250ZW5kQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTVdvcmtPcmRlcjo6RnJvbnRlbmQ6OiRQYXJhbXtDb25maWd9LT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSByZXF1aXJlZCBwcml2aWxlZ2UsICdybycgb3IgJ3J3JwogICAgbXkgJFJlcXVpcmVkUHJpdjsKICAgIGlmICggJEZyb250ZW5kQ29uZmlnICYmICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAjIGdldCB0aGUgcmVxdWlyZWQgcHJpdiBmcm9tIHRoZSBmcm9udGVuZCBjb25maWd1cmF0aW9uCiAgICAgICAgJFJlcXVpcmVkUHJpdiA9ICRGcm9udGVuZENvbmZpZy0+e1Blcm1pc3Npb259OwogICAgfQoKICAgIG15ICRBY2Nlc3M7CiAgICBpZiAoICEkUmVxdWlyZWRQcml2ICkgewoKICAgICAgICAjIERpc3BsYXkgdGhlIG1lbnUtbGluaywgd2hlbiBubyBwcml2aWxlZ2UgaXMgcmVxdWlyZWQKICAgICAgICAkQWNjZXNzID0gMTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zLCBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlCiAgICAgICAgIyBxdWVyeSB0aGUgcGVybWlzc2lvbiBtb2R1bGVzIHJlZ2lzdGVyZWQgaW4gJ0lUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uJwogICAgICAgICRBY2Nlc3MgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICA9PiAkUmVxdWlyZWRQcml2LAogICAgICAgICAgICBQZXJtaXNzaW9uUmVnaXN0cnkgPT4gJ0lUU01Xb3JrT3JkZXI6OlRha2VQZXJtaXNzaW9uJywKICAgICAgICAgICAgV29ya09yZGVySUQgICAgICAgID0+ICRQYXJhbXtXb3JrT3JkZXJ9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKCiAgICAjIG91dHB1dCBzZXBlcmF0b3IsIHdoZW4gdGhpcyBpcyBub3QgdGhlIGZpcnN0IG1lbnUgaXRlbQogICAgaWYgKCAkUGFyYW17Q291bnRlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgIH0KCiAgICAjIG91dHB1dCBtZW51IGl0ZW0KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWVudUl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7ICRQYXJhbXtXb3JrT3JkZXJ9IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRNZW51SVRTTUNoYW5nZS5wbSAtIElUU01DaGFuZ2Ugc3BlY2lmaWMgbW9kdWxlIGZvciB0aGUgdGlja2V0IG1lbnUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IFRpY2tldE1lbnVJVFNNQ2hhbmdlLnBtLHYgMS43IDIwMDkvMTEvMjMgMTM6MzA6NDMgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEIEdyb3VwT2JqZWN0IFRpY2tldE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1RpY2tldH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgZnJvbnRlbmQgbW9kdWxlIGlzIHJlZ2lzdGVyZWQsIGlmIG5vdCwgZG8gbm90IHNob3cgYWN0aW9uCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSApIHsKICAgICAgICBteSAkTW9kdWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfTsKICAgICAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9IGlmICEkTW9kdWxlOwogICAgfQoKICAgICMgdGhlIGxpbmsgaXMgc2hvd24gb25seSBmb3IgdGhlIGNvbmZpZ3VyZWQgdGlja2V0IHR5cGVzLAogICAgIyBzbyB0aGUgdGlja2V0IG5lZWRzIHRvIGhhdmUgYSB0eXBlLgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJFBhcmFte1RpY2tldH0tPntUeXBlfTsKCiAgICAjIGdldCBhbmQgY2hlY2sgdGhlIGxpc3Qgb2YgcmVsZXZhbnQgdGlja2V0IHR5cGVzCiAgICBteSAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJyk7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfSBpZiAhJEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlczsKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgcmVmICRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMgbmUgJ0FSUkFZJzsKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgIUB7JEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlc307CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSB0aWNrZXQncyB0eXBlIGlzIHJlbGV2YW50CiAgICBteSAlSXNSZWxldmFudCA9IG1hcCB7ICRfID0+IDEgfSBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRJc1JlbGV2YW50eyAkUGFyYW17VGlja2V0fS0+e1R5cGV9IH07CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBteSAkRnJvbnRlbmRDb25maWcKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JFBhcmFte0NvbmZpZ30tPntBY3Rpb259Iik7CiAgICBpZiAoICRGcm9udGVuZENvbmZpZyAmJiAkRnJvbnRlbmRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgPT4gJEZyb250ZW5kQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CiAgICB9CgogICAgIyBkaXNwbGF5IHRoZSBtZW51IGl0ZW0KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTWVudScsCiAgICAgICAgRGF0YSA9PiB7fSwKICAgICk7CiAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7ICV7ICRQYXJhbXtDb25maWd9IH0sICV7ICRQYXJhbXtUaWNrZXR9IH0sICVQYXJhbSwgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJVFNNQ2hhbmdlLnBtIC0gcHJvdmlkZXMgZ2VuZXJpYyBIVE1MIG91dHB1dCBmb3IgSVRTTUNoYW5nZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGF5b3V0SVRTTUNoYW5nZS5wbSx2IDEuNDQgMjAxMC8wNi8zMCAyMToyMDoxMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40NCAkKSBbMV07Cgo9b3ZlciA0Cgo9aXRlbSBJVFNNQ2hhbmdlQnVpbGRXb3JrT3JkZXJHcmFwaCgpCgpyZXR1cm5zIGEgb3V0cHV0IHN0cmluZyBmb3IgV29ya09yZGVyIGdyYXBoCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPklUU01DaGFuZ2VCdWlsZFdvcmtPcmRlckdyYXBoKAogICAgICAgIENoYW5nZSA9PiAkQ2hhbmdlUmVmLAogICAgICAgIFdvcmtPcmRlck9iamVjdCA9PiAkV29ya09yZGVyT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBJVFNNQ2hhbmdlQnVpbGRXb3JrT3JkZXJHcmFwaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhUaW1lT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIGNoYW5nZQogICAgbXkgJENoYW5nZSA9ICRQYXJhbXtDaGFuZ2V9OwogICAgaWYgKCAhJENoYW5nZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB3b3Jrb3JkZXIgb2JqZWN0CiAgICBpZiAoICEkUGFyYW17V29ya09yZGVyT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVyT2JqZWN0IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzdG9yZSB3b3Jrb3JkZXIgb2JqZWN0IGxvY2FsbHkKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSA9ICRQYXJhbXtXb3JrT3JkZXJPYmplY3R9OwoKICAgICMgY2hlY2sgaWYgd29ya29yZGVycyBhcmUgYXZhaWxhYmxlCiAgICByZXR1cm4gaWYgISRDaGFuZ2UtPntXb3JrT3JkZXJDb3VudH07CgogICAgIyBleHRyYSBjaGVjayBmb3IgQVJSQVktcmVmCiAgICByZXR1cm4gaWYgcmVmICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9IG5lICdBUlJBWSc7CgogICAgIyBoYXNoIGZvciBzbWFsbGVzdCB0aW1lCiAgICBteSAlVGltZTsKCiAgICBUSU1FVFlQRToKICAgIGZvciBteSAkVGltZVR5cGUgKHF3KFN0YXJ0IEVuZCkpIHsKCiAgICAgICAgIyBhY3R1YWwgdGltZSBub3Qgc2V0LCBzbyB3ZSBjYW4gdXNlIHBsYW5uZWQKICAgICAgICBpZiAoICEkQ2hhbmdlLT57IkFjdHVhbCR7VGltZVR5cGV9VGltZSJ9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aW1lIGlzIHNldAogICAgICAgICAgICBuZXh0IFRJTUVUWVBFIGlmICEkQ2hhbmdlLT57IlBsYW5uZWQke1RpbWVUeXBlfVRpbWUifTsKCiAgICAgICAgICAgICMgdHJhbnNsYXRlIHRvIHRpbWVzdGFtcAogICAgICAgICAgICAkVGltZXsiJHtUaW1lVHlwZX1UaW1lIn0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ2hhbmdlLT57IlBsYW5uZWQke1RpbWVUeXBlfVRpbWUifSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMganVtcCB0byBuZXh0IHR5cGUKICAgICAgICAgICAgbmV4dCBUSU1FVFlQRTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNsYXRlIHBsYW5uZWQgdGltZSB0byB0aW1lc3RhbXAgZm9yIGVxdWF0aW9uCiAgICAgICAgJFRpbWV7IlBsYW5uZWQke1RpbWVUeXBlfVRpbWUifSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICBTdHJpbmcgPT4gJENoYW5nZS0+eyJQbGFubmVkJHtUaW1lVHlwZX1UaW1lIn0sCiAgICAgICAgKTsKCiAgICAgICAgIyB0cmFuc2xhdGUgYWN0dWFsIHRpbWUgdG8gdGltZXN0YW1wIGZvciBlcXVhdGlvbgogICAgICAgICRUaW1leyJBY3R1YWwke1RpbWVUeXBlfVRpbWUifSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICBTdHJpbmcgPT4gJENoYW5nZS0+eyJBY3R1YWwke1RpbWVUeXBlfVRpbWUifSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHNtYWxsZXN0IHN0YXJ0IHRpbWUKICAgIGlmICggISRUaW1le1N0YXJ0VGltZX0gKSB7CiAgICAgICAgJFRpbWV7U3RhcnRUaW1lfQogICAgICAgICAgICA9ICggJFRpbWV7UGxhbm5lZFN0YXJ0VGltZX0gbHQgJFRpbWV7QWN0dWFsU3RhcnRUaW1lfSApCiAgICAgICAgICAgID8gJFRpbWV7UGxhbm5lZFN0YXJ0VGltZX0KICAgICAgICAgICAgOiAkVGltZXtBY3R1YWxTdGFydFRpbWV9OwogICAgfQoKICAgICMgZ2V0IGhpZ2hlc3QgZW5kIHRpbWUKICAgIGlmICggISRUaW1le0VuZFRpbWV9ICkgewogICAgICAgICRUaW1le0VuZFRpbWV9CiAgICAgICAgICAgID0gKCAkVGltZXtQbGFubmVkRW5kVGltZX0gZ3QgJFRpbWV7QWN0dWFsRW5kVGltZX0gKQogICAgICAgICAgICA/ICRUaW1le1BsYW5uZWRFbmRUaW1lfQogICAgICAgICAgICA6ICRUaW1le0FjdHVhbEVuZFRpbWV9OwogICAgfQoKICAgICMgY2hlY2sgZm9yIHJlYWwgZW5kIG9mIGVuZCB0aW1lIGZvciBzY2FsZSBhbmQgZ3JhcGggaXRlbXMKICAgICMgb25seSBpZiBBY3R1YWxTdGFydFRpbWUgaXMgc2V0CiAgICBpZiAoCiAgICAgICAgJFRpbWV7QWN0dWFsU3RhcnRUaW1lfQogICAgICAgICYmICEkVGltZXtBY3R1YWxFbmRUaW1lfQogICAgICAgICYmICggJFRpbWV7RW5kVGltZX0gbHQgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFRpbWV7RW5kVGltZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICB9CgogICAgIyBjYWxjdWxhdGUgdGlja3MgZm9yIGNoYW5nZQogICAgbXkgJENoYW5nZVRpY2tzID0gJFNlbGYtPl9JVFNNQ2hhbmdlR2V0Q2hhbmdlVGlja3MoCiAgICAgICAgU3RhcnQgPT4gJFRpbWV7U3RhcnRUaW1lfSwKICAgICAgICBFbmQgICA9PiAkVGltZXtFbmRUaW1lfSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgdmFsaWQgdGlja3MKICAgIGlmICggISRDaGFuZ2VUaWNrcyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1VuYWJsZSB0byBjYWxjdWxhdGUgdGltZSBzY2FsZS4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVycyBvZiBjaGFuZ2UKICAgIG15IEBXb3JrT3JkZXJzOwogICAgV09SS09SREVSSUQ6CiAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHsgJENoYW5nZS0+e1dvcmtPcmRlcklEc30gfSApIHsKICAgICAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgcHVzaCBAV29ya09yZGVycywgJFdvcmtPcmRlcjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgc2V0dGluZ3MKICAgIG15ICRDaGFuZ2Vab29tQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tJyk7CgogICAgIyBjaGVjayBjb25maWcgc2V0dGluZwogICAgaWYgKCAhJENoYW5nZVpvb21Db25maWcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFN5c0NvbmZpZyBzZXR0aW5ncyBmb3IgSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGdyYXBoIGNvbmZpZyBzZXR0aW5nCiAgICBpZiAoICEkQ2hhbmdlWm9vbUNvbmZpZy0+e1dvcmtPcmRlckdyYXBofSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU3lzQ29uZmlnIHNldHRpbmdzIGZvciAnCiAgICAgICAgICAgICAgICAuICdJVFNNQ2hhbmdlOjpGcm9udGVuZDo6QWdlbnRJVFNNQ2hhbmdlWm9vbSMjI1dvcmtPcmRlckdyYXBoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB2YWxpZGl0eSBzZXR0aW5ncyBvZiBncmFwaCBzZXR0aW5ncwogICAgbXkgJVdvcmtPcmRlckdyYXBoQ2hlY2sgPSAoCiAgICAgICAgVGltZUxpbmVDb2xvciAgICAgICAgICAgPT4gJyNbYS1mQS1GXGRdezZ9JywKICAgICAgICBUaW1lTGluZVdpZHRoICAgICAgICAgICA9PiAnXGR7MSwyfScsCiAgICAgICAgdW5kZWZpbmVkX3BsYW5uZWRfY29sb3IgPT4gJyNbYS1mQS1GXGRdezZ9JywKICAgICAgICB1bmRlZmluZWRfYWN0dWFsX2NvbG9yICA9PiAnI1thLWZBLUZcZF17Nn0nLAogICAgKTsKCiAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIGdyYXBoIHNldHRpbmdzCiAgICBteSAkV29ya09yZGVyR3JhcGhDb25maWcgPSAkQ2hhbmdlWm9vbUNvbmZpZy0+e1dvcmtPcmRlckdyYXBofTsKICAgIGZvciBteSAkR3JhcGhTZXR0aW5nICgga2V5cyAlV29ya09yZGVyR3JhcGhDaGVjayApIHsKCiAgICAgICAgIyBjaGVjayBleGlzdGVuc2Ugb2YgY29uZmlnIHNldHRpbmcKICAgICAgICBpZiAoICEkV29ya09yZGVyR3JhcGhDb25maWctPnskR3JhcGhTZXR0aW5nfSApIHsKCiAgICAgICAgICAgICMgZGlzcGxheSBlcnJvciBhbmQgcmV0dXJuCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFN5c0NvbmZpZyBzZXR0aW5nICckR3JhcGhTZXR0aW5nJyBpbiAiCiAgICAgICAgICAgICAgICAgICAgLiAiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20jIyNXb3JrT3JkZXJHcmFwaCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHZhbGlkaXR5IG9mIGNvbmZpZyBzZXR0aW5nCiAgICAgICAgaWYgKAogICAgICAgICAgICAkV29ya09yZGVyR3JhcGhDb25maWctPnskR3JhcGhTZXR0aW5nfQogICAgICAgICAgICAhfiBteyBcQSAkV29ya09yZGVyR3JhcGhDaGVja3skR3JhcGhTZXR0aW5nfSBceiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGRpc3BsYXkgZXJyb3IgYW5kIHJldHVybgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU3lzQ29uZmlnIHNldHRpbmcgJyRHcmFwaFNldHRpbmcnIGlzIGludmFsaWQgaW4gIgogICAgICAgICAgICAgICAgICAgIC4gIklUU01DaGFuZ2U6OkZyb250ZW5kOjpBZ2VudElUU01DaGFuZ2Vab29tIyMjV29ya09yZGVyR3JhcGghIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbXB1dGUgZWZmZWNpdmUgbGFiZWwgd2lkdGgKICAgIG15ICRMYWJlbFdpZHRoID0gNjA7CiAgICBpZiAoICRDaGFuZ2Vab29tQ29uZmlnLT57V29ya09yZGVyU3RhdGV9ICYmICRDaGFuZ2Vab29tQ29uZmlnLT57V29ya09yZGVyVGl0bGV9ICkgewogICAgICAgICRMYWJlbFdpZHRoICs9IDE4MDsKICAgIH0KICAgIGVsc2lmICggJENoYW5nZVpvb21Db25maWctPntXb3JrT3JkZXJTdGF0ZX0gKSB7CiAgICAgICAgJExhYmVsV2lkdGggKz0gNzA7CiAgICB9CiAgICBlbHNpZiAoICRDaGFuZ2Vab29tQ29uZmlnLT57V29ya09yZGVyVGl0bGV9ICkgewogICAgICAgICRMYWJlbFdpZHRoICs9IDEyNTsKICAgIH0KCiAgICAjIGxvYWQgZ3JhcGggc2tlbGV0b24KICAgICRTZWxmLT5CbG9jaygKICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJHcmFwaCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIExhYmVsV2lkdGggID0+ICRMYWJlbFdpZHRoLAogICAgICAgICAgICBMYWJlbE1hcmdpbiA9PiAkTGFiZWxXaWR0aCArIDIsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBjcmVhdGUgY29sb3IgZGVmaW5pdGlvbnMgZm9yIGFsbCBjb25maWd1cmVkIHdvcmtvcmRlciB0eXBlcwogICAgbXkgJFdvcmtPcmRlclR5cGVzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJUeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKSB8fCBbXTsKCiAgICAjIGNyZWF0ZSBjc3MgZGVmaW5pdGlvbnMgZm9yIHdvcmtvcmRlciB0eXBlcwogICAgV09SS09SREVSVFlQRToKICAgIGZvciBteSAkV29ya09yZGVyVHlwZSAoIEB7JFdvcmtPcmRlclR5cGVzfSApIHsKCiAgICAgICAgIyBjaGVjayB3b3Jrb3JkZXIgdHlwZQogICAgICAgIG5leHQgV09SS09SREVSVFlQRSBpZiAhJFdvcmtPcmRlclR5cGU7CiAgICAgICAgbmV4dCBXT1JLT1JERVJUWVBFIGlmICEkV29ya09yZGVyVHlwZS0+e1ZhbHVlfTsKCiAgICAgICAgIyBnZXQgbmFtZSBvZiB3b3Jrb3JkZXIgdHlwZQogICAgICAgIG15ICRXb3JrT3JkZXJUeXBlTmFtZSA9ICRXb3JrT3JkZXJUeXBlLT57VmFsdWV9OwoKICAgICAgICAjIGNoZWNrIGNvbnRlbnRzIG9mIG5hbWUKICAgICAgICBuZXh0IFdPUktPUkRFUlRZUEUgaWYgISRXb3JrT3JkZXJUeXBlTmFtZTsKCiAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJDb2xvciAocXcoIF9wbGFubmVkIF9hY3R1YWwgKSkgewoKICAgICAgICAgICAgIyBnZXQgY29uZmlndXJlZCBvciBmYWxsYmFjayBwbGFubmVkIGNvbG9yIGZvciB3b3Jrb3JkZXIKICAgICAgICAgICAgbXkgJFdvcmtPcmRlclR5cGVDb2xvcgogICAgICAgICAgICAgICAgPSAkV29ya09yZGVyR3JhcGhDb25maWctPnsiJHtXb3JrT3JkZXJUeXBlTmFtZX0ke1dvcmtPcmRlckNvbG9yfV9jb2xvciJ9OwoKICAgICAgICAgICAgIyBzZXQgZGVmYXVsdCBjb2xvciBpZiBubyBjb2xvciBpcyBmb3VuZAogICAgICAgICAgICAkV29ya09yZGVyVHlwZUNvbG9yIHx8PSAkV29ya09yZGVyR3JhcGhDb25maWctPnsidW5kZWZpbmVkJHtXb3JrT3JkZXJDb2xvcn1fY29sb3IifTsKCiAgICAgICAgICAgICMgY2hlY2sgdmFsaWRpdHkgb2Ygd29ya29yZGVyIGNvbG9yCiAgICAgICAgICAgIGlmICggJFdvcmtPcmRlclR5cGVDb2xvciAhfiBteyBcQSAjIFtBLVphLXpcZF17Nn0gXHogfXhtcyApIHsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJUeXBlQ29sb3IgPSAkV29ya09yZGVyR3JhcGhDb25maWctPnsidW5kZWZpbmVkJHtXb3JrT3JkZXJDb2xvcn1fY29sb3IifTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBkaXNwbGF5IGNzcyBkZWZpbml0aW9ucyBmb3IgcGxhbm5lZAogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDU1NXb3JrT3JkZXJUeXBlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVOYW1lICA9PiAkV29ya09yZGVyVHlwZU5hbWUgLiAkV29ya09yZGVyQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUNvbG9yID0+ICRXb3JrT3JkZXJUeXBlQ29sb3IsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNhbGN1bGF0ZSB0aW1lIGxpbmUgcGFyYW1ldGVyCiAgICBteSAkVGltZUxpbmUgPSAkU2VsZi0+X0lUU01DaGFuZ2VHZXRUaW1lTGluZSgKICAgICAgICBTdGFydFRpbWUgPT4gJFRpbWV7U3RhcnRUaW1lfSwKICAgICAgICBFbmRUaW1lICAgPT4gJFRpbWV7RW5kVGltZX0sCiAgICAgICAgVGlja3MgICAgID0+ICRDaGFuZ2VUaWNrcywKICAgICk7CgogICAgaWYgKCAkVGltZUxpbmUgJiYgZGVmaW5lZCAkVGltZUxpbmUtPntUaW1lTGluZUxlZnR9ICkgewoKICAgICAgICAjIGNhbGN1bGF0ZSBoZWlnaHQgb2YgdGltZSBsaW5lCiAgICAgICAgbXkgJFdvcmtPcmRlckhlaWdodCA9IDE2OwogICAgICAgIG15ICRTY2FsZU1hcmdpbiAgICAgPSAxMTsKICAgICAgICAkVGltZUxpbmUtPntUaW1lTGluZUhlaWdodH0gPSAoICggc2NhbGFyIEBXb3JrT3JkZXJzICkgKiAkV29ya09yZGVySGVpZ2h0ICkgKyAkU2NhbGVNYXJnaW47CgogICAgICAgICMgZGlzcGxheSBjc3Mgb2YgdGltZWxpbmUKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NTU1RpbWVMaW5lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUaW1lTGluZX0sCiAgICAgICAgICAgICAgICAleyRXb3JrT3JkZXJHcmFwaENvbmZpZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IHRpbWVsaW5lIGNvbnRhaW5lcgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZUxpbmUnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzb3J0IHdvcmtvcmRlciBhc2NlbmRpbmcgdG8gV29ya09yZGVyTnVtYmVyCiAgICBAV29ya09yZGVycyA9IHNvcnQgeyAkYS0+e1dvcmtPcmRlck51bWJlcn0gPD0+ICRiLT57V29ya09yZGVyTnVtYmVyfSB9IEBXb3JrT3JkZXJzOwoKICAgICMgYnVpbGQgZ3JhcGggb2YgZWFjaCB3b3Jrb3JkZXIKICAgIFdPUktPUkRFUjoKICAgIGZvciBteSAkV29ya09yZGVyIChAV29ya09yZGVycykgewogICAgICAgIG5leHQgV09SS09SREVSIGlmICEkV29ya09yZGVyOwoKICAgICAgICAkU2VsZi0+X0lUU01DaGFuZ2VHZXRXb3JrT3JkZXJHcmFwaCgKICAgICAgICAgICAgV29ya09yZGVyID0+ICRXb3JrT3JkZXIsCiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkVGltZXtTdGFydFRpbWV9LAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJFRpbWV7RW5kVGltZX0sCiAgICAgICAgICAgIFRpY2tzICAgICA9PiAkQ2hhbmdlVGlja3MsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHNjYWxlIG9mIGdyYXBoCiAgICAkU2VsZi0+X0lUU01DaGFuZ2VHZXRDaGFuZ2VTY2FsZSgKICAgICAgICBTdGFydFRpbWUgICA9PiAkVGltZXtTdGFydFRpbWV9LAogICAgICAgIEVuZFRpbWUgICAgID0+ICRUaW1le0VuZFRpbWV9LAogICAgICAgIFRpY2tzICAgICAgID0+ICRDaGFuZ2VUaWNrcywKICAgICAgICBMYWJlbE1hcmdpbiA9PiAkTGFiZWxXaWR0aCArIDIsCiAgICApOwoKICAgICMgcmVuZGVyIGdyYXBoIGFuZCByZXR1cm4gSFRNTCB3aXRoIElUU01DaGFuZ2UuZHRsIHRlbXBsYXRlCiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtfSwKICAgICk7Cn0KCj1pdGVtIElUU01DaGFuZ2VMaXN0U2hvdygpCgpSZXR1cm5zIGEgbGlzdCBvZiBjaGFuZ2VzIGFzIHNvcnRhYmxlIGxpc3Qgd2l0aCBwYWdpbmF0aW9uLgoKVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIEw8S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dFRpY2tldDo6VGlja2V0TGlzdFNob3coKT4KaW4gRjxLZXJuZWwvT3V0cHV0L0hUTUwvTGF5b3V0VGlja2V0LnBtPi4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SVRTTUNoYW5nZUxpc3RTaG93KAogICAgICAgIENoYW5nZUlEcyAgPT4gJENoYW5nZUlEc1JlZiwgICAgICAgICAgICAgICAgICAgICAgIyB0b3RhbCBsaXN0IG9mIGNoYW5nZSBpZHMsIHRoYXQgY2FuIGJlIGxpc3RlZAogICAgICAgIFRvdGFsICAgICAgPT4gc2NhbGFyIEB7ICRDaGFuZ2VJRHNSZWYgfSwgICAgICAgICAgIyB0b3RhbCBudW1iZXIgb2YgbGlzdCBpdGVtcywgY2hhbmdlcyBpbiB0aGlzIGNhc2UKICAgICAgICBWaWV3ICAgICAgID0+ICRTZWxmLT57Vmlld30sICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIHRoZSBkZWZhdWx0IHZhbHVlIGlzICdTbWFsbCcKICAgICAgICBGaWx0ZXIgICAgID0+ICdBbGwnLAogICAgICAgIEZpbHRlcnMgICAgPT4gXCVOYXZCYXJGaWx0ZXIsCiAgICAgICAgRmlsdGVyTGluayA9PiAkTGlua0ZpbHRlciwKICAgICAgICBUaXRsZU5hbWUgID0+ICdPdmVydmlldzogQ2hhbmdlJywKICAgICAgICBUaXRsZVZhbHVlID0+ICRTZWxmLT57RmlsdGVyfSwKICAgICAgICBFbnYgICAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlICAgPT4gJExpbmtQYWdlLAogICAgICAgIExpbmtTb3J0ICAgPT4gJExpbmtTb3J0LAogICAgICAgIEZyb250ZW5kICAgPT4gJ0FnZW50JywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChBZ2VudHxDdXN0b21lciksIGRlZmF1bHQ6IEFnZW50LCBpbmRpY2F0ZXMgZnJvbSB3aGljaCBmcm9udGVuZCB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTUNoYW5nZUxpc3RTaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB0YWtlIG9iamVjdCByZWYgdG8gbG9jYWwsIHJlbW92ZSBpdCBmcm9tICVQYXJhbSAocHJldmVudCBtZW1vcnkgbGVhaykKICAgIG15ICRFbnYgPSBkZWxldGUgJFBhcmFte0Vudn07CgogICAgIyBsb29rdXAgbGF0ZXN0IHVzZWQgdmlldyBtb2RlCiAgICBpZiAoICEkUGFyYW17Vmlld30gJiYgJFNlbGYtPnsgJ1VzZXJJVFNNQ2hhbmdlT3ZlcnZpZXcnIC4gJEVudi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAkUGFyYW17Vmlld30gPSAkU2VsZi0+eyAnVXNlcklUU01DaGFuZ2VPdmVydmlldycgLiAkRW52LT57QWN0aW9ufSB9OwogICAgfQoKICAgICMgc2V0IGZyb250ZW5kCiAgICBteSAkRnJvbnRlbmQgPSAkUGFyYW17RnJvbnRlbmR9IHx8ICdBZ2VudCc7CgogICAgIyBzZXQgZGVmYXV0IHZpZXcgbW9kZSB0byAnc21hbGwnCiAgICBteSAkVmlldyA9ICRQYXJhbXtWaWV3fSB8fCAnU21hbGwnOwoKICAgICMgc3RvcmUgbGF0ZXN0IHZpZXcgbW9kZQogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdVc2VySVRTTUNoYW5nZU92ZXJ2aWV3JyAuICRFbnYtPntBY3Rpb259LAogICAgICAgIFZhbHVlICAgICA9PiAkVmlldywKICAgICk7CgogICAgIyBnZXQgYmFja2VuZCBmcm9tIGNvbmZpZwogICAgbXkgJEJhY2tlbmRzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpPdmVydmlldycpOwogICAgaWYgKCAhJEJhY2tlbmRzICkgewogICAgICAgIHJldHVybiAkRW52LT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTmVlZCBjb25maWcgb3B0aW9uIElUU01DaGFuZ2U6OkZyb250ZW5kOjpPdmVydmlldycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBoYXNoLXJlZgogICAgaWYgKCByZWYgJEJhY2tlbmRzIG5lICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJEVudi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NvbmZpZyBvcHRpb24gSVRTTUNoYW5nZTo6RnJvbnRlbmQ6Ok92ZXJ2aWV3IG5lZWRzIHRvIGJlIGEgSEFTSCByZWYhJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGNvbmZpZyBrZXkKICAgIGlmICggISRCYWNrZW5kcy0+eyRWaWV3fSApIHsKICAgICAgICByZXR1cm4gJEVudi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIGNvbmZpZyBvcHRpb24gZm91bmQgZm9yIHRoZSB2aWV3ICckVmlldychIiwKICAgICAgICApOwogICAgfQoKICAgICMgbmF2IGJhcgogICAgbXkgJFN0YXJ0SGl0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICdTdGFydEhpdCcsCiAgICApIHx8IDE7CgogICAgIyBjaGVjayBzdGFydCBvcHRpb24sIGlmIGhpZ2hlciB0aGVuIGVsZW1lbnRzIGF2YWlsYWJsZSwgc2V0CiAgICAjIGl0IHRvIHRoZSBsYXN0IG92ZXJ2aWV3IHBhZ2UgKFRoYW5rcyB0byBTdGVmYW4gU2NobWlkdCEpCiAgICBteSAkUGFnZVNob3duID0gJEJhY2tlbmRzLT57JFZpZXd9LT57UGFnZVNob3dufTsKICAgIGlmICggJFN0YXJ0SGl0ID4gJFBhcmFte1RvdGFsfSApIHsKICAgICAgICBteSAkUGFnZXMgPSBpbnQoICggJFBhcmFte1RvdGFsfSAvICRQYWdlU2hvd24gKSArIDAuOTk5OTkgKTsKICAgICAgICAkU3RhcnRIaXQgPSAoICggJFBhZ2VzIC0gMSApICogJFBhZ2VTaG93biApICsgMTsKICAgIH0KCiAgICAjIHNldCBwYWdlIGxpbWl0IGFuZCBidWlsZCBwYWdlIG5hdgogICAgbXkgJExpbWl0ID0gJFBhcmFte0xpbWl0fSB8fCAyMF8wMDA7CiAgICBteSAlUGFnZU5hdiA9ICRFbnYtPntMYXlvdXRPYmplY3R9LT5QYWdlTmF2QmFyKAogICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgU3RhcnRIaXQgID0+ICRTdGFydEhpdCwKICAgICAgICBQYWdlU2hvd24gPT4gJFBhZ2VTaG93biwKICAgICAgICBBbGxIaXRzICAgPT4gJFBhcmFte1RvdGFsfSB8fCAwLAogICAgICAgIEFjdGlvbiAgICA9PiAnQWN0aW9uPScgLiAkRW52LT57TGF5b3V0T2JqZWN0fS0+e0FjdGlvbn0sCiAgICAgICAgTGluayAgICAgID0+ICRQYXJhbXtMaW5rUGFnZX0sCiAgICApOwoKICAgICMgYnVpbGQgbmF2YmFyIGNvbnRlbnQKICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGJhY2sgbGluawogICAgaWYgKCAkUGFyYW17TGlua0JhY2t9ICkgewogICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJQYWdlQmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGZpbHRlcnMKICAgIGlmICggJFBhcmFte0ZpbHRlcnN9ICkgewoKICAgICAgICAjIGdldCBnaXZlbiBmaWx0ZXJzCiAgICAgICAgbXkgQE5hdkJhckZpbHRlcnM7CiAgICAgICAgZm9yIG15ICRQcmlvICggc29ydCBrZXlzICV7ICRQYXJhbXtGaWx0ZXJzfSB9ICkgewogICAgICAgICAgICBwdXNoIEBOYXZCYXJGaWx0ZXJzLCAkUGFyYW17RmlsdGVyc30tPnskUHJpb307CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIGZpbHRlciBjb250ZW50CiAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgbG9vcCBvdmVyIGZpbHRlcnMKICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgIGZvciBteSAkRmlsdGVyIChATmF2QmFyRmlsdGVycykgewoKICAgICAgICAgICAgIyBhdCBsZWFzdCBhIHNlY29uZCBmaWx0ZXIgaXMgc2V0LCBidWlsZCBzcGxpdCBjb250ZW50CiAgICAgICAgICAgIGlmICgkQ291bnQpIHsKICAgICAgICAgICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TcGxpdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbmNyZW1lbnQgZmlsdGVyIGNvdW50IGFuZCBidWlsZCBmaWx0ZXIgaXRlbQogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZmlsdGVyIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggJEZpbHRlci0+e0ZpbHRlcn0gZXEgJFBhcmFte0ZpbHRlcn0gKSB7CiAgICAgICAgICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IGNvdW50IG9mIGVsZW1lbnRzIGluIGZpbHRlcgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRGaWx0ZXItPntDb3VudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZENvdW50JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzaG93IGNvdW50IG9mIGVsZW1lbnRzIGluIGZpbHRlcgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRGaWx0ZXItPntDb3VudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdENvdW50JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBsb29wIG92ZXIgY29uZmlndXJlZCBiYWNrZW5kcwogICAgZm9yIG15ICRCYWNrZW5kICgga2V5cyAleyRCYWNrZW5kc30gKSB7CgogICAgICAgICMgYnVpbGQgbmF2YmFyIHZpZXcgbW9kZQogICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJFBhcmFte0ZpbHRlcn0sCiAgICAgICAgICAgICAgICBWaWV3ICAgPT4gJEJhY2tlbmQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjdXJyZW50IHZpZXcgaXMgY29uZmlndXJlZCBpbiBiYWNrZW5kCiAgICAgICAgaWYgKCAkVmlldyBlcSAkQmFja2VuZCApIHsKICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJWaWV3TW9kZVNlbGVjdGVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyAkQmFja2VuZHMtPnskQmFja2VuZH0gfSwKICAgICAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJFBhcmFte0ZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgVmlldyAgID0+ICRCYWNrZW5kLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICAgICAgRmlsdGVyID0+ICRQYXJhbXtGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIFZpZXcgICA9PiAkQmFja2VuZCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcGFnZSBuYXYgaXMgYXZhaWxhYmxlCiAgICBpZiAoJVBhZ2VOYXYpIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYWdlTmF2LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBuYXYgYmFyIGlzIGF2YWlsYWJsZQogICAgaWYgKCAkUGFyYW17TmF2QmFyfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtOYXZCYXJ9LT57TWFpbk5hbWV9ICkgewogICAgICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhck1haW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17TmF2QmFyfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBodG1sIGNvbnRlbnQKICAgIG15ICRPdXRwdXROYXZCYXIgPSAkRW52LT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICBteSAkT3V0cHV0UmF3ID0gJyc7CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoCiAgICAgICAgICAgIE91dHB1dCA9PiBcJE91dHB1dE5hdkJhciwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0TmF2QmFyOwogICAgfQoKICAgICMgbG9hZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRCYWNrZW5kcy0+eyRWaWV3fS0+e01vZHVsZX0gKSApIHsKICAgICAgICByZXR1cm4gJEVudi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBiYWNrZW5kIG9iamVjdAogICAgbXkgJE9iamVjdCA9ICRCYWNrZW5kcy0+eyRWaWV3fS0+e01vZHVsZX0tPm5ldyggJXskRW52fSApOwogICAgcmV0dXJuIGlmICEkT2JqZWN0OwoKICAgICMgcnVuIG1vZHVsZQogICAgbXkgJE91dHB1dCA9ICRPYmplY3QtPlJ1bigKICAgICAgICAlUGFyYW0sCiAgICAgICAgTGltaXQgICAgID0+ICRMaW1pdCwKICAgICAgICBTdGFydEhpdCAgPT4gJFN0YXJ0SGl0LAogICAgICAgIFBhZ2VTaG93biA9PiAkUGFnZVNob3duLAogICAgICAgIEFsbEhpdHMgICA9PiAkUGFyYW17VG90YWx9IHx8IDAsCiAgICAgICAgRnJvbnRlbmQgID0+ICRGcm9udGVuZCwKICAgICk7CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoCiAgICAgICAgICAgIE91dHB1dCA9PiBcJE91dHB1dCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0OwogICAgfQoKICAgICMgY3JlYXRlIG92ZXJ2aWV3IG5hdiBiYXIKICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgcGFnZSBuYXYgYW5kIGNyZWF0ZSBjb250ZW50CiAgICBpZiAoJVBhZ2VOYXYpIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhcicsCiAgICAgICAgICAgIERhdGEgPT4geyVQYWdlTmF2fSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIHNtYWwgbmF2IGJhcgogICAgbXkgJE91dHB1dE5hdkJhclNtYWxsID0gJEVudi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyU21hbGwnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoCiAgICAgICAgICAgIE91dHB1dCA9PiBcJE91dHB1dE5hdkJhclNtYWxsLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXROYXZCYXJTbWFsbDsKICAgIH0KCiAgICAjIHJldHVybiBjb250ZW50IGlmIGF2YWlsYWJsZQogICAgcmV0dXJuICRPdXRwdXRSYXc7Cn0KCj1pdGVtIFJlbW92ZUFKQVhMb2FkaW5nSW1hZ2UoKQoKQSBtZXRob2QgdGhhdCByZW1vdmVzIGFsbCBBSkFYIGxvYWRpbmcgaW1hZ2VzIGZyb20gYSBnaXZlbiBodG1sIHN0cmluZy4KUmV0dXJucyB0aGUgc3RyaW5nIHdpdGhvdXQgYW55IEFKQVggbG9hZGluZyBpbWFnZXMuClRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIHRoZSBmbGlja2VyaW5nIGppdHRlciBlZmZlY3RvZiBzZWxlY3Rpb24gZmllbGRzLAppZiB0aGUgY29udGVudCBpcyB1cGRhdGVkIHZpYSBBSkFYLgoKICAgIG15ICRDbGVhbmVkSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPlJlbW92ZUFKQVhMb2FkaW5nSW1hZ2UoCiAgICAgICAgSFRNTFN0cmluZyA9PiAnQSBIVE1MIHN0cmluZyBhcyByZXR1cm5lZCBmcm9tIEJ1aWxkU2VsZWN0aW9uJywKICAgICk7Cgo9Y3V0CgpzdWIgUmVtb3ZlQUpBWExvYWRpbmdJbWFnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBvcmlnaW5hbCBIVE1MIHN0cmluZwogICAgbXkgJENsZWFuZWRIVE1MU3RyaW5nID0gJFBhcmFte0hUTUxTdHJpbmd9IHx8ICcnOwoKICAgICMgcmVtb3ZlIGFsbCBBSkFYLUxvYWRpbmcgaW1hZ2VzIHRvIGF2b2lkIGppdHRlciBlZmZlY3QKICAgICRDbGVhbmVkSFRNTFN0cmluZyA9fiBzeyA8YSBbIF0gaWQ9IkFKQVhJbWFnZSBbXjw+XSsgIj48L2E+IH17fXhtc2c7CgogICAgcmV0dXJuICRDbGVhbmVkSFRNTFN0cmluZzsKfQoKPWl0ZW0gQnVpbGRGcmVlVGV4dEhUTUwoKQoKUmV0dXJucyB0aGUgYSBoYXNoIHdpdGggSFRNTCBjb2RlIGZvciBhbGwgZGVmaW5lZCBjaGFuZ2Ugb3Igd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcy4KCiAgICBteSAlQ2hhbmdlRnJlZVRleHRIVE1MID0gJExheW91dE9iamVjdC0+QnVpbGRGcmVlVGV4dEhUTUwoCiAgICAgICAgQ29uZmlnICAgICAgICAgICAgICAgICAgID0+IFwlQ2hhbmdlRnJlZVRleHRDb25maWcsCiAgICAgICAgQ2hhbmdlRGF0YSAgICAgICAgICAgICAgID0+IFwlQ2hhbmdlRnJlZVRleHRQYXJhbSwKICAgICAgICBDb25maWd1cmVkRnJlZVRleHRGaWVsZHMgPT4gWyAxLCAyLCAzIF0sCiAgICApOwoKb3IKCiAgICBteSAlV29ya09yZGVyRnJlZVRleHRIVE1MID0gJExheW91dE9iamVjdC0+QnVpbGRGcmVlVGV4dEhUTUwoCiAgICAgICAgQ29uZmlnICAgICAgICAgICAgICAgICAgID0+IFwlV29ya09yZGVyRnJlZVRleHRDb25maWcsCiAgICAgICAgV29ya09yZGVyRGF0YSAgICAgICAgICAgID0+IFwlV29ya09yZGVyRnJlZVRleHRQYXJhbSwKICAgICAgICBDb25maWd1cmVkRnJlZVRleHRGaWVsZHMgPT4gIFsgNCwgNSwgNiBdLAogICAgKTsKCj1jdXQKCnN1YiBCdWlsZEZyZWVUZXh0SFRNTCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ29uZmlndXJlZEZyZWVUZXh0RmllbGRzKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBDaGFuZ2VEYXRhIGFuZCBXb3JrT3JkZXJEYXRhIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17Q2hhbmdlRGF0YX0gJiYgJFBhcmFte1dvcmtPcmRlckRhdGF9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgQ2hhbmdlRGF0YSBPUiBXb3JrT3JkZXJEYXRhIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgY29uZmlnIGRhdGEKICAgIG15ICVDb25maWc7CiAgICBpZiAoICRQYXJhbXtDb25maWd9ICkgewogICAgICAgICVDb25maWcgPSAleyAkUGFyYW17Q29uZmlnfSB9OwogICAgfQoKICAgICMgZ2V0IHRoZSBpbnB1dCBkYXRhIGFuZCB0aGUgdHlwZSAoQ2hhbmdlIG9yIFdvcmtvcmRlcikKICAgIG15ICVJbnB1dERhdGE7CiAgICBteSAkVHlwZTsKICAgIGlmICggJFBhcmFte0NoYW5nZURhdGF9ICkgewogICAgICAgICRUeXBlICAgICAgPSAnQ2hhbmdlJzsKICAgICAgICAlSW5wdXREYXRhID0gJXsgJFBhcmFte0NoYW5nZURhdGF9IH07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtXb3JrT3JkZXJEYXRhfSApIHsKICAgICAgICAkVHlwZSAgICAgID0gJ1dvcmtPcmRlcic7CiAgICAgICAgJUlucHV0RGF0YSA9ICV7ICRQYXJhbXtXb3JrT3JkZXJEYXRhfSB9OwogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIHJlc3VsdCBIVE1MIGRhdGEKICAgIG15ICVEYXRhOwoKICAgICMgYnVpbGQgSFRNTCBmb3IgYWxsIGNvbmZpZ3VyZWQgZmllbGRzCiAgICBmb3IgbXkgJE51bWJlciAoIEB7ICRQYXJhbXtDb25maWd1cmVkRnJlZVRleHRGaWVsZHN9IH0gKSB7CgogICAgICAgICMgZnJlZWtleSBjb25maWcgZXhpc3RzCiAgICAgICAgaWYgKAogICAgICAgICAgICByZWYgJENvbmZpZ3sgJFR5cGUgLiAnRnJlZUtleScgLiAkTnVtYmVyIH0gZXEgJ0hBU0gnCiAgICAgICAgICAgICYmICV7ICRDb25maWd7ICRUeXBlIC4gJ0ZyZWVLZXknIC4gJE51bWJlciB9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZ2V0IGFsbCBjb25maWcga2V5cyBmb3IgdGhpcyBmaWVsZAogICAgICAgICAgICBteSBAQ29uZmlnS2V5cyA9IGtleXMgJXsgJENvbmZpZ3sgJFR5cGUgLiAnRnJlZUtleScgLiAkTnVtYmVyIH0gfTsKCiAgICAgICAgICAgICMgbW9yZSB0aGFuIG9uZSBjb25maWcgb3B0aW9uIGV4aXN0cwogICAgICAgICAgICBpZiAoIHNjYWxhciBAQ29uZmlnS2V5cyA+IDEgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBOdWxsT3B0aW9uIGlzIHJlcXVlc3RlZCAobmVlZGVkIGluIHNlYXJjaCBmb3JtcykKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZU5vbmUgPSAwOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17TnVsbE9wdGlvbn0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgb25seSBpZiBkYXRhIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhIG51bGwgZW50cnkKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICEkQ29uZmlneyAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIgfS0+eycnfQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkQ29uZmlneyAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIgfS0+eycnfSBuZSAnLScKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYnVpbGQgZHJvcGRvd24gbGlzdAogICAgICAgICAgICAgICAgJERhdGF7ICRUeXBlIC4gJ0ZyZWVLZXlGaWVsZCcgLiAkTnVtYmVyIH0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDb25maWd7ICRUeXBlIC4gJ0ZyZWVLZXknIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRJbnB1dERhdGF7ICRUeXBlIC4gJ0ZyZWVLZXknIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIEhUTUxRdW90ZSAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBqdXN0IG9uZSBjb25maWcgb3B0aW9uIGV4aXN0cyBhbmQgdGhlIG9ubHkga2V5IGlzIG5vdCBhbiBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgZWxzaWYgKCAkQ29uZmlnS2V5c1swXSApIHsKCiAgICAgICAgICAgICAgICAjICB0aGUgbnVsbCBvcHRpb24gaXMgc2V0CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtOdWxsT3B0aW9ufSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBidWlsZCBqdXN0IGEgdGV4dCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAkRGF0YXsgJFR5cGUgLiAnRnJlZUtleUZpZWxkJyAuICROdW1iZXIgfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRDb25maWd7ICRUeXBlIC4gJ0ZyZWVLZXknIC4gJE51bWJlciB9LT57ICRDb25maWdLZXlzWzBdIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBubyBudWxsIG9wdGlvbiBpcyBzZXQKICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIGEgaGlkZGVuIGlucHV0IGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJERhdGF7ICRUeXBlIC4gJ0ZyZWVLZXlGaWVsZCcgLiAkTnVtYmVyIH0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkQ29uZmlneyAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIgfS0+eyAkQ29uZmlnS2V5c1swXSB9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicKICAgICAgICAgICAgICAgICAgICAgICAgLiAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRDb25maWdLZXlzWzBdICkgLiAnIi8+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZnJlZWtleSBkYXRhIGlzIGRlZmluZWQKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRJbnB1dERhdGF7ICRUeXBlIC4gJ0ZyZWVLZXknIC4gJE51bWJlciB9ICkgewoKICAgICAgICAgICAgICAgICMgZnJlZWtleSBkYXRhIGlzIGFuIGFycmF5CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkSW5wdXREYXRheyAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIgfSBlcSAnQVJSQVknICkgewoKICAgICAgICAgICAgICAgICAgICAjIHRha2UgZmlyc3QgZWxlbWVudC4uLgogICAgICAgICAgICAgICAgICAgIGlmICggJElucHV0RGF0YXsgJFR5cGUgLiAnRnJlZUtleScgLiAkTnVtYmVyIH0tPlswXSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0RGF0YXsgJFR5cGUgLiAnRnJlZUtleScgLiAkTnVtYmVyIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJElucHV0RGF0YXsgJFR5cGUgLiAnRnJlZUtleScgLiAkTnVtYmVyIH0tPlswXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgLi4ub3Igbm90aGluZwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXREYXRheyAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIgfSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGlucHV0IGZpZWxkIHdpdGggZnJlZWtleSBkYXRhCiAgICAgICAgICAgICAgICAkRGF0YXsgJFR5cGUgLiAnRnJlZUtleUZpZWxkJyAuICROdW1iZXIgfQogICAgICAgICAgICAgICAgICAgID0gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSInCiAgICAgICAgICAgICAgICAgICAgLiAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIKICAgICAgICAgICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkSW5wdXREYXRheyAkVHlwZSAuICdGcmVlS2V5JyAuICROdW1iZXIgfSApCiAgICAgICAgICAgICAgICAgICAgLiAnIiBzaXplPSIxOCIvPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZnJlZWtleSBkYXRhIGlzIG5vdCBkZWZpbmVkCiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgYnVpbGQgZW1wdHkgaW5wdXQgZmllbGQKICAgICAgICAgICAgICAgICREYXRheyAkVHlwZSAuICdGcmVlS2V5RmllbGQnIC4gJE51bWJlciB9CiAgICAgICAgICAgICAgICAgICAgPSAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IicKICAgICAgICAgICAgICAgICAgICAuICRUeXBlCiAgICAgICAgICAgICAgICAgICAgLiAnRnJlZUtleScKICAgICAgICAgICAgICAgICAgICAuICROdW1iZXIKICAgICAgICAgICAgICAgICAgICAuICciIHZhbHVlPSIiIHNpemU9IjE4Ii8+JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBmcmVldGV4dCBjb25maWcgZXhpc3RzCiAgICAgICAgaWYgKCByZWYgJENvbmZpZ3sgJFR5cGUgLiAnRnJlZVRleHQnIC4gJE51bWJlciB9IGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgTnVsbE9wdGlvbiBpcyByZXF1ZXN0ZWQgKG5lZWRlZCBpbiBzZWFyY2ggZm9ybXMpCiAgICAgICAgICAgIG15ICRQb3NzaWJsZU5vbmUgPSAwOwogICAgICAgICAgICBpZiAoICRQYXJhbXtOdWxsT3B0aW9ufSApIHsKCiAgICAgICAgICAgICAgICAjIG9ubHkgaWYgZGF0YSBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYSBudWxsIGVudHJ5CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgISRDb25maWd7ICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIgfS0+eycnfQogICAgICAgICAgICAgICAgICAgIHx8ICRDb25maWd7ICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIgfS0+eycnfSBuZSAnLScKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBvc3NpYmxlTm9uZSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgZHJvcGRvd24gbGlzdAogICAgICAgICAgICAkRGF0YXsgJFR5cGUgLiAnRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvbmZpZ3sgJFR5cGUgLiAnRnJlZVRleHQnIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJElucHV0RGF0YXsgJFR5cGUgLiAnRnJlZVRleHQnIC4gJE51bWJlciB9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBIVE1MUXVvdGUgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkUG9zc2libGVOb25lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZnJlZXRleHQgZGF0YSBpcyBkZWZpbmVkCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkSW5wdXREYXRheyAkVHlwZSAuICdGcmVlVGV4dCcgLiAkTnVtYmVyIH0gKSB7CgogICAgICAgICAgICAgICAgIyBmcmVldGV4dCBkYXRhIGlzIGFuIGFycmF5CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkSW5wdXREYXRheyAkVHlwZSAuICdGcmVlVGV4dCcgLiAkTnVtYmVyIH0gZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0YWtlIGZpcnN0IGVsZW1lbnQuLi4KICAgICAgICAgICAgICAgICAgICBpZiAoICRJbnB1dERhdGF7ICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIgfS0+WzBdICkgewogICAgICAgICAgICAgICAgICAgICAgICAkSW5wdXREYXRheyAkVHlwZSAuICdGcmVlVGV4dCcgLiAkTnVtYmVyIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJElucHV0RGF0YXsgJFR5cGUgLiAnRnJlZVRleHQnIC4gJE51bWJlciB9LT5bMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIC4uLm9yIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJElucHV0RGF0YXsgJFR5cGUgLiAnRnJlZVRleHQnIC4gJE51bWJlciB9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYnVpbGQgaW5wdXQgZmllbGQgd2l0aCBmcmVldGV4dCBkYXRhCiAgICAgICAgICAgICAgICAkRGF0YXsgJFR5cGUgLiAnRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0KICAgICAgICAgICAgICAgICAgICA9ICc8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJwogICAgICAgICAgICAgICAgICAgIC4gJFR5cGUgLiAnRnJlZVRleHQnIC4gJE51bWJlcgogICAgICAgICAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRJbnB1dERhdGF7ICRUeXBlIC4gJ0ZyZWVUZXh0JyAuICROdW1iZXIgfSApCiAgICAgICAgICAgICAgICAgICAgLiAnIiBzaXplPSIzMCIvPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZnJlZXRleHQgZGF0YSBpcyBub3QgZGVmaW5lZAogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGVtcHR5IGlucHV0IGZpZWxkCiAgICAgICAgICAgICAgICAkRGF0YXsgJFR5cGUgLiAnRnJlZVRleHRGaWVsZCcgLiAkTnVtYmVyIH0KICAgICAgICAgICAgICAgICAgICA9ICc8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJwogICAgICAgICAgICAgICAgICAgIC4gJFR5cGUKICAgICAgICAgICAgICAgICAgICAuICdGcmVlVGV4dCcKICAgICAgICAgICAgICAgICAgICAuICROdW1iZXIKICAgICAgICAgICAgICAgICAgICAuICciIHZhbHVlPSIiIHNpemU9IjMwIi8+JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9JVFNNQ2hhbmdlR2V0Q2hhbmdlVGlja3MoKQoKYSBoZWxwZXIgbWV0aG9kIGZvciB0aGUgd29ya29yZGVyIGdyYXBoIG9mIGEgY2hhbmdlCgo9Y3V0CgpzdWIgX0lUU01DaGFuZ2VHZXRDaGFuZ2VUaWNrcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIHN0YXJ0IGFuZCBlbmQKICAgIHJldHVybiBpZiAhJFBhcmFte1N0YXJ0fSB8fCAhJFBhcmFte0VuZH07CgogICAgIyBtYWtlIHN1cmUgd2UgZ290IGludGVnZXJzCiAgICByZXR1cm4gaWYgJFBhcmFte1N0YXJ0fSAhfiBteyBcQSBcZCsgXHogfXhtczsKICAgIHJldHVybiBpZiAkUGFyYW17RW5kfSAhfiBteyBcQSBcZCsgXHogfXhtczsKCiAgICAjIGNhbGN1bGF0ZSB0aW1lIHNwYW4gaW4gc2VjCiAgICBteSAkVGlja3MgPSAkUGFyYW17RW5kfSAtICRQYXJhbXtTdGFydH07CgogICAgIyBjaGVjayBmb3IgY29tcHV0aW5nIGVycm9yCiAgICByZXR1cm4gaWYgJFRpY2tzIDw9IDA7CgogICAgIyBnZXQgc2Vjb25kcyBwZXIgcGVyY2VudCBhbmQgcm91bmQgZG93bgogICAgJFRpY2tzID0gc3ByaW50ZiggIiUuZiIsICRUaWNrcyAvIDEwMCApOwoKICAgIHJldHVybiAkVGlja3M7Cn0KCj1pdGVtIF9JVFNNQ2hhbmdlR2V0Q2hhbmdlU2NhbGUoKQoKYSBoZWxwZXIgbWV0aG9kIGZvciB0aGUgd29ya29yZGVyIGdyYXBoIG9mIGEgY2hhbmdlCgo9Y3V0CgpzdWIgX0lUU01DaGFuZ2VHZXRDaGFuZ2VTY2FsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIHN0YXJ0IHRpbWUKICAgIHJldHVybiBpZiAhJFBhcmFte1N0YXJ0VGltZX07CgogICAgIyBjaGVjayBmb3Igc3RhcnQgdGltZSBpcyBhbiBpbnRlZ2VyIHZhbHVlCiAgICByZXR1cm4gaWYgJFBhcmFte1N0YXJ0VGltZX0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CgogICAgIyBhZGQgc3RhcnQgYW5kIGVuZCB0aW1lIGFuZCBjYWxjdWxhdGUgc2NhbGUgbmFtaW5nCiAgICBteSAlU2NhbGVOYW1lID0gKAogICAgICAgIFN0YXJ0VGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICBFbmRUaW1lICAgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgIHNjYWxlXzE1ICA9PiAoICRQYXJhbXtTdGFydFRpbWV9ICsgMjAgKiAkUGFyYW17VGlja3N9ICksCiAgICAgICAgc2NhbGVfMzUgID0+ICggJFBhcmFte1N0YXJ0VGltZX0gKyA0MCAqICRQYXJhbXtUaWNrc30gKSwKICAgICAgICBzY2FsZV81NSAgPT4gKCAkUGFyYW17U3RhcnRUaW1lfSArIDYwICogJFBhcmFte1RpY2tzfSApLAogICAgICAgIHNjYWxlXzc1ICA9PiAoICRQYXJhbXtTdGFydFRpbWV9ICsgODAgKiAkUGFyYW17VGlja3N9ICksCiAgICApOwoKICAgICMgdHJhbnNsYXRlIHRpbWVzdGFtcHMgaW4gZGF0ZSBmb3JtYXQKICAgIG1hcCB7CiAgICAgICAgJFNjYWxlTmFtZXskX30gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2NhbGVOYW1leyRffQogICAgICAgICAgICApCiAgICB9IGtleXMgJVNjYWxlTmFtZTsKCiAgICAjIGNyZWF0ZSBzY2FsZSBibG9jawogICAgJFNlbGYtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1NjYWxlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVNjYWxlTmFtZSwKICAgICAgICAgICAgTGFiZWxNYXJnaW4gPT4gJFBhcmFte0xhYmVsTWFyZ2lufSwKICAgICAgICB9LAogICAgKTsKCiAgICBJTlRFUlZBTDoKICAgIGZvciBteSAkSW50ZXJ2YWwgKCBzb3J0IGtleXMgJVNjYWxlTmFtZSApIHsKCiAgICAgICAgIyBkbyBub3QgZGlzcGxheSBzY2FsZSBpZiB0cmFuc2xhdGluZyBmYWlsZWQKICAgICAgICBuZXh0IElOVEVSVkFMIGlmICEkU2NhbGVOYW1leyRJbnRlcnZhbH07CgogICAgICAgICMgZG8gbm90IGRpc3BsYXkgc3RhcnQgb3IgZW5kCiAgICAgICAgbmV4dCBJTlRFUlZBTCBpZiAkSW50ZXJ2YWwgPX4gbXsgXEEgKCBTdGFydCB8IEVuZCApIFRpbWUgXHogfXhtczsKCiAgICAgICAgIyBidWlsZCBzY2FsZSBsYWJlbCBibG9jawogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2NhbGVMYWJlbCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2NhbGVMYWJlbCA9PiAkU2NhbGVOYW1leyRJbnRlcnZhbH0sCiAgICAgICAgICAgICAgICBTY2FsZUNsYXNzID0+ICRJbnRlcnZhbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBfSVRTTUNoYW5nZUdldFdvcmtPcmRlckdyYXBoKCkKCmEgaGVscGVyIG1ldGhvZCBmb3IgdGhlIHdvcmtvcmRlciBncmFwaCBvZiBhIGNoYW5nZQoKPWN1dAoKc3ViIF9JVFNNQ2hhbmdlR2V0V29ya09yZGVyR3JhcGggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciB3b3Jrb3JkZXIKICAgIHJldHVybiBpZiAhJFBhcmFte1dvcmtPcmRlcn07CgogICAgIyBleHRyYWN0IHdvcmtvcmRlcgogICAgbXkgJFdvcmtPcmRlciA9ICRQYXJhbXtXb3JrT3JkZXJ9OwoKICAgICMgc2F2ZSBvcmlnIHdvcmtvcmRlciBmb3Igd29ya29yZGVyIGluZm9ybWF0aW9uCiAgICBteSAlV29ya09yZGVySW5mb3JtYXRpb24gPSAleyRXb3JrT3JkZXJ9OwoKICAgICMgdHJhbnNsYXRlIHdvcmtvcmRlciB0eXBlCiAgICAkV29ya09yZGVyLT57VHJhbnNsYXRlZFdvcmtPcmRlclR5cGV9CiAgICAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkV29ya09yZGVyLT57V29ya09yZGVyVHlwZX0gKTsKCiAgICAjIGJ1aWxkIGxhYmVsIGZvciBsaW5rIGluIGdyYXBoCiAgICAkV29ya09yZGVyLT57V29ya09yZGVyTGFiZWx9CiAgICAgICAgPSAiVGl0bGU6ICRXb3JrT3JkZXItPntXb3JrT3JkZXJUaXRsZX0gfCBUeXBlOiAkV29ya09yZGVyLT57VHJhbnNsYXRlZFdvcmtPcmRlclR5cGV9IjsKCiAgICAjIGNyZWF0ZSB3b3Jrb3JkZXIgaXRlbQogICAgJFNlbGYtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckl0ZW0nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAleyRXb3JrT3JkZXJ9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBzZXR0aW5ncwogICAgbXkgJENoYW5nZVpvb21Db25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OkFnZW50SVRTTUNoYW5nZVpvb20nKTsKCiAgICAjIGFkZCB3b3Jrb3JkZXIgc3RhdGUKICAgIGlmICggJENoYW5nZVpvb21Db25maWctPntXb3JrT3JkZXJTdGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJJdGVtU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCB3b3Jrb3JkZXIgdGl0bGUKICAgIGlmICggJENoYW5nZVpvb21Db25maWctPntXb3JrT3JkZXJUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJJdGVtVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFdvcmtPcmRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRpY2tzIGFyZSBjYWxjdWxhdGVkCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrc307CgogICAgIyBzZXQgcGxhbm5lZCBpZiBubyBhY3R1YWwgdGltZSBpcyBzZXQKICAgIGlmICggISRXb3JrT3JkZXItPntBY3R1YWxTdGFydFRpbWV9ICkgewogICAgICAgICRXb3JrT3JkZXItPntBY3R1YWxTdGFydFRpbWV9ID0gJFdvcmtPcmRlci0+e1BsYW5uZWRTdGFydFRpbWV9OwogICAgICAgICRXb3JrT3JkZXItPntBY3R1YWxFbmRUaW1lfSAgID0gJFdvcmtPcmRlci0+e1BsYW5uZWRFbmRUaW1lfTsKICAgIH0KCiAgICAjIHNldCBjdXJyZW50IHRpbWUgaWYgbm8gYWN0dWFsIGVuZCB0aW1lIGlzIHNldAogICAgaWYgKCAkV29ya09yZGVyLT57QWN0dWFsU3RhcnRUaW1lfSAmJiAhJFdvcmtPcmRlci0+e0FjdHVhbEVuZFRpbWV9ICkgewogICAgICAgICRXb3JrT3JkZXItPntBY3R1YWxFbmRUaW1lfSA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgIH0KCiAgICAjIHNldCBuaWNlIGRpc3BsYXkgb2YgdW5kZWYgYWN0dWFsIHRpbWVzCiAgICBmb3IgbXkgJFRpbWVUeXBlIChxdyhBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKICAgICAgICBpZiAoICEkV29ya09yZGVySW5mb3JtYXRpb257JFRpbWVUeXBlfSApIHsKICAgICAgICAgICAgJFdvcmtPcmRlckluZm9ybWF0aW9ueyJFbXB0eSR7VGltZVR5cGV9In0gPSAnLSc7CiAgICAgICAgfQogICAgfQoKICAgICMgaGFzaCBmb3IgdGltZSB2YWx1ZXMKICAgIG15ICVUaW1lOwoKICAgIGZvciBteSAkVGltZVR5cGUgKHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CgogICAgICAgICMgdHJhbnNsYXRlIHRpbWUKICAgICAgICAkVGltZXskVGltZVR5cGV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkV29ya09yZGVyLT57JFRpbWVUeXBlfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGV0ZXJtaW5lIGxlbmd0aCBvZiB3b3Jrb3JkZXIKICAgIG15ICVUaWNrVmFsdWU7CgogICAgZm9yIG15ICRUaW1lVHlwZSAocXcoIFBsYW5uZWQgQWN0dWFsICkpIHsKCiAgICAgICAgIyBnZXQgdmFsdWVzIGZvciBwYWRkaW5nIHNwYW4KICAgICAgICBteSAkU3RhcnRQYWRkaW5nID0gc3ByaW50ZigKICAgICAgICAgICAgIiUuMWYiLAogICAgICAgICAgICAoICRUaW1leyIke1RpbWVUeXBlfVN0YXJ0VGltZSJ9IC0gJFBhcmFte1N0YXJ0VGltZX0gKSAvICRQYXJhbXtUaWNrc30KICAgICAgICApOwogICAgICAgICRTdGFydFBhZGRpbmcgPSAoICRTdGFydFBhZGRpbmcgPD0gMCApICAgPyAwICAgIDogJFN0YXJ0UGFkZGluZzsKICAgICAgICAkU3RhcnRQYWRkaW5nID0gKCAkU3RhcnRQYWRkaW5nID49IDEwMCApID8gOTkuOSA6ICRTdGFydFBhZGRpbmc7CiAgICAgICAgJFRpY2tWYWx1ZXsiJHtUaW1lVHlwZX1QYWRkaW5nIn0gPSAkU3RhcnRQYWRkaW5nOwoKICAgICAgICAjIGdldCB2YWx1ZXMgZm9yIHRyYWlsaW5nIHNwYW4KICAgICAgICBteSAkRW5kVHJhaWxpbmcKICAgICAgICAgICAgPSBzcHJpbnRmKCAiJS4xZiIsICggJFBhcmFte0VuZFRpbWV9IC0gJFRpbWV7IiR7VGltZVR5cGV9RW5kVGltZSJ9ICkgLyAkUGFyYW17VGlja3N9ICk7CiAgICAgICAgJEVuZFRyYWlsaW5nID0gKCAkRW5kVHJhaWxpbmcgPD0gMCApICAgPyAwICAgIDogJEVuZFRyYWlsaW5nOwogICAgICAgICRFbmRUcmFpbGluZyA9ICggJEVuZFRyYWlsaW5nID49IDEwMCApID8gOTkuOSA6ICRFbmRUcmFpbGluZzsKICAgICAgICAkVGlja1ZhbHVleyIke1RpbWVUeXBlfVRyYWlsaW5nIn0gPSAkRW5kVHJhaWxpbmc7CgogICAgICAgICMgZ2V0IHZhbHVlcyBmb3IgZGlzcGxheSBzcGFuCiAgICAgICAgbXkgJFRpbWVUaWNrcwogICAgICAgICAgICA9IDEwMCAtICggJFRpY2tWYWx1ZXsiJHtUaW1lVHlwZX1QYWRkaW5nIn0gKyAkVGlja1ZhbHVleyIke1RpbWVUeXBlfVRyYWlsaW5nIn0gKTsKICAgICAgICAkVGltZVRpY2tzID0gKCAkVGltZVRpY2tzIDw9IDAgKSAgID8gMC4xICA6ICRUaW1lVGlja3M7CiAgICAgICAgJFRpbWVUaWNrcyA9ICggJFRpbWVUaWNrcyA+PSAxMDAgKSA/IDk5LjkgOiAkVGltZVRpY2tzOwogICAgICAgICRUaWNrVmFsdWV7IiR7VGltZVR5cGV9VGlja3MifSA9IHNwcmludGYoICIlLjFmIiwgJFRpbWVUaWNrcyApOwogICAgfQoKICAgICMgc2V0IHdvcmtvcmRlciBhcyBpbmFjdGl2ZSBpZiBpdCBpcyBub3Qgc3RhcnRlZCBqZXQKICAgIGlmICggISRXb3JrT3JkZXJJbmZvcm1hdGlvbntBY3R1YWxTdGFydFRpbWV9ICkgewogICAgICAgICRXb3JrT3JkZXJJbmZvcm1hdGlvbntXb3JrT3JkZXJPcGFjaXR5fSA9ICdpbmFjdGl2ZSc7CiAgICB9CgogICAgIyBzZXQgd29ya29yZGVyIGFnZW50CiAgICBpZiAoICRXb3JrT3JkZXJJbmZvcm1hdGlvbntXb3JrT3JkZXJBZ2VudElEfSApIHsKICAgICAgICBteSAlV29ya09yZGVyQWdlbnREYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkV29ya09yZGVySW5mb3JtYXRpb257V29ya09yZGVyQWdlbnRJRH0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICglV29ya09yZGVyQWdlbnREYXRhKSB7CgogICAgICAgICAgICAjIGdldCBXb3JrT3JkZXJBZ2VudCBpbmZvcm1hdGlvbgogICAgICAgICAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJJbmZvcm1hdGlvbnsiV29ya09yZGVyQWdlbnQkUG9zdGZpeCJ9ID0gJFdvcmtPcmRlckFnZW50RGF0YXskUG9zdGZpeH0KICAgICAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBncmFwaCBvZiB3b3Jrb3JkZXIgaXRlbQogICAgJFNlbGYtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckl0ZW1HcmFwaCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVXb3JrT3JkZXJJbmZvcm1hdGlvbiwKICAgICAgICAgICAgJVRpY2tWYWx1ZSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNoZWNrIHRoZSBsYXN0IHRoaW5nOiBVc2VyTG9naW4KICAgIGlmICggJFdvcmtPcmRlckluZm9ybWF0aW9ue1dvcmtPcmRlckFnZW50VXNlckxvZ2lufSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlckFnZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlV29ya09yZGVySW5mb3JtYXRpb24sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRW1wdHlXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVdvcmtPcmRlckluZm9ybWF0aW9uLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIF9JVFNNQ2hhbmdlR2V0VGltZUxpbmUoKQoKYSBoZWxwZXIgbWV0aG9kIGZvciB0aGUgd29ya29yZGVyIGdyYXBoIG9mIGEgY2hhbmdlCgo9Y3V0CgpzdWIgX0lUU01DaGFuZ2VHZXRUaW1lTGluZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIHN0YXJ0IHRpbWUKICAgIHJldHVybiBpZiAhJFBhcmFte1N0YXJ0VGltZX07CgogICAgIyBjaGVjayBmb3Igc3RhcnQgdGltZSBpcyBhbiBpbnRlZ2VyIHZhbHVlCiAgICByZXR1cm4gaWYgJFBhcmFte1N0YXJ0VGltZX0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CgogICAgIyBjaGVjayBmb3IgZW5kIHRpbWUKICAgIHJldHVybiBpZiAhJFBhcmFte0VuZFRpbWV9OwoKICAgICMgY2hlY2sgZm9yIGVuZCB0aW1lIGlzIGFuIGludGVnZXIgdmFsdWUKICAgIHJldHVybiBpZiAkUGFyYW17RW5kVGltZX0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CgogICAgIyBjaGVjayBmb3IgdGlja3MKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tzfTsKCiAgICAjIGNoZWNrIGZvciB0aWNrcyBpcyBhbiBpbnRlZ2VyIHZhbHVlCiAgICByZXR1cm4gaWYgJFBhcmFte1RpY2tzfSAhfiBteyBcQSBcZCsgXHogfXhtczsKCiAgICAjIGdldCBjdXJyZW50IHN5c3RlbSB0aW1lCiAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CgogICAgIyBjaGVjayBmb3Igc3lzdGVtIHRpbWUKICAgIHJldHVybiBpZiAhJEN1cnJlbnRUaW1lOwoKICAgICMgY2hlY2sgaWYgY3VycmVudCB0aW1lIGlzIGluIGNoYW5nZSB0aW1lIGludGVydmFsCiAgICByZXR1cm4gaWYgJEN1cnJlbnRUaW1lIDwgJFBhcmFte1N0YXJ0VGltZX07CiAgICByZXR1cm4gaWYgJEN1cnJlbnRUaW1lID4gJFBhcmFte0VuZFRpbWV9OwoKICAgICMgdGltZSBsaW5lIGRhdGEKICAgIG15ICVUaW1lTGluZTsKCiAgICAjIGNhbGN1bGF0ZSBwZXJjZW50IG9mIHRpbWVsaW5lCiAgICBteSAkUmVsYXRpdmVFbmQgICA9ICRQYXJhbXtFbmRUaW1lfSAtICRQYXJhbXtTdGFydFRpbWV9OwogICAgbXkgJFJlbGF0aXZlU3RhcnQgPSAkQ3VycmVudFRpbWUgLSAkUGFyYW17U3RhcnRUaW1lfTsKCiAgICAjIGdldCB0aW1lbGluZSBpbmRlbnQgd2l0aCAxIGRpZ2l0IGFmdGVyIGRlY2ltYWwgcG9pbnQKICAgICRUaW1lTGluZXtUaW1lTGluZUxlZnR9ID0gc3ByaW50ZiggIiUuMWYiLCAoICRSZWxhdGl2ZVN0YXJ0IC8gJFJlbGF0aXZlRW5kICkgKiAxMDAgKTsKCiAgICAjIHZlcmlmeSBwZXJjZW50IHZhbHVlcwogICAgaWYgKCAkVGltZUxpbmV7VGltZUxpbmVMZWZ0fSA8PSAwICkgewogICAgICAgICRUaW1lTGluZXtUaW1lTGluZUxlZnR9ID0gMDsKICAgIH0KICAgIGlmICggJFRpbWVMaW5le1RpbWVMaW5lTGVmdH0gPj0gMTAwICkgewogICAgICAgICRUaW1lTGluZXtUaW1lTGluZUxlZnR9ID0gOTkuOTsKICAgIH0KCiAgICByZXR1cm4gXCVUaW1lTGluZTsKfQoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRJVFNNVGVtcGxhdGUucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0IGZvciB0ZW1wbGF0ZXMKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IExheW91dElUU01UZW1wbGF0ZS5wbSx2IDEuMiAyMDEwLzAxLzIxIDE0OjUzOjU2IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0SVRTTVRlbXBsYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFBPU0lYIHF3KGNlaWwpOwoKdXNlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKPW92ZXIgNAoKPWl0ZW0gSVRTTVRlbXBsYXRlTGlzdFNob3coKQoKUmV0dXJucyBhIGxpc3Qgb2YgdGVtcGxhdGVzIGFzIHNvcnRhYmxlIGxpc3Qgd2l0aCBwYWdpbmF0aW9uLgoKVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIEw8S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dElUU01DaGFuZ2U6OklUTUNoYW5nZUxpc3RTaG93KCk+CmluIEY8S2VybmVsL091dHB1dC9IVE1ML0xheW91dElUU01DaGFuZ2UucG0+LgoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5JVFNNVGVtcGxhdGVMaXN0U2hvdygKICAgICAgICBUZW1wbGF0ZUlEcyAgPT4gJFRlbXBsYXRlSURzUmVmLCAgICAgICAgICAgICAgICAgICMgdG90YWwgbGlzdCBvZiB0ZW1wbGF0ZSBpZHMsIHRoYXQgY2FuIGJlIGxpc3RlZAogICAgICAgIFRvdGFsICAgICAgPT4gc2NhbGFyIEB7ICRUZW1wbGF0ZUlEc1JlZiB9LCAgICAgICAgIyB0b3RhbCBudW1iZXIgb2YgbGlzdCBpdGVtcywgdGVtcGxhdGVzIGluIHRoaXMgY2FzZQogICAgICAgIEZpbHRlciAgICAgPT4gJ0FsbCcsCiAgICAgICAgRmlsdGVycyAgICA9PiBcJU5hdkJhckZpbHRlciwKICAgICAgICBGaWx0ZXJMaW5rID0+ICRMaW5rRmlsdGVyLAogICAgICAgIFRpdGxlTmFtZSAgPT4gJ092ZXJ2aWV3OiBUZW1wbGF0ZScsCiAgICAgICAgVGl0bGVWYWx1ZSA9PiAkU2VsZi0+e0ZpbHRlcn0sCiAgICAgICAgRW52ICAgICAgICA9PiAkU2VsZiwKICAgICAgICBMaW5rUGFnZSAgID0+ICRMaW5rUGFnZSwKICAgICAgICBMaW5rU29ydCAgID0+ICRMaW5rU29ydCwKICAgICk7Cgo9Y3V0CgpzdWIgSVRTTVRlbXBsYXRlTGlzdFNob3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2Ugb2JqZWN0IHJlZiB0byBsb2NhbCwgcmVtb3ZlIGl0IGZyb20gJVBhcmFtIChwcmV2ZW50IG1lbW9yeSBsZWFrKQogICAgbXkgJEVudiA9IGRlbGV0ZSAkUGFyYW17RW52fTsKCiAgICAjIGZvciBub3cgdGhlcmUgaXMgb25seSB0aGUgJ1NtYWxsJyB2aWV3CiAgICBteSAkVmlldyA9ICdTbWFsbCc7CgogICAgIyBnZXQgYmFja2VuZCBmcm9tIGNvbmZpZwogICAgbXkgJEJhY2tlbmRzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkZyb250ZW5kOjpUZW1wbGF0ZU92ZXJ2aWV3Jyk7CiAgICBpZiAoICEkQmFja2VuZHMgKSB7CiAgICAgICAgcmV0dXJuICRFbnYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICdOZWVkIGNvbmZpZyBvcHRpb24gSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlRlbXBsYXRlT3ZlcnZpZXcnLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBmb3IgaGFzaC1yZWYKICAgIGlmICggcmVmICRCYWNrZW5kcyBuZSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICRFbnYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAnQ29uZmlnIG9wdGlvbiBJVFNNQ2hhbmdlOjpGcm9udGVuZDo6VGVtcGxhdGVPdmVydmlldyBuZWVkcyB0byBiZSBhIEhBU0ggcmVmIScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBjb25maWcga2V5CiAgICBpZiAoICEkQmFja2VuZHMtPnskVmlld30gKSB7CiAgICAgICAgcmV0dXJuICRFbnYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBjb25maWcgb3B0aW9uIGZvdW5kIGZvciB0aGUgdmlldyAnJFZpZXcnISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5hdiBiYXIKICAgIG15ICRTdGFydEhpdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAnU3RhcnRIaXQnLAogICAgKSB8fCAxOwoKICAgICMgY2hlY2sgc3RhcnQgb3B0aW9uLCBpZiBoaWdoZXIgdGhlbiBlbGVtZW50cyBhdmFpbGFibGUsIHNldAogICAgIyBpdCB0byB0aGUgbGFzdCBvdmVydmlldyBwYWdlIChUaGFua3MgdG8gU3RlZmFuIFNjaG1pZHQhKQogICAgbXkgJFBhZ2VTaG93biA9ICRCYWNrZW5kcy0+eyRWaWV3fS0+e1BhZ2VTaG93bn07CiAgICBpZiAoICRTdGFydEhpdCA+ICRQYXJhbXtUb3RhbH0gKSB7CiAgICAgICAgbXkgJFBhZ2VzID0gaW50KCAoICRQYXJhbXtUb3RhbH0gLyAkUGFnZVNob3duICkgKyAwLjk5OTk5ICk7CiAgICAgICAgJFN0YXJ0SGl0ID0gKCAoICRQYWdlcyAtIDEgKSAqICRQYWdlU2hvd24gKSArIDE7CiAgICB9CgogICAgIyBzZXQgcGFnZSBsaW1pdCBhbmQgYnVpbGQgcGFnZSBuYXYKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gfHwgMjBfMDAwOwogICAgbXkgJVBhZ2VOYXYgPSAkRW52LT57TGF5b3V0T2JqZWN0fS0+UGFnZU5hdkJhcigKICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgIFN0YXJ0SGl0ICA9PiAkU3RhcnRIaXQsCiAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgQWxsSGl0cyAgID0+ICRQYXJhbXtUb3RhbH0gfHwgMCwKICAgICAgICBBY3Rpb24gICAgPT4gJ0FjdGlvbj0nIC4gJEVudi0+e0xheW91dE9iamVjdH0tPntBY3Rpb259LAogICAgICAgIExpbmsgICAgICA9PiAkUGFyYW17TGlua1BhZ2V9LAogICAgKTsKCiAgICAjIGJ1aWxkIG5hdmJhciBjb250ZW50CiAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBiYWNrIGxpbmsKICAgIGlmICggJFBhcmFte0xpbmtCYWNrfSApIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZUJhY2snLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBmaWx0ZXJzCiAgICBpZiAoICRQYXJhbXtGaWx0ZXJzfSApIHsKCiAgICAgICAgIyBnZXQgZ2l2ZW4gZmlsdGVycwogICAgICAgIG15IEBOYXZCYXJGaWx0ZXJzOwogICAgICAgIGZvciBteSAkUHJpbyAoIHNvcnQga2V5cyAleyAkUGFyYW17RmlsdGVyc30gfSApIHsKICAgICAgICAgICAgcHVzaCBATmF2QmFyRmlsdGVycywgJFBhcmFte0ZpbHRlcnN9LT57JFByaW99OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBmaWx0ZXIgY29udGVudAogICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGxvb3Agb3ZlciBmaWx0ZXJzCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICBmb3IgbXkgJEZpbHRlciAoQE5hdkJhckZpbHRlcnMpIHsKCiAgICAgICAgICAgICMgYXQgbGVhc3QgYSBzZWNvbmQgZmlsdGVyIGlzIHNldCwgYnVpbGQgc3BsaXQgY29udGVudAogICAgICAgICAgICBpZiAoJENvdW50KSB7CiAgICAgICAgICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU3BsaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaW5jcmVtZW50IGZpbHRlciBjb3VudCBhbmQgYnVpbGQgZmlsdGVyIGl0ZW0KICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskRmlsdGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbHRlciBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICRGaWx0ZXItPntGaWx0ZXJ9IGVxICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbG9vcCBvdmVyIGNvbmZpZ3VyZWQgYmFja2VuZHMsIHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIGJhY2tlbmQKICAgIGlmICggc2NhbGFyKCBrZXlzICV7JEJhY2tlbmRzfSApID4gMSApIHsKICAgICAgICBmb3IgbXkgJEJhY2tlbmQgKCBrZXlzICV7JEJhY2tlbmRzfSApIHsKCiAgICAgICAgICAgICMgYnVpbGQgbmF2YmFyIHZpZXcgbW9kZQogICAgICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhclZpZXdNb2RlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyAkQmFja2VuZHMtPnskQmFja2VuZH0gfSwKICAgICAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJFBhcmFte0ZpbHRlcn0sCiAgICAgICAgICAgICAgICAgICAgVmlldyAgID0+ICRCYWNrZW5kLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3VycmVudCB2aWV3IGlzIGNvbmZpZ3VyZWQgaW4gYmFja2VuZAogICAgICAgICAgICBpZiAoICRWaWV3IGVxICRCYWNrZW5kICkgewogICAgICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmlldyAgID0+ICRCYWNrZW5kLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEVudi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJEJhY2tlbmRzLT57JEJhY2tlbmR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkUGFyYW17RmlsdGVyfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmlldyAgID0+ICRCYWNrZW5kLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcGFnZSBuYXYgaXMgYXZhaWxhYmxlCiAgICBpZiAoJVBhZ2VOYXYpIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYWdlTmF2LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBuYXYgYmFyIGlzIGF2YWlsYWJsZQogICAgaWYgKCAkUGFyYW17TmF2QmFyfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtOYXZCYXJ9LT57TWFpbk5hbWV9ICkgewogICAgICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhck1haW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17TmF2QmFyfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBodG1sIGNvbnRlbnQKICAgIG15ICRPdXRwdXROYXZCYXIgPSAkRW52LT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW19LAogICAgKTsKCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5QcmludCgKICAgICAgICAgICAgT3V0cHV0ID0+IFwkT3V0cHV0TmF2QmFyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXROYXZCYXI7CiAgICB9CgogICAgIyBsb2FkIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEJhY2tlbmRzLT57JFZpZXd9LT57TW9kdWxlfSApICkgewogICAgICAgIHJldHVybiAkRW52LT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkT2JqZWN0ID0gJEJhY2tlbmRzLT57JFZpZXd9LT57TW9kdWxlfS0+bmV3KCAleyRFbnZ9ICk7CiAgICByZXR1cm4gaWYgISRPYmplY3Q7CgogICAgIyBydW4gbW9kdWxlCiAgICBteSAkT3V0cHV0ID0gJE9iamVjdC0+UnVuKAogICAgICAgICVQYXJhbSwKICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgIFN0YXJ0SGl0ICA9PiAkU3RhcnRIaXQsCiAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgQWxsSGl0cyAgID0+ICRQYXJhbXtUb3RhbH0gfHwgMCwKICAgICk7CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoCiAgICAgICAgICAgIE91dHB1dCA9PiBcJE91dHB1dCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0OwogICAgfQoKICAgICMgY3JlYXRlIG92ZXJ2aWV3IG5hdiBiYXIKICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgcGFnZSBuYXYgYW5kIGNyZWF0ZSBjb250ZW50CiAgICBpZiAoJVBhZ2VOYXYpIHsKICAgICAgICAkRW52LT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhcicsCiAgICAgICAgICAgIERhdGEgPT4geyVQYWdlTmF2fSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIHNtYWwgbmF2IGJhcgogICAgbXkgJE91dHB1dE5hdkJhclNtYWxsID0gJEVudi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdOYXZCYXJTbWFsbCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW19LAogICAgKTsKCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRFbnYtPntMYXlvdXRPYmplY3R9LT5QcmludCgKICAgICAgICAgICAgT3V0cHV0ID0+IFwkT3V0cHV0TmF2QmFyU21hbGwsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE5hdkJhclNtYWxsOwogICAgfQoKICAgICMgcmV0dXJuIGNvbnRlbnQgaWYgYXZhaWxhYmxlCiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKPWJlZ2luIEludGVybmFsOgoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0SVRTTUNoYW5nZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGlua09iamVjdElUU01DaGFuZ2UucG0sdiAxLjEwIDIwMTAvMDYvMTYgMTU6NDY6MDAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RJVFNNQ2hhbmdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdElUU01DaGFuZ2UgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgbGluayBvYmplY3QgKGNoYW5nZSkKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdElUU01DaGFuZ2UtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IFVzZXJPYmplY3QgRW5jb2RlT2JqZWN0CiAgICAgICAgUXVldWVPYmplY3QgR3JvdXBPYmplY3QgUGFyYW1PYmplY3QgVGltZU9iamVjdCBMYW5ndWFnZU9iamVjdCBVc2VyTGFuZ3VhZ2UgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGRlZmluZSBuZWVkZWQgdmFyaWFibGVzCiAgICAkU2VsZi0+e09iamVjdERhdGF9ID0gewogICAgICAgIE9iamVjdCAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBSZWFsbmFtZSA9PiAnQ2hhbmdlJywKICAgIH07CgogICAgIyBnZXQgY29uZmlnCiAgICAkU2VsZi0+e0NoYW5nZUhvb2t9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6Okhvb2snKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFRhYmxlQ3JlYXRlQ29tcGxleCgpCgpyZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUgYmxvY2sgZGF0YQoKUmV0dXJuCgogICAgQEJsb2NrRGF0YSA9ICgKICAgICAgICBPYmplY3QgICAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIEJsb2NrbmFtZSA9PiAnQ2hhbmdlJywKICAgICAgICBIZWFkbGluZSAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ2hhbmdlIycsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2UgU3RhdGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NoYW5nZWQnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAxNTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBJdGVtTGlzdCA9PiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnQ2hhbmdlU3RhdGVTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnZ3JheWxlZCcsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDkxMDAxMTIzNDU3NzgnLAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgPT4gJ0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tJkNoYW5nZUlEPTEyMycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA4LTAxLTAxIDEyOjEyOjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnQ2hhbmdlU3RhdGVTaWduYWwnLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgID0+IDQ1NiwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICdjbG9zZWQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA5MTAwMTEyMzQ1Nzc0JywKICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICdBY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbSZDaGFuZ2VJRD00NTYnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdjbG9zZWQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUaW1lTG9uZycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOC0wMS0wMSAxMjoxMjowMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICApOwoKICAgIEBCbG9ja0RhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVDb21wbGV4KAogICAgICAgIE9iamVjdExpbmtMaXN0V2l0aERhdGEgPT4gJE9iamVjdExpbmtMaXN0UmVmLAogICAgKTsKCj1jdXQKCnN1YiBUYWJsZUNyZWF0ZUNvbXBsZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IHx8IHJlZiAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RMaW5rTGlzdFdpdGhEYXRhIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjb252ZXJ0IHRoZSBsaXN0CiAgICBteSAlTGlua0xpc3Q7CiAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfSApIHsKCiAgICAgICAgIyBleHRyYWN0IGxpbmsgdHlwZSBMaXN0CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfS0+eyRMaW5rVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgZm9yIG15ICRDaGFuZ2VJRCAoIGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgJExpbmtMaXN0eyRDaGFuZ2VJRH0tPntEYXRhfSA9ICREaXJlY3Rpb25MaXN0LT57JENoYW5nZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgaXRlbSBsaXN0LCBzb3J0IGJ5IENoYW5nZUlEIERvd24KICAgIG15IEBJdGVtTGlzdDsKICAgIGZvciBteSAkQ2hhbmdlSUQgKAogICAgICAgIHNvcnQgewogICAgICAgICAgICAkTGlua0xpc3R7JGJ9e0RhdGF9LT57Q2hhbmdlSUR9IDw9PiAkTGlua0xpc3R7JGF9e0RhdGF9LT57Q2hhbmdlSUR9CiAgICAgICAgfSBrZXlzICVMaW5rTGlzdAogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBleHRyYWN0IGNoYW5nZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZSA9ICRMaW5rTGlzdHskQ2hhbmdlSUR9e0RhdGF9OwoKICAgICAgICBteSBASXRlbUNvbHVtbnMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdDaGFuZ2VTdGF0ZVNpZ25hbCcsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ2hhbmdlLT57Q2hhbmdlU3RhdGVTaWduYWx9LAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJENoYW5nZS0+e0NoYW5nZVN0YXRlfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgTGluayAgICA9PiAnJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tJkNoYW5nZUlEPScgLiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJENoYW5nZS0+e0NoYW5nZVRpdGxlfSwKICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAkQ2hhbmdlLT57Q2hhbmdlU3RhdGV9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENoYW5nZS0+e0NoYW5nZVRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcQEl0ZW1Db2x1bW5zOwogICAgfQoKICAgIHJldHVybiBpZiAhQEl0ZW1MaXN0OwoKICAgICMgZGVmaW5lIHRoZSBibG9jayBkYXRhCiAgICBteSAlQmxvY2sgPSAoCiAgICAgICAgT2JqZWN0ICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9LAogICAgICAgIEJsb2NrbmFtZSA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57UmVhbG5hbWV9LAogICAgICAgIEhlYWRsaW5lICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRTZWxmLT57Q2hhbmdlSG9va30sCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgSXRlbUxpc3QgPT4gXEBJdGVtTGlzdCwKICAgICk7CgogICAgcmV0dXJuICggXCVCbG9jayApOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIElUU01DaGFuZ2UgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NIOjIwMDkxMDAxMTIzNTQzMjEtMScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnQ2hhbmdlIyAyMDA5MTAxNjEwMDA1NDAyOiBUaGUgQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgICAgICAgICBDc3MgICAgID0+ICdzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2giJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ0g6MjAwOTEwMDExMjM1NDMyMS02JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdDaGFuZ2UjIDIwMDkxMDE2MTAwMDc2MzQ6IFRoZSBDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFBhcmVudENoaWxkOjpUYXJnZXQgPT4gewogICAgICAgICAgICBJVFNNQ2hhbmdlID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDSDoyMDA5MTAwMTEyMzU0MzIxLTMnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0NoYW5nZSMgMjAwOTEwMTYxMDAwNDQzMzE6IFRoZSBDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVMaW5rT3V0cHV0RGF0YTsKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICAjIGNyZWF0ZSB0aGUgaXRlbSBsaXN0LCBzb3J0IGJ5IENoYW5nZUlEIERvd24KICAgICAgICAgICAgbXkgQEl0ZW1MaXN0OwogICAgICAgICAgICBmb3IgbXkgJENoYW5nZUlEICgKICAgICAgICAgICAgICAgIHNvcnQgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb25MaXN0LT57JGJ9LT57Q2hhbmdlSUR9IDw9PiAkRGlyZWN0aW9uTGlzdC0+eyRhfS0+e0NoYW5nZUlEfQogICAgICAgICAgICAgICAgfSBrZXlzICV7JERpcmVjdGlvbkxpc3R9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgY2hhbmdlIGRhdGEKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2UgPSAkRGlyZWN0aW9uTGlzdC0+eyRDaGFuZ2VJRH07CgogICAgICAgICAgICAgICAgIyBkZWZpbmUgaXRlbSBkYXRhCiAgICAgICAgICAgICAgICBteSAlSXRlbSA9ICgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDSDonIC4gJENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIiRTZWxmLT57Q2hhbmdlSG9va30gJENoYW5nZS0+e0NoYW5nZU51bWJlcn06ICRDaGFuZ2UtPntDaGFuZ2VUaXRsZX0iLAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbSZDaGFuZ2VJRD0nIC4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBASXRlbUxpc3QsIFwlSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaXRlbSBsaXN0IHRvIGxpbmsgb3V0cHV0IGRhdGEKICAgICAgICAgICAgJExpbmtPdXRwdXREYXRheyAkTGlua1R5cGUgLiAnOjonIC4gJERpcmVjdGlvbiB9LT57SVRTTUNoYW5nZX0gPSBcQEl0ZW1MaXN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUxpbmtPdXRwdXREYXRhOwp9Cgo9aXRlbSBDb250ZW50U3RyaW5nQ3JlYXRlKCkKCnJldHVybiBhIG91dHB1dCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+Q29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICBDb250ZW50RGF0YSA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ29udGVudFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29udGVudERhdGF9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb250ZW50RGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXh0cmFjdCBjb250ZW50CiAgICBteSAkQ29udGVudCA9ICRQYXJhbXtDb250ZW50RGF0YX07CgogICAgcmV0dXJuIGlmICRDb250ZW50LT57VHlwZX0gbmUgJ0NoYW5nZVN0YXRlU2lnbmFsJzsKCiAgICAjIGJ1aWxkIGh0bWwgZm9yIHNpZ25hbCBMRUQKICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZSA9PiAnPGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn0kUURhdGF7IkNoYW5nZVN0YXRlU2lnbmFsIn0ucG5nIiAnCiAgICAgICAgICAgIC4gJ3RpdGxlPSIkVGV4dHsiJFFEYXRheyJDaGFuZ2VTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiQ2hhbmdlU3RhdGUifSJ9Ij4nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VTdGF0ZVNpZ25hbCA9PiAkQ29udGVudC0+e0NvbnRlbnR9LAogICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkQ29udGVudC0+e0NoYW5nZVN0YXRlfSB8fCAnJywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VsZWN0YWJsZU9iamVjdExpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWxlY3RhYmxlIG9iamVjdHMKClJldHVybgoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgVmFsdWUgPT4gJ0NoYW5nZScsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gJExpbmtPYmplY3QtPlNlbGVjdGFibGVPYmplY3RMaXN0KAogICAgICAgIFNlbGVjdGVkID0+ICRJZGVudGlmaWVyLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlbGVjdGFibGVPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGVjdGVkOwogICAgaWYgKCAkUGFyYW17U2VsZWN0ZWR9ICYmICRQYXJhbXtTZWxlY3RlZH0gZXEgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgIH0KCiAgICAjIG9iamVjdCBzZWxlY3QgbGlzdAogICAgbXkgQE9iamVjdFNlbGVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCgogICAgICAgICAgICAjIGFsc28gdXNlIHRoZSBvYmplY3QgaGVyZSBhbmQgbm90IHRoZSByZWFsIG5hbWUsIGZvciB0cmFuc2xhdGlvbiBpc3N1ZXMKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCgogICAgICAgICAgICBTZWxlY3RlZCA9PiAkU2VsZWN0ZWQsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBPYmplY3RTZWxlY3RMaXN0Owp9Cgo9aXRlbSBTZWFyY2hPcHRpb25MaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VhcmNoIG9wdGlvbnMKClJldHVybgoKICAgIEBTZWFyY2hPcHRpb25MaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdDaGFuZ2VOdW1iZXInLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0NoYW5nZSMnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnMTInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdDaGFuZ2UgVGl0bGUnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnTWFpbFNlcnZlciBuZWVkcyB1cGRhdGUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdXb3Jrb3JkZXIgVGl0bGUnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnU2h1dGRvd24gb2xkIG1haWwgc2VydmVyJywKICAgICAgICB9LAogICAgKTsKCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICRMaW5rT2JqZWN0LT5TZWFyY2hPcHRpb25MaXN0KCk7Cgo9Y3V0CgpzdWIgU2VhcmNoT3B0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2VhcmNoIG9wdGlvbiBsaXN0CiAgICBteSBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0NoYW5nZU51bWJlcicsCiAgICAgICAgICAgIE5hbWUgPT4gJFNlbGYtPntDaGFuZ2VIb29rfSwKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgYWRkIGZvcm1rZXkKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewogICAgICAgICRSb3ctPntGb3JtS2V5fSA9ICdTRUFSQ0g6OicgLiAkUm93LT57S2V5fTsKICAgIH0KCiAgICAjIGFkZCBmb3JtIGRhdGEgYW5kIGlucHV0IHN0cmluZwogICAgUk9XOgogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CgogICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICRSb3ctPntGb3JtRGF0YX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRSb3ctPntGb3JtS2V5fSApOwoKICAgICAgICAjIHBhcnNlIHRoZSBpbnB1dCB0ZXh0IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW5wdXRUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJFJvdy0+e0Zvcm1LZXl9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFJvdy0+e0Zvcm1EYXRhfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgJFJvdy0+e0lucHV0U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdMaW5rT2JqZWN0JywKICAgICAgICApOwoKICAgICAgICBuZXh0IFJPVzsKICAgIH0KCiAgICByZXR1cm4gQFNlYXJjaE9wdGlvbkxpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEwICQgJERhdGU6IDIwMTAvMDYvMTYgMTU6NDY6MDAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0SVRTTVdvcmtPcmRlci5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTGlua09iamVjdElUU01Xb3JrT3JkZXIucG0sdiAxLjIyIDIwMTAvMDQvMjcgMjA6Mzk6MDIgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3RJVFNNV29ya09yZGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIyICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdElUU01Xb3JrT3JkZXIgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgbGluayBvYmplY3QgKHdvcmtvcmRlcikKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdElUU01Xb3JrT3JkZXItPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0IFVzZXJPYmplY3QgRW5jb2RlT2JqZWN0CiAgICAgICAgUXVldWVPYmplY3QgR3JvdXBPYmplY3QgUGFyYW1PYmplY3QgVGltZU9iamVjdCBMYW5ndWFnZU9iamVjdCBVc2VyTGFuZ3VhZ2UgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGRlZmluZSBuZWVkZWQgdmFyaWFibGVzCiAgICAkU2VsZi0+e09iamVjdERhdGF9ID0gewogICAgICAgIE9iamVjdCAgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBSZWFsbmFtZSA9PiAnV29ya29yZGVyJywKICAgIH07CgogICAgIyBnZXQgY29uZmlnCiAgICAkU2VsZi0+e0NoYW5nZUhvb2t9ICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6Okhvb2snKTsKICAgICRTZWxmLT57V29ya09yZGVySG9va30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6SG9vaycpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGFibGVDcmVhdGVDb21wbGV4KCkKCnJldHVybiBhbiBhcnJheSB3aXRoIHRoZSBibG9jayBkYXRhCgpSZXR1cm4KCiAgICBAQmxvY2tEYXRhID0gKAogICAgICAgIE9iamVjdCAgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgQmxvY2tuYW1lID0+ICdXb3JrT3JkZXInLAogICAgICAgIEhlYWRsaW5lICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdXb3Jrb3JkZXIjJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdXb3Jrb3JkZXIgVGl0bGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0NoYW5nZSBUaXRsZScsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnV29ya29yZGVyIFN0YXRlJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgSXRlbUxpc3QgPT4gWwogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1dvcmtPcmRlclN0YXRlU2lnbmFsJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgICAgID0+ICdncmVlbmxlZCcsCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ3JlYWR5JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnMjAwOTEwMDExMjM0NTc3OC0zJywKICAgICAgICAgICAgICAgICAgICBMaW5rICAgID0+ICdBY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbSZXb3JrT3JkZXJJRD0yJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ1dvcmtvcmRlciBUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICA9PiAnQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ3JlYWR5JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGltZUxvbmcnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDktMDEtMDEgMTI6MTI6MDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdXb3JrT3JkZXJTdGF0ZVNpZ25hbCcsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gNCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICA9PiAncmVkbGVkJywKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnY2FuY2VsZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJzIwMDkxMDAxMTIzNDU3NzgtNCcsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAnQWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb20mV29ya09yZGVySUQ9NCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICdXb3Jrb3JkZXIgVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiA3MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0NoYW5nZSBUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdhY2NlcHRlZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ1RpbWVMb25nJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDA5LTAyLTAyIDEzOjEzOjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgXSwKICAgICk7CgogICAgQEJsb2NrRGF0YSA9ICRMaW5rT2JqZWN0LT5UYWJsZUNyZWF0ZUNvbXBsZXgoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlQ29tcGxleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0gfHwgcmVmICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE9iamVjdExpbmtMaXN0V2l0aERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNvbnZlcnQgdGhlIGxpc3QKICAgIG15ICVMaW5rTGlzdDsKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICgga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAkTGlua0xpc3R7JFdvcmtPcmRlcklEfS0+e0RhdGF9ID0gJERpcmVjdGlvbkxpc3QtPnskV29ya09yZGVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBpdGVtIGxpc3QsIHNvcnQgYnkgQ2hhbmdlSUQgRG93biwgdGhlbiBieSBXb3JrT3JkZXJJRCBVcAogICAgbXkgQEl0ZW1MaXN0OwogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoCiAgICAgICAgc29ydCB7CiAgICAgICAgICAgICRMaW5rTGlzdHskYn17RGF0YX0tPntDaGFuZ2VJRH0gPD0+ICRMaW5rTGlzdHskYX17RGF0YX0tPntDaGFuZ2VJRH0KICAgICAgICAgICAgICAgIHx8ICRhIDw9PiAkYgogICAgICAgIH0ga2V5cyAlTGlua0xpc3QKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXh0cmFjdCB3b3Jrb3JkZXIgZGF0YQogICAgICAgIG15ICRXb3JrT3JkZXIgPSAkTGlua0xpc3R7JFdvcmtPcmRlcklEfXtEYXRhfTsKCiAgICAgICAgbXkgQEl0ZW1Db2x1bW5zID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAnV29ya09yZGVyU3RhdGVTaWduYWwnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlU2lnbmFsfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkV29ya09yZGVyLT57Q2hhbmdlRGF0YX0tPntDaGFuZ2VOdW1iZXJ9CiAgICAgICAgICAgICAgICAgICAgLiAnLScgLiAkV29ya09yZGVyLT57V29ya09yZGVyTnVtYmVyfSwKICAgICAgICAgICAgICAgIExpbmsgPT4gJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbSZXb3JrT3JkZXJJRD0nIC4gJFdvcmtPcmRlcklELAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgQ29udGVudCAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJUaXRsZX0sCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gNzAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJFdvcmtPcmRlci0+e0NoYW5nZURhdGF9LT57Q2hhbmdlVGl0bGV9LAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGltZUxvbmcnLAogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkV29ya09yZGVyLT57Q2hhbmdlVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBASXRlbUxpc3QsIFxASXRlbUNvbHVtbnM7CiAgICB9CgogICAgcmV0dXJuIGlmICFASXRlbUxpc3Q7CgogICAgIyBkZWZpbmUgdGhlIGJsb2NrIGRhdGEKICAgIG15ICVCbG9jayA9ICgKICAgICAgICBPYmplY3QgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgQmxvY2tuYW1lID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgSGVhZGxpbmUgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFNlbGYtPntXb3JrT3JkZXJIb29rfSwKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDIwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICAgICAgV2lkdGggICA9PiAyMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1dvcmtPcmRlclN0YXRlJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgSXRlbUxpc3QgPT4gXEBJdGVtTGlzdCwKICAgICk7CgogICAgcmV0dXJuICggXCVCbG9jayApOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZVNpbXBsZSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggdGhlIGxpbmsgb3V0cHV0IGRhdGEKClJldHVybgoKICAgICVMaW5rT3V0cHV0RGF0YSA9ICgKICAgICAgICBOb3JtYWw6OlNvdXJjZSA9PiB7CiAgICAgICAgICAgIElUU01Xb3JrT3JkZXIgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1dPOjIwMDkxMDAxMTIzNTQzMjEtMScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnQ2hhbmdlIyAyMDA5MTAxNjEwMDA1NDAyIC0gV29ya29yZGVyIyAxOiBUaGUgV29ya09yZGVyIFRpdGxlJywKICAgICAgICAgICAgICAgICAgICBDc3MgICAgID0+ICdzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2giJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnV086MjAwOTEwMDExMjM1NDMyMS02JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdDaGFuZ2UjIDIwMDkxMDE2MTAwMDc2MzQgLSBXb3Jrb3JkZXIjIDY6IFRoZSBXb3JrT3JkZXIgVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFBhcmVudENoaWxkOjpUYXJnZXQgPT4gewogICAgICAgICAgICBJVFNNV29ya09yZGVyID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdXTzoyMDA5MTAwMTEyMzU0MzIxLTMnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0NoYW5nZSMgMjAwOTEwMTYxMDAwNDQzMzEgLSBXb3Jrb3JkZXIjIDM6IFRoZSBXb3JrT3JkZXIgVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkTGlua09iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVMaW5rT3V0cHV0RGF0YTsKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB9ICkgewoKICAgICAgICAjIGV4dHJhY3QgbGluayB0eXBlIExpc3QKICAgICAgICBteSAkTGlua1R5cGVMaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfTsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JExpbmtUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CgogICAgICAgICAgICAjIGNyZWF0ZSB0aGUgaXRlbSBsaXN0LCBzb3J0IGJ5IENoYW5nZUlEIERvd24sIHRoZW4gYnkgV29ya09yZGVyTnVtYmVyIFVwCiAgICAgICAgICAgIG15IEBJdGVtTGlzdDsKICAgICAgICAgICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoCiAgICAgICAgICAgICAgICBzb3J0IHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0aW9uTGlzdC0+eyRifS0+e0NoYW5nZUlEfSA8PT4gJERpcmVjdGlvbkxpc3QtPnskYX0tPntDaGFuZ2VJRH0KICAgICAgICAgICAgICAgICAgICAgICAgfHwgJGEgPD0+ICRiCiAgICAgICAgICAgICAgICB9IGtleXMgJXskRGlyZWN0aW9uTGlzdH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCB3b3Jrb3JkZXIgZGF0YQogICAgICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICREaXJlY3Rpb25MaXN0LT57JFdvcmtPcmRlcklEfTsKCiAgICAgICAgICAgICAgICAjIGRlZmluZSBpdGVtIGRhdGEKICAgICAgICAgICAgICAgIG15ICVJdGVtID0gKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1dPOicgLiAkV29ya09yZGVyLT57Q2hhbmdlRGF0YX0tPntDaGFuZ2VOdW1iZXJ9IC4gJy0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlci0+e1dvcmtPcmRlck51bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFNlbGYtPntDaGFuZ2VIb29rfSAuICRXb3JrT3JkZXItPntDaGFuZ2VEYXRhfS0+e0NoYW5nZU51bWJlcn0gLiAnLScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e1dvcmtPcmRlckhvb2t9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlci0+e1dvcmtPcmRlck51bWJlcn0gLiAnOiAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclRpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rID0+ICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb20mV29ya09yZGVySUQ9JwogICAgICAgICAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICAgICBNYXhMZW5ndGggPT4gMjAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQEl0ZW1MaXN0LCBcJUl0ZW07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGl0ZW0gbGlzdCB0byBsaW5rIG91dHB1dCBkYXRhCiAgICAgICAgICAgICRMaW5rT3V0cHV0RGF0YXsgJExpbmtUeXBlIC4gJzo6JyAuICREaXJlY3Rpb24gfS0+e0lUU01Xb3JrT3JkZXJ9ID0gXEBJdGVtTGlzdDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMaW5rT3V0cHV0RGF0YTsKfQoKPWl0ZW0gQ29udGVudFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm4gYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29udGVudERhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbnRlbnREYXRhfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29udGVudERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4dHJhY3QgY29udGVudAogICAgbXkgJENvbnRlbnQgPSAkUGFyYW17Q29udGVudERhdGF9OwoKICAgIHJldHVybiBpZiAkQ29udGVudC0+e1R5cGV9IG5lICdXb3JrT3JkZXJTdGF0ZVNpZ25hbCc7CgogICAgIyBidWlsZCBodG1sIGZvciBzaWduYWwgTEVECiAgICBteSAkU3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJzxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJXb3JrT3JkZXJTdGF0ZVNpZ25hbCJ9LnBuZyIgJwogICAgICAgICAgICAuICd0aXRsZT0iJFRleHR7IiRRRGF0YXsiV29ya09yZGVyU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IldvcmtPcmRlclN0YXRlIn0ifSI+JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVTaWduYWwgPT4gJENvbnRlbnQtPntDb250ZW50fSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJENvbnRlbnQtPntXb3JrT3JkZXJTdGF0ZX0gfHwgJycsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlbGVjdGFibGVPYmplY3RMaXN0KCkKCnJldHVybiBhbiBhcnJheSBoYXNoIHdpdGggc2VsZWN0YWJsZSBvYmplY3RzCgpSZXR1cm4KCiAgICBAU2VsZWN0YWJsZU9iamVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgIFZhbHVlID0+ICdXb3JrT3JkZXInLAogICAgICAgIH0sCiAgICApOwoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICRMaW5rT2JqZWN0LT5TZWxlY3RhYmxlT2JqZWN0TGlzdCgKICAgICAgICBTZWxlY3RlZCA9PiAkSWRlbnRpZmllciwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBTZWxlY3RhYmxlT2JqZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxlY3RlZDsKICAgIGlmICggJFBhcmFte1NlbGVjdGVkfSAmJiAkUGFyYW17U2VsZWN0ZWR9IGVxICRTZWxmLT57T2JqZWN0RGF0YX0tPntPYmplY3R9ICkgewogICAgICAgICRTZWxlY3RlZCA9IDE7CiAgICB9CgogICAgIyBvYmplY3Qgc2VsZWN0IGxpc3QKICAgIG15IEBPYmplY3RTZWxlY3RMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWxmLT57T2JqZWN0RGF0YX0tPntSZWFsbmFtZX0sCiAgICAgICAgICAgIFNlbGVjdGVkID0+ICRTZWxlY3RlZCwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQE9iamVjdFNlbGVjdExpc3Q7Cn0KCj1pdGVtIFNlYXJjaE9wdGlvbkxpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWFyY2ggb3B0aW9ucwoKUmV0dXJuCgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0NoYW5nZU51bWJlcicsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2hhbmdlIycsCiAgICAgICAgICAgIElucHV0U3RyZyA9PiAkRm9ybVN0cmluZywKICAgICAgICAgICAgRm9ybURhdGEgID0+ICcyMDA5MTAwMTEyMzU0MzIxJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnQ2hhbmdlIFRpdGxlJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ01haWwgc2VydmVyIG5lZWRzIHVwZGF0ZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnV29ya09yZGVyTnVtYmVyJywKICAgICAgICAgICAgTmFtZSAgICAgID0+ICdXb3Jrb3JkZXIjJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJzEyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnV29ya09yZGVyIFRpdGxlJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ1NodXRkb3duIG9sZCBtYWlsIHNlcnZlcicsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAkTGlua09iamVjdC0+U2VhcmNoT3B0aW9uTGlzdCgpOwoKPWN1dAoKc3ViIFNlYXJjaE9wdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNlYXJjaCBvcHRpb24gbGlzdAogICAgbXkgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdDaGFuZ2VOdW1iZXInLAogICAgICAgICAgICBOYW1lID0+ICRTZWxmLT57Q2hhbmdlSG9va30sCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ1dvcmtPcmRlck51bWJlcicsCiAgICAgICAgICAgIE5hbWUgPT4gJFNlbGYtPntXb3JrT3JkZXJIb29rfSwKICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBmb3Jta2V5CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKICAgICAgICAkUm93LT57Rm9ybUtleX0gPSAnU0VBUkNIOjonIC4gJFJvdy0+e0tleX07CiAgICB9CgogICAgIyBhZGQgZm9ybSBkYXRhIGFuZCBpbnB1dCBzdHJpbmcKICAgIFJPVzoKICAgIGZvciBteSAkUm93IChAU2VhcmNoT3B0aW9uTGlzdCkgewoKICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAkUm93LT57Rm9ybURhdGF9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUm93LT57Rm9ybUtleX0gKTsKCiAgICAgICAgIyBwYXJzZSB0aGUgaW5wdXQgdGV4dCBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0lucHV0VGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICRSb3ctPntGb3JtS2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRSb3ctPntGb3JtRGF0YX0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdGhlIGlucHV0IHN0cmluZwogICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnTGlua09iamVjdCcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBST1c7CiAgICB9CgogICAgcmV0dXJuIEBTZWFyY2hPcHRpb25MaXN0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yMiAkICREYXRlOiAyMDEwLzA0LzI3IDIwOjM5OjAyICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9OYXZCYXJDaGFuZ2VNYW5hZ2VyLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBOYXZCYXJDaGFuZ2VNYW5hZ2VyLnBtLHYgMS40IDIwMTAvMDQvMjcgMjA6Mzk6MDIgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhckNoYW5nZU1hbmFnZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBHcm91cE9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgYWN0aW9uLCBncm91cCwgbGFiZWwsIGltYWdlIGFuZCBwcmlvCiAgICBteSAkQWN0aW9uID0gJ0FnZW50SVRTTUNoYW5nZU1hbmFnZXInOwogICAgbXkgJEdyb3VwICA9ICdpdHNtLWNoYW5nZS1tYW5hZ2VyJzsKICAgIG15ICRMYWJlbCAgPSAnQ2hhbmdlTWFuYWdlcic7CiAgICBteSAkSW1hZ2UgID0gJ25ldy1tZXNzYWdlLnBuZyc7CiAgICBteSAkUHJpbyAgID0gJzA5OTEwMDAnOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRBY3Rpb24iKTsKCiAgICAjIGdldCB0aGUgZ3JvdXAgaWQKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKCBHcm91cCA9PiAkR3JvdXAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBkZW55IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIGRvIG5vdCBzaG93IGljb24gaWYgZnJvbnRlbmQgbW9kdWxlIGlzIG5vdCByZWdpc3RlcmVkCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnskQWN0aW9ufTsKCiAgICAjIGdldCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIGNoYW5nZXMKICAgIG15ICRDb3VudCA9IDA7CiAgICBpZiAoICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSAmJiBAeyAkQ29uZmlnLT57J0ZpbHRlcjo6Q2hhbmdlU3RhdGVzJ30gfSApIHsKCiAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIGNoYW5nZXMKICAgICAgICAkQ291bnQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEcyA9PiBbICRTZWxmLT57VXNlcklEfSBdLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgICAgID0+ICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSwKICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBpY29uIGxhYmVsCiAgICBteSAkVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRMYWJlbCkgLiAiICgkQ291bnQpIjsKCiAgICAjIGJ1aWxkIGljb24gZGF0YQogICAgbXkgJUljb24gPSAoCiAgICAgICAgJFByaW8gPT4gewogICAgICAgICAgICBCbG9jayAgICAgICA9PiAnSXRlbVBlcnNvbmFsJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFRleHQsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICBJbWFnZSAgICAgICA9PiAkSW1hZ2UsCiAgICAgICAgICAgIExpbmsgICAgICAgID0+ICdBY3Rpb249JyAuICRBY3Rpb24sCiAgICAgICAgICAgIEFjY2Vzc0tleSAgID0+ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAlSWNvbjsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9OYXZCYXJNeUNBQi5wbQojIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTmF2QmFyTXlDQUIucG0sdiAxLjIgMjAwOS8xMi8wMSAxNTo0OTowMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyTXlDQUI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBHcm91cE9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgYWN0aW9uLCBncm91cCwgbGFiZWwsIGltYWdlIGFuZCBwcmlvCiAgICBteSAkQWN0aW9uID0gJ0FnZW50SVRTTUNoYW5nZU15Q0FCJzsKICAgIG15ICRHcm91cCAgPSAnaXRzbS1jaGFuZ2UnOwogICAgbXkgJExhYmVsICA9ICdNeSBDQUJzJzsKICAgIG15ICRJbWFnZSAgPSAnbmV3LW1lc3NhZ2UucG5nJzsKICAgIG15ICRQcmlvICAgPSAnMDk5MjAwMCc7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JEFjdGlvbiIpOwoKICAgICMgZ2V0IHRoZSBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICRHcm91cCApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzIGlmIHRoZSBhZ2VudCBkb2Vzbid0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW4gdGhlIGFwcHJvcHJpYXRlIGdyb3VwCiAgICByZXR1cm4gaWYgISRHcm91cHN7JEdyb3VwSUR9OwoKICAgICMgZG8gbm90IHNob3cgaWNvbiBpZiBmcm9udGVuZCBtb2R1bGUgaXMgbm90IHJlZ2lzdGVyZWQKICAgIHJldHVybiBpZiAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRBY3Rpb259OwoKICAgICMgZ2V0IHRoZSBudW1iZXIgb2Ygdmlld2FibGUgY2hhbmdlcwogICAgbXkgJENvdW50ID0gMDsKICAgIGlmICggJENvbmZpZy0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICYmIEB7ICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2Ygdmlld2FibGUgY2hhbmdlcwogICAgICAgICRDb3VudCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICBDQUJBZ2VudHMgICAgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgQ2hhbmdlU3RhdGVzID0+ICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSwKICAgICAgICAgICAgTGltaXQgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBpY29uIGxhYmVsCiAgICBteSAkVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRMYWJlbCkgLiAiICgkQ291bnQpIjsKCiAgICAjIGJ1aWxkIGljb24gZGF0YQogICAgbXkgJUljb24gPSAoCiAgICAgICAgJFByaW8gPT4gewogICAgICAgICAgICBCbG9jayAgICAgICA9PiAnSXRlbVBlcnNvbmFsJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFRleHQsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICBJbWFnZSAgICAgICA9PiAkSW1hZ2UsCiAgICAgICAgICAgIExpbmsgICAgICAgID0+ICdBY3Rpb249JyAuICRBY3Rpb24sCiAgICAgICAgICAgIEFjY2Vzc0tleSAgID0+ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAlSWNvbjsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9OYXZCYXJNeUNoYW5nZXMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE5hdkJhck15Q2hhbmdlcy5wbSx2IDEuMSAyMDA5LzEyLzAxIDAxOjAyOjIxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNeUNoYW5nZXM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBHcm91cE9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgYWN0aW9uLCBncm91cCwgbGFiZWwsIGltYWdlIGFuZCBwcmlvCiAgICBteSAkQWN0aW9uID0gJ0FnZW50SVRTTUNoYW5nZU15Q2hhbmdlcyc7CiAgICBteSAkR3JvdXAgID0gJ2l0c20tY2hhbmdlLWJ1aWxkZXInOwogICAgbXkgJExhYmVsICA9ICdNeSBDaGFuZ2VzJzsKICAgIG15ICRJbWFnZSAgPSAnbmV3LW1lc3NhZ2UucG5nJzsKICAgIG15ICRQcmlvICAgPSAnMDk5MzAwMCc7CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6JEFjdGlvbiIpOwoKICAgICMgZ2V0IHRoZSBncm91cCBpZAogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICRHcm91cCApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzIGlmIHRoZSBhZ2VudCBkb2Vzbid0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW4gdGhlIGFwcHJvcHJpYXRlIGdyb3VwCiAgICByZXR1cm4gaWYgISRHcm91cHN7JEdyb3VwSUR9OwoKICAgICMgZG8gbm90IHNob3cgaWNvbiBpZiBmcm9udGVuZCBtb2R1bGUgaXMgbm90IHJlZ2lzdGVyZWQKICAgIHJldHVybiBpZiAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRBY3Rpb259OwoKICAgICMgZ2V0IHRoZSBudW1iZXIgb2Ygdmlld2FibGUgY2hhbmdlcwogICAgbXkgJENvdW50ID0gMDsKICAgIGlmICggJENvbmZpZy0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9ICYmIEB7ICRDb25maWctPnsnRmlsdGVyOjpDaGFuZ2VTdGF0ZXMnfSB9ICkgewoKICAgICAgICAjIGNvdW50IHRoZSBudW1iZXIgb2Ygdmlld2FibGUgY2hhbmdlcwogICAgICAgICRDb3VudCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICBDaGFuZ2VCdWlsZGVySURzID0+IFsgJFNlbGYtPntVc2VySUR9IF0sCiAgICAgICAgICAgIENoYW5nZVN0YXRlcyAgICAgPT4gJENvbmZpZy0+eydGaWx0ZXI6OkNoYW5nZVN0YXRlcyd9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEwMDAsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIGljb24gbGFiZWwKICAgIG15ICRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJExhYmVsKSAuICIgKCRDb3VudCkiOwoKICAgICMgYnVpbGQgaWNvbiBkYXRhCiAgICBteSAlSWNvbiA9ICgKICAgICAgICAkUHJpbyA9PiB7CiAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICdJdGVtUGVyc29uYWwnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkVGV4dCwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgIEltYWdlICAgICAgID0+ICRJbWFnZSwKICAgICAgICAgICAgTGluayAgICAgICAgPT4gJ0FjdGlvbj0nIC4gJEFjdGlvbiwKICAgICAgICAgICAgQWNjZXNzS2V5ICAgPT4gJycsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICVJY29uOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9OYXZCYXJNeVdvcmtPcmRlcnMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE5hdkJhck15V29ya09yZGVycy5wbSx2IDEuMSAyMDA5LzEyLzAxIDAxOjAyOjIxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNeVdvcmtPcmRlcnM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBHcm91cE9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgYWN0aW9uCiAgICBteSAkQWN0aW9uID0gJ0FnZW50SVRTTUNoYW5nZU15V29ya09yZGVycyc7CiAgICBteSAkR3JvdXAgID0gJ2l0c20tY2hhbmdlJzsKICAgIG15ICRMYWJlbCAgPSAnTXkgV29ya29yZGVycyc7CiAgICBteSAkSW1hZ2UgID0gJ25ldy1tZXNzYWdlLnBuZyc7CiAgICBteSAkUHJpbyAgID0gJzA5OTQwMDAnOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRBY3Rpb24iKTsKCiAgICAjIGdldCB0aGUgZ3JvdXAgaWQKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKCBHcm91cCA9PiAkR3JvdXAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBkZW55IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIGRvIG5vdCBzaG93IGljb24gaWYgZnJvbnRlbmQgbW9kdWxlIGlzIG5vdCByZWdpc3RlcmVkCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPnskQWN0aW9ufTsKCiAgICAjIGdldCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIGNoYW5nZXMKICAgIG15ICRDb3VudCA9IDA7CiAgICBpZiAoICRDb25maWctPnsnRmlsdGVyOjpXb3JrT3JkZXJTdGF0ZXMnfSAmJiBAeyAkQ29uZmlnLT57J0ZpbHRlcjo6V29ya09yZGVyU3RhdGVzJ30gfSApIHsKCiAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIHZpZXdhYmxlIHdvcmtvcmRlcnMKICAgICAgICAkQ291bnQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAgICAgV29ya09yZGVyQWdlbnRJRHMgPT4gWyAkU2VsZi0+e1VzZXJJRH0gXSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVzICAgPT4gJENvbmZpZy0+eydGaWx0ZXI6OldvcmtPcmRlclN0YXRlcyd9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgICAgICA9PiAxMDAwLAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIGljb24gbGFiZWwKICAgIG15ICRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJExhYmVsKSAuICIgKCRDb3VudCkiOwoKICAgICMgYnVpbGQgaWNvbiBkYXRhCiAgICBteSAlSWNvbiA9ICgKICAgICAgICAkUHJpbyA9PiB7CiAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICdJdGVtUGVyc29uYWwnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkVGV4dCwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgIEltYWdlICAgICAgID0+ICRJbWFnZSwKICAgICAgICAgICAgTGluayAgICAgICAgPT4gJ0FjdGlvbj0nIC4gJEFjdGlvbiwKICAgICAgICAgICAgQWNjZXNzS2V5ICAgPT4gJycsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICVJY29uOwp9CgoxOwo=
IyAtLQojIEFkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNoYW5nZUNJUEFsbG9jYXRlLmR0bCx2IDEuMTEgMjAxMC8wNi8wMSAxNjowNjowOCBtYiBFeHAgJAojICRPbGRJZDogQWRtaW5JVFNNQ0lQQWxsb2NhdGUuZHRsLHYgMS44IDIwMTAvMDEvMzEgMTc6MDA6NTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJDcml0aWNhbGl0eSA8LT4gSW1wYWN0IDwtPiBQcmlvcml0eSJ9JEVudnsiQm94MSJ9CiAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiQ2F0ZWdvcnkgPC0+IEltcGFjdCA8LT4gUHJpb3JpdHkifSAkRW52eyJCb3gxIn0KIyAtLS0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ0lQQWxsb2NhdGUiPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJQcmlvcml0eSBhbGxvY2F0aW9uIn06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOkNJUEFsbG9jYXRlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3dDb2x1bW5EZXNjcmlwdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyIkRGF0YXsiT2JqZWN0VHlwZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249ImNlbnRlciI+JFRleHR7IiREYXRheyJPYmplY3RPcHRpb24ifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3dDb2x1bW5EZXNjcmlwdGlvbiAtLT4KPCEtLSBkdGw6YmxvY2s6Q0lQQWxsb2NhdGVSb3dDb2x1bW5Db250ZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgYWxpZ249ImNlbnRlciI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkNJUEFsbG9jYXRlUm93Q29sdW1uQ29udGVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDSVBBbGxvY2F0ZVJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbi5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3RhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUNoYW5nZU5vdGlmaWNhdGlvbi5kdGwsdiAxLjcgMjAxMC8wMi8wMyAxMzoxMzoxNiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJJVFNNIENoYW5nZU1hbmFnZW1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQifSAkRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJBZGQiLz4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgTm90aWZpY2F0aW9uIFJ1bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJBZGQgYSBuZXcgbm90aWZpY2F0aW9uIHJ1bGUuIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3UmVzdWx0IC0tPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJFdmVudCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRyaWJ1dGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUnVsZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZWNpcGllbnRzIn08L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyNSUiPiRUZXh0eyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7InZhbGlkIn0vJFRleHR7ImludmFsaWQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1Jlc3VsdFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249Q2hhbmdlO0lEPSRMUURhdGF7IklEIn0iPiRRRGF0YXsiTmFtZSJ9PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPjxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkV2ZW50In0ifSI+JFRleHR7IiRRRGF0YXsiRXZlbnQifSJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJBdHRyaWJ1dGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRRRGF0YXsiUnVsZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJSZWNpcGllbnRzIn08L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+PGRpdiB0aXRsZT0iJFFEYXRheyJDb21tZW50In0iPiRRRGF0YXsiQ29tbWVudCIsIjIwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJWYWxpZCJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSZXN1bHRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3UmVzdWx0IC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1VwZGF0ZSAtLT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSIkTFFEYXRheyJBY3Rpb24ifUFjdGlvbiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSUQiIHZhbHVlPSIkUURhdGF7IklEIn0iLz4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiQWN0aW9uTGFiZWwifSJ9OgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkV2ZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IkV2ZW50T3B0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRyaWJ1dGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkF0dHJpYnV0ZSIgdmFsdWU9IiRRRGF0YXsiQXR0cmlidXRlIn0iIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJ1bGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlJ1bGUiIHZhbHVlPSIkUURhdGF7IlJ1bGUifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVjaXBpZW50cyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJSZWNpcGllbnRPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbW1lbnQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNjAiIG1heGxlbmd0aD0iMTUwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdVcGRhdGUgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEFkbWluSVRTTVN0YXRlTWFjaGluZS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluSVRTTVN0YXRlTWFjaGluZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWRtaW5JVFNNU3RhdGVNYWNoaW5lLmR0bCx2IDEuMjUgMjAxMC8wMi8wNSAxNjoxOTo0MyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPGNvbGdyb3VwPgogICAgICAgIDxjb2wgd2lkdGg9IjMwJSI+CiAgICAgICAgPGNvbCB3aWR0aD0iNzAlIj4KICAgIDwvY29sZ3JvdXA+CiAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiQWRtaW4gU3RhdGUgTWFjaGluZSJ9ICRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdGF0ZVRyYW5zaXRpb25BZGQiPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBhIHN0YXRlIHRyYW5zaXRpb24ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNsYXNzU2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L3RkPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzZXMgLS0+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI2MCUiPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+JFRleHR7Ik9iamVjdCBOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc2VzUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZDbGFzcz0kTFFEYXRheyJDbGFzcyJ9Ij4kUURhdGF7IkNsYXNzIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2xhc3NTaG9ydE5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzZXNSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3NlcyAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdTdGF0ZVRyYW5zaXRpb25zIC0tPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik92ZXJ2aWV3IG92ZXIgc3RhdGUgdHJhbnNpdGlvbnMgZm9yIn0gJFFEYXRheyJDbGFzcyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXh0IHN0YXRlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgYWxpZ249ImNlbnRlciI+JFRleHR7IkRlbGV0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlVHJhbnNpdGlvblJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPVN0YXRlVHJhbnNpdGlvblVwZGF0ZTtDbGFzcz0kTFFEYXRheyJDbGFzcyJ9O1N0YXRlSUQ9JExRRGF0YXsiU3RhdGVJRCJ9O05leHRTdGF0ZUlEPSRMUURhdGF7Ik5leHRTdGF0ZUlEIn0iPiRUZXh0eyIkUURhdGF7IlN0YXRlTmFtZSJ9In08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7Ik5leHRTdGF0ZU5hbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlVHJhbnNpdGlvbkRlbGV0ZUJ1dHRvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249U3RhdGVUcmFuc2l0aW9uRGVsZXRlO0NsYXNzPSRMUURhdGF7IkNsYXNzIn07U3RhdGVJRD0kTFFEYXRheyJTdGF0ZUlEIn07TmV4dFN0YXRlSUQ9JExRRGF0YXsiTmV4dFN0YXRlSUQifSI+eDwvYT4KPCEtLSBkdGw6YmxvY2s6U3RhdGVUcmFuc2l0aW9uRGVsZXRlQnV0dG9uIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVRyYW5zaXRpb25Sb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3U3RhdGVUcmFuc2l0aW9ucyAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGVUcmFuc2l0aW9uQWRkIC0tPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9IklUU01TdGF0ZU1hY2hpbmVBZGQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IiRRRGF0YXsiQWN0aW9uIn1BY3Rpb24iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiAgICAgdmFsdWU9IiRRRGF0YXsiQ2xhc3MifSIvPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWRkIGEgbmV3IHN0YXRlIHRyYW5zaXRpb24gZm9yIn0gJFFEYXRheyJDbGFzcyJ9OgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXRlU2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXh0IHN0YXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiTmV4dFN0YXRlU2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpTdGF0ZVRyYW5zaXRpb25BZGQgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlVHJhbnNpdGlvblVwZGF0ZSAtLT4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJJVFNNU3RhdGVNYWNoaW5lVXBkYXRlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgICB2YWx1ZT0iJFFEYXRheyJBY3Rpb24ifUFjdGlvbiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiICAgICAgIHZhbHVlPSIkUURhdGF7IkNsYXNzIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN0YXRlSUQiICAgICB2YWx1ZT0iJFFEYXRheyJTdGF0ZUlEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik5leHRTdGF0ZUlEIiB2YWx1ZT0iJFFEYXRheyJOZXh0U3RhdGVJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJFZGl0IGEgc3RhdGUgdHJhbnNpdGlvbiBmb3IifSAkUURhdGF7IkNsYXNzIn06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IlN0YXRlTmFtZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXh0IHN0YXRlIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiTmV4dFN0YXRlU2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6U3RhdGVUcmFuc2l0aW9uVXBkYXRlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZVRyYW5zaXRpb25EZWxldGUgLS0+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIzNTAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkRlbGV0ZSBhIn0gJFFEYXRheyJDbGFzc1Nob3J0TmFtZSJ9ICRUZXh0eyJzdGF0ZSB0cmFuc2l0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhlIHN0YXRlIHRyYW5zaXRpb24ifTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJmcm9tIn0gPGI+JFRleHR7IiRRRGF0YXsiU3RhdGVOYW1lIn0ifTwvYj4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7InRvIn0gPGI+JFRleHR7IiRRRGF0YXsiTmV4dFN0YXRlTmFtZSJ9In08L2I+ID8KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iICB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDbGFzcyIgICAgICB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7Ik5vIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMCIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiAgIHZhbHVlPSIkUURhdGF7IkFjdGlvbiJ9QWN0aW9uIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDbGFzcyIgICAgICAgdmFsdWU9IiRRRGF0YXsiQ2xhc3MifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3RhdGVJRCIgICAgIHZhbHVlPSIkUURhdGF7IlN0YXRlSUQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTmV4dFN0YXRlSUQiIHZhbHVlPSIkUURhdGF7Ik5leHRTdGF0ZUlEIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiWWVzIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpTdGF0ZVRyYW5zaXRpb25EZWxldGUgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEFnZW50SVRTTUNBQk1lbWJlclNlYXJjaC5kdGwgLSBwcm92aWRlcyBhdXRvY29tcGxldGUgZmVhdHVyZSBmb3IgY3VzdG9tZXIgc2VhcmNoCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DQUJNZW1iZXJTZWFyY2guZHRsLHYgMS40IDIwMDkvMTAvMjggMTM6MzM6NDQgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tQ1NTIGZpbGUgKGRlZmF1bHQgWVVJIFNhbSBTa2luKSAtLT4KPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2F1dG9jb21wbGV0ZS9hc3NldHMvc2tpbnMvc2FtL2F1dG9jb21wbGV0ZS5jc3MiPgoKPCEtLSBEZXBlbmRlbmNpZXMgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC95YWhvby1kb20tZXZlbnQveWFob28tZG9tLWV2ZW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2RhdGFzb3VyY2UvZGF0YXNvdXJjZS1taW4uanMiPjwvc2NyaXB0PgoKPCEtLSBPUFRJT05BTDogQ29ubmVjdGlvbiAocmVxdWlyZWQgb25seSBpZiB1c2luZyBYSFJEYXRhU291cmNlKSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2Nvbm5lY3Rpb24vY29ubmVjdGlvbi1taW4uanMiPjwvc2NyaXB0PgoKPCEtLSBPUFRJT05BTDogQW5pbWF0aW9uIChyZXF1aXJlZCBvbmx5IGlmIGVuYWJsaW5nIGFuaW1hdGlvbikgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9hbmltYXRpb24vYW5pbWF0aW9uLW1pbi5qcyI+PC9zY3JpcHQ+Cgo8IS0tIE9QVElPTkFMOiBKU09OIChlbmFibGVzIEpTT04gdmFsaWRhdGlvbikgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9qc29uL2pzb24tbWluLmpzIj48L3NjcmlwdD4KCjwhLS0gU291cmNlIGZpbGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLW1pbi5qcyI+PC9zY3JpcHQ+CgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoKKGZ1bmN0aW9uKCkgewoKICAgIHZhciBEb20gPSBZQUhPTy51dGlsLkRvbSwKICAgICAgICBFdmVudCA9IFlBSE9PLnV0aWwuRXZlbnQ7CgogICAgRXZlbnQub25ET01SZWFkeShmdW5jdGlvbigpIHsKCiAgICAgICAgLy8gYWRkIHl1aSBjc3MgdG8gYm9keSB0YWcKICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9ICJ5dWktc2tpbi1zYW0iOwoKPCEtLSBkdGw6YmxvY2s6Q0FCTWVtYmVyU2VhcmNoQXV0b0NvbXBsZXRlIC0tPgoKPCEtLSBkdGw6YmxvY2s6Q0FCTWVtYmVyU2VhcmNoQXV0b0NvbXBsZXRlQ29kZSAtLT4KICAgICAgICAvLyBkZWZpbmUgWEhSRGF0YVNvdXJjZSBmb3IgYXV0b2NvbXBsZXRlIG9iamVjdAogICAgICAgIHZhciBteUNBQkRhdGFTb3VyY2UkRGF0YXsiSW5wdXROciJ9ID0gbmV3IFlBSE9PLnV0aWwuWEhSRGF0YVNvdXJjZSgnJyk7CiAgICAgICAgbXlDQUJEYXRhU291cmNlJERhdGF7IklucHV0TnIifS5yZXNwb25zZVR5cGUgPSBZQUhPTy51dGlsLlhIUkRhdGFTb3VyY2UuVFlQRV9KU09OOwogICAgICAgIG15Q0FCRGF0YVNvdXJjZSREYXRheyJJbnB1dE5yIn0ubWF4Q2FjaGVFbnRyaWVzID0gMTAwOwogICAgICAgIG15Q0FCRGF0YVNvdXJjZSREYXRheyJJbnB1dE5yIn0uY29ublhock1vZGUgPSAnY2FuY2VsU3RhbGVSZXF1ZXN0cyc7CgogICAgICAgIC8vIGRlZmluZSB0aGUgc2NoZW1hIG9mIHRoZSByZXN1bHRzIGZvciBhdXRvY29tcGxldGUgb2JqZWN0CiAgICAgICAgbXlDQUJEYXRhU291cmNlJERhdGF7IklucHV0TnIifS5yZXNwb25zZVNjaGVtYSA9IHsKICAgICAgICAgICAgcmVzdWx0c0xpc3QgOiAiUmVzcG9uc2UuUmVzdWx0cyIsIC8vIFN0cmluZyBwb2ludGVyIHRvIHJlc3VsdCBkYXRhCiAgICAgICAgICAgIGZpZWxkcyA6IFsKICAgICAgICAgICAgICAgIHsga2V5OiAiVXNlcktleSIgfSwKICAgICAgICAgICAgICAgIHsga2V5OiAiVXNlclZhbHVlIiB9LAogICAgICAgICAgICAgICAgeyBrZXk6ICJVc2VyVmFsdWVQbGFpbiIgfSwKICAgICAgICAgICAgICAgIHsga2V5OiAiVXNlclR5cGUiIH0KICAgICAgICAgICAgXQogICAgICAgIH07CiAgICAgICAgLy8gZGVmaW5lIGF1dG9jb21wbGV0ZSBvYmplY3QKICAgICAgICB2YXIgbXlDQUJBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0gPSBuZXcgWUFIT08ud2lkZ2V0LkF1dG9Db21wbGV0ZSgibXlDQUJBdXRvQ29tcGxldGVJbnB1dCREYXRheyJJbnB1dE5yIn0iLCAibXlDQUJBdXRvQ29tcGxldGVDb250YWluZXIkRGF0YXsiSW5wdXROciJ9IiwgbXlDQUJEYXRhU291cmNlJERhdGF7IklucHV0TnIifSk7CiAgICAgICAgbXlDQUJBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0ucmVzdWx0VHlwZUxpc3QgPSBmYWxzZTsKCiAgICAgICAgLy8gZ2V0IGdyb3VwcyB0aGUgdXNlciBzaG91bGQgYmVsb25nIHRvCiAgICAgICAgdmFyIENBQk1lbWJlckdyb3VwJERhdGF7IklucHV0TnIifSA9ICcnOwogICAgICAgIGlmKCBkb2N1bWVudC5jb21wb3NlLkNBQk1lbWJlclNlYXJjaEdyb3VwcyREYXRheyJJbnB1dE5yIn0gKSB7CiAgICAgICAgICAgIENBQk1lbWJlckdyb3VwJERhdGF7IklucHV0TnIifSA9IGRvY3VtZW50LmNvbXBvc2UuQ0FCTWVtYmVyU2VhcmNoR3JvdXBzJERhdGF7IklucHV0TnIifS52YWx1ZTsKICAgICAgICB9CgogICAgICAgIC8vIGRlZmluZSByZXF1ZXN0IHBhcmFtZXRlcnMKICAgICAgICBteUNBQkF1dG9Db21wJERhdGF7IklucHV0TnIifS5nZW5lcmF0ZVJlcXVlc3QgPSBmdW5jdGlvbihzQ0FCUXVlcnkkRGF0YXsiSW5wdXROciJ9KSB7CiAgICAgICAgICByZXR1cm4gIj9BY3Rpb249QWdlbnRJVFNNQ0FCTWVtYmVyU2VhcmNoJlNlYXJjaD0iICsgc0NBQlF1ZXJ5JERhdGF7IklucHV0TnIifSArICIqIiArICImR3JvdXBzPSIgKyBDQUJNZW1iZXJHcm91cCREYXRheyJJbnB1dE5yIn07CiAgICAgICAgfTsKCiAgICAgICAgLy8gZGVmaW5lIG91dHB1dCBmb3JtYXQgZm9yIGRyb3AgZG93biBsaXN0CiAgICAgICAgbXlDQUJBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0uZm9ybWF0UmVzdWx0ID0gZnVuY3Rpb24ob0NBQlJlc3VsdERhdGEkRGF0YXsiSW5wdXROciJ9LCBzQ0FCUXVlcnkkRGF0YXsiSW5wdXROciJ9LCBzQ0FCUmVzdWx0TWF0Y2gkRGF0YXsiSW5wdXROciJ9KSB7CiAgICAgICAgICAgIHZhciBDQUJNYXhMZW5ndGgkRGF0YXsiSW5wdXROciJ9ID0gMzU7CgogICAgICAgICAgICB2YXIgQ0FCVXNlclZhbHVlJERhdGF7IklucHV0TnIifSA9IG9DQUJSZXN1bHREYXRhJERhdGF7IklucHV0TnIifS5Vc2VyVmFsdWU7CiAgICAgICAgICAgIGlmKCBDQUJVc2VyVmFsdWUkRGF0YXsiSW5wdXROciJ9Lmxlbmd0aCA+IENBQk1heExlbmd0aCREYXRheyJJbnB1dE5yIn0gKSB7CiAgICAgICAgICAgICAgICBDQUJVc2VyVmFsdWUkRGF0YXsiSW5wdXROciJ9ID0gQ0FCVXNlclZhbHVlJERhdGF7IklucHV0TnIifS5zdWJzdHJpbmcoIDAsIENBQk1heExlbmd0aCREYXRheyJJbnB1dE5yIn0gKSArICdbLi5dJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIENBQlVzZXJLZXkkRGF0YXsiSW5wdXROciJ9ID0gb0NBQlJlc3VsdERhdGEkRGF0YXsiSW5wdXROciJ9LlVzZXJLZXk7CiAgICAgICAgICAgIGlmKCBDQUJVc2VyS2V5JERhdGF7IklucHV0TnIifS5sZW5ndGggPiBDQUJNYXhMZW5ndGgkRGF0YXsiSW5wdXROciJ9ICkgewogICAgICAgICAgICAgICAgQ0FCVXNlcktleSREYXRheyJJbnB1dE5yIn0gPSBDQUJVc2VyS2V5JERhdGF7IklucHV0TnIifS5zdWJzdHJpbmcoIDAsIENBQk1heExlbmd0aCREYXRheyJJbnB1dE5yIn0gKSArICdbLi5dJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIENBQkZvcm1hdHRlZFN0cmluZyA9IENBQlVzZXJWYWx1ZSREYXRheyJJbnB1dE5yIn0gKyAiICgiICsgQ0FCVXNlcktleSREYXRheyJJbnB1dE5yIn0gKyAiKSI7CgogICAgICAgICAgICByZXR1cm4gKENBQkZvcm1hdHRlZFN0cmluZyArICIgLSAiICsgb0NBQlJlc3VsdERhdGEkRGF0YXsiSW5wdXROciJ9LlVzZXJUeXBlKTsKICAgICAgICB9OwoKICAgICAgICAvLyBkZWZpbmUgdmFyaW91cyBhdXRvY29tcGxldGUgcHJvcGVydGllcwogICAgICAgIG15Q0FCQXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9Lm1pblF1ZXJ5TGVuZ3RoICAgICAgICAgICA9ICRRRGF0YXsibWluUXVlcnlMZW5ndGgifTsKICAgICAgICBteUNBQkF1dG9Db21wJERhdGF7IklucHV0TnIifS5xdWVyeURlbGF5ICAgICAgICAgICAgICAgPSAkUURhdGF7InF1ZXJ5RGVsYXkifTsKICAgICAgICBteUNBQkF1dG9Db21wJERhdGF7IklucHV0TnIifS50eXBlQWhlYWQgICAgICAgICAgICAgICAgPSAkUURhdGF7InR5cGVBaGVhZCJ9OwogICAgICAgIG15Q0FCQXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9Lm1heFJlc3VsdHNEaXNwbGF5ZWQgICAgICA9ICRRRGF0YXsibWF4UmVzdWx0c0Rpc3BsYXllZCJ9OwogICAgICAgIG15Q0FCQXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9LmFuaW1WZXJ0ICAgICAgICAgICAgICAgICA9IHRydWU7CiAgICAgICAgbXlDQUJBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0uYW5pbVNwZWVkICAgICAgICAgICAgICAgID0gMC4yOwogICAgICAgIG15Q0FCQXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9LmFsbG93QnJvd3NlckF1dG9jb21wbGV0ZSA9IGZhbHNlOwoKICAgICAgICAvLyBmaXhlcyBJRTYgYnVnIHRoYXQgY2F1c2VzIGZvcm0gc2VsZWN0IGVsZW1lbnRzIHRvIGJlIGRpc3BsYXllZAogICAgICAgIC8vIG92ZXIgZWxlbWVudHMgd2l0aCBhIGhpZ2hlciB6LWluZGV4CiAgICAgICAgbXlDQUJBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0udXNlSUZyYW1lID0gdHJ1ZTsKCiAgICAgICAgLy8gZGVmaW5lIGN1c3RvbSBpdGVtU2VsZWN0IGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICB2YXIgaXRlbVNlbGVjdEhhbmRsZXJDQUIkRGF0YXsiSW5wdXROciJ9ID0gZnVuY3Rpb24oc0NBQlR5cGUkRGF0YXsiSW5wdXROciJ9LCBhQ0FCQXJncyREYXRheyJJbnB1dE5yIn0pIHsKICAgICAgICAgICAgdmFyIG9DQUJNeUFjSW5zdGFuY2UkRGF0YXsiSW5wdXROciJ9ID0gYUNBQkFyZ3MkRGF0YXsiSW5wdXROciJ9WzBdOyAgLy8geW91ciBBdXRvQ29tcGxldGUgaW5zdGFuY2UKICAgICAgICAgICAgdmFyIGVsQ0FCTGlzdEl0ZW0kRGF0YXsiSW5wdXROciJ9ICAgID0gYUNBQkFyZ3MkRGF0YXsiSW5wdXROciJ9WzFdOyAgLy8gdGhlIDxsaT4gZWxlbWVudCBzZWxlY3RlZCBpbiB0aGUgc3VnZ2VzdGlvbiBjb250YWluZXIKICAgICAgICAgICAgdmFyIG9DQUJEYXRhJERhdGF7IklucHV0TnIifSAgICAgICAgID0gYUNBQkFyZ3MkRGF0YXsiSW5wdXROciJ9WzJdOyAgLy8gb2JqZWN0IGxpdGVyYWwgb2YgZGF0YSBmb3IgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gc2V0IGF1dG9jb21wbGV0ZSBmaWVsZCB3aXRoIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIG9DQUJNeUFjSW5zdGFuY2UkRGF0YXsiSW5wdXROciJ9LmdldElucHV0RWwoKS52YWx1ZSA9IG9DQUJEYXRhJERhdGF7IklucHV0TnIifS5Vc2VyVmFsdWVQbGFpbjsKCiAgICAgICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgQ0FCTWVtYmVySUQKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuQ0FCTWVtYmVySUQkRGF0YXsiSW5wdXROciJ9KSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLkNBQk1lbWJlcklEJERhdGF7IklucHV0TnIifS52YWx1ZSA9IG9DQUJEYXRhJERhdGF7IklucHV0TnIifS5Vc2VyS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzZXQgaGlkZGVuIGZpZWxkIENBQk1lbWJlclR5cGUKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuQ0FCTWVtYmVyVHlwZSREYXRheyJJbnB1dE5yIn0pIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQ0FCTWVtYmVyVHlwZSREYXRheyJJbnB1dE5yIn0udmFsdWUgPSBvQ0FCRGF0YSREYXRheyJJbnB1dE5yIn0uVXNlclR5cGU7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAvLyBzdWJzY3JpYmUgY3VzdG9tIGl0ZW1TZWxlY3QgaGFuZGxlciB0byB0aGUgZXZlbnQKICAgICAgICBteUNBQkF1dG9Db21wJERhdGF7IklucHV0TnIifS5pdGVtU2VsZWN0RXZlbnQuc3Vic2NyaWJlKGl0ZW1TZWxlY3RIYW5kbGVyQ0FCJERhdGF7IklucHV0TnIifSk7CgogICAgICAgIC8vIGR5bmFtaWNhbGx5IGFkanVzdCB0aGUgd2lkdGggb2YgdGhlIGF1dG9jb21wbGV0ZSBjb250YWluZXIKICAgICAgICBteUNBQkF1dG9Db21wJERhdGF7IklucHV0TnIifS5kb0JlZm9yZUxvYWREYXRhID0gZnVuY3Rpb24gKG9DQUJSZXF1ZXN0JERhdGF7IklucHV0TnIifSwgb0NBQlJlc3BvbnNlJERhdGF7IklucHV0TnIifSwgb0NBQlBheWxvYWQkRGF0YXsiSW5wdXROciJ9KSB7CgogICAgICAgICAgICAvLyBjaGVjayBpZiBkeW5hbWljIHdpZHRoIGlzIGVuYWJsZWQKICAgICAgICAgICAgaWYgKCAhTnVtYmVyKCckQ29uZmlneyJJVFNNQ2hhbmdlOjpGcm9udGVuZDo6Q0FCTWVtYmVyU2VhcmNoQXV0b0NvbXBsZXRlOjpEeW5hbWljV2lkdGgifScpICkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGxvbmdlc3QgcmVzdWx0IHN0cmluZwogICAgICAgICAgICB2YXIgQ0FCTWF4U3RyaW5nJERhdGF7IklucHV0TnIifSA9ICcnOwogICAgICAgICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBvQ0FCUmVzcG9uc2UkRGF0YXsiSW5wdXROciJ9LnJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgICAgICB2YXIgQ0FCUmVzdWx0JERhdGF7IklucHV0TnIifSA9IG9DQUJSZXNwb25zZSREYXRheyJJbnB1dE5yIn0ucmVzdWx0c1tpXTsKICAgICAgICAgICAgICAgIHZhciBDQUJTdHJpbmckRGF0YXsiSW5wdXROciJ9ID0gQ0FCUmVzdWx0JERhdGF7IklucHV0TnIifVsiVXNlclZhbHVlUGxhaW4iXSArIENBQlJlc3VsdCREYXRheyJJbnB1dE5yIn1bIlVzZXJLZXkiXTsKICAgICAgICAgICAgICAgICAgICBDQUJTdHJpbmckRGF0YXsiSW5wdXROciJ9ID0gQ0FCU3RyaW5nJERhdGF7IklucHV0TnIifSArIENBQlJlc3VsdCREYXRheyJJbnB1dE5yIn1bIlVzZXJUeXBlIl0gKyAiICAgICAiOwogICAgICAgICAgICAgICAgaWYgKCBDQUJTdHJpbmckRGF0YXsiSW5wdXROciJ9Lmxlbmd0aCA+IENBQk1heFN0cmluZyREYXRheyJJbnB1dE5yIn0ubGVuZ3RoICkgewogICAgICAgICAgICAgICAgICAgIENBQk1heFN0cmluZyREYXRheyJJbnB1dE5yIn0gPSBDQUJTdHJpbmckRGF0YXsiSW5wdXROciJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBidWlsZCBvcHRpb24gZWxlbWVudCB3aXRoIHRoZSBsb25nZXN0IHJlc3VsdCBzdHJpbmcKICAgICAgICAgICAgdmFyIENBQkR1bW15T3B0aW9uJERhdGF7IklucHV0TnIifSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOwogICAgICAgICAgICBDQUJEdW1teU9wdGlvbiREYXRheyJJbnB1dE5yIn0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoQ0FCTWF4U3RyaW5nJERhdGF7IklucHV0TnIifSkpOwoKICAgICAgICAgICAgLy8gYnVpbGQgaW52aXNpYmxlIGR1bW15IHNlbGVjdCBmaWVsZCB0byBmaW5kIHRoZSB3aWR0aAogICAgICAgICAgICB2YXIgQ0FCRHVtbXlTZWxlY3QkRGF0YXsiSW5wdXROciJ9ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CiAgICAgICAgICAgIENBQkR1bW15U2VsZWN0JERhdGF7IklucHV0TnIifS5zZXRBdHRyaWJ1dGUoICdpZCcsICdEdW1teVNlbGVjdElEJERhdGF7IklucHV0TnIifScgKTsKICAgICAgICAgICAgQ0FCRHVtbXlTZWxlY3QkRGF0YXsiSW5wdXROciJ9LnNldEF0dHJpYnV0ZSggJ3N0eWxlJywgJ3Zpc2liaWxpdHk6aGlkZGVuJyApOwogICAgICAgICAgICBDQUJEdW1teVNlbGVjdCREYXRheyJJbnB1dE5yIn0uYXBwZW5kQ2hpbGQoQ0FCRHVtbXlPcHRpb24kRGF0YXsiSW5wdXROciJ9KTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXS5hcHBlbmRDaGlsZChDQUJEdW1teVNlbGVjdCREYXRheyJJbnB1dE5yIn0pOwoKICAgICAgICAgICAgLy8gZ2V0IG5ldyB3aWR0aAogICAgICAgICAgICB2YXIgQ0FCTmV3V2lkdGgkRGF0YXsiSW5wdXROciJ9ID0gQ0FCRHVtbXlTZWxlY3QkRGF0YXsiSW5wdXROciJ9Lm9mZnNldFdpZHRoOwoKICAgICAgICAgICAgLy8gcmVtb3ZlIGhpZGRlbiBzZWxlY3QgZmllbGQKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXS5yZW1vdmVDaGlsZChDQUJEdW1teVNlbGVjdCREYXRheyJJbnB1dE5yIn0pOwoKICAgICAgICAgICAgLy8gZ2V0IGNvbnRhaW5lcgogICAgICAgICAgICB2YXIgQ0FCQ29udGFpbmVyJERhdGF7IklucHV0TnIifSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteUNBQkF1dG9Db21wbGV0ZUNvbnRhaW5lciREYXRheyJJbnB1dE5yIn0nKTsKCiAgICAgICAgICAgIC8vIGFwcGx5IG5ldyB3aWR0aCB0byBjb250YWluZXIKICAgICAgICAgICAgQ0FCQ29udGFpbmVyJERhdGF7IklucHV0TnIifS5zdHlsZS53aWR0aCA9IENBQk5ld1dpZHRoJERhdGF7IklucHV0TnIifSArICdweCc7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CjwhLS0gZHRsOmJsb2NrOkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZUNvZGUgLS0+CjwhLS0gZHRsOmJsb2NrOkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZSAtLT4KCjwhLS0gZHRsOmJsb2NrOkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZVJldHVybiAtLT4KICAgICAgICByZXR1cm4gewo8IS0tIGR0bDpibG9jazpDQUJNZW1iZXJTZWFyY2hBdXRvQ29tcGxldGVSZXR1cm5FbGVtZW50cyAtLT4KICAgICAgICAgICAgbXlDQUJEYXRhU291cmNlJERhdGF7IklucHV0TnIifTogbXlDQUJEYXRhU291cmNlJERhdGF7IklucHV0TnIifSwKICAgICAgICAgICAgbXlDQUJBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0gIDogbXlDQUJBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0sCjwhLS0gZHRsOmJsb2NrOkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZVJldHVybkVsZW1lbnRzIC0tPgogICAgICAgICAgICBkdW1teTogMQogICAgICAgIH07CjwhLS0gZHRsOmJsb2NrOkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZVJldHVybiAtLT4KICAgIH0pOwp9KSgpOwo8L3NjcmlwdD4K
IyAtLQojIEFnZW50SVRTTUNoYW5nZUFkZC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTUNoYW5nZUFkZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlQWRkLmR0bCx2IDEuNTMgMjAxMC8wNi8yMyAxMzo0NjoyNiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFKQVgifQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkphdmFTY3JpcHRQYXRoIn1pdHNtLWNoYW5nZW1hbmFnZW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfdGVtcGxhdGUoKSB7CgogICAgLy8gdGhlIFN1YmFjdGlvbiBkZXBlbmRzIG9uIHdoaWNoIGJ1dHRvbiB3YXMgY2xpY2tlZAogICAgZG9jdW1lbnQuY29tcG9zZS5TdWJhY3Rpb24udmFsdWUgPSAnQ3JlYXRlRnJvbVRlbXBsYXRlJzsKCiAgICAvLyBjaGVjayB0aGUgcGxhbm5lZCB0aW1lCiAgICBpZiAoIGRvY3VtZW50LnRlbXBsYXRlLk1vdmVUaW1lVXNlZC5jaGVja2VkICYmICFDaGVja1RpbWUoICdNb3ZlVGltZScgKSApIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGhlIHBsYW5uZWQgdGltZSBpcyBpbnZhbGlkISJ9Jyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CgogICAgLy8gdGhlIFN1YmFjdGlvbiBkZXBlbmRzIG9uIHdoaWNoIGJ1dHRvbiB3YXMgY2xpY2tlZAogICAgZG9jdW1lbnQuY29tcG9zZS5TdWJhY3Rpb24udmFsdWUgPSAnU2F2ZSc7CgogICAgLy8gY2hlY2sgdGhlIHRpdGxlLCBhbGwgd2hpdGVzcGFjZSBjb3VudHMgYXMgZW1wdHkKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLkNoYW5nZVRpdGxlLnZhbHVlLm1hdGNoKC9eXHMqJC8pKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgY2hhbmdlIG11c3QgaGF2ZSBhIHRpdGxlISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5DaGFuZ2VUaXRsZS5mb2N1cygpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gY2hlY2sgdGhlIHJlcXVlc3RlZCB0aW1lCiAgICBpZiAoIGRvY3VtZW50LmNvbXBvc2UuUmVxdWVzdGVkVGltZVVzZWQuY2hlY2tlZCAmJiAhQ2hlY2tUaW1lKCAnUmVxdWVzdGVkVGltZScgKSApIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGhlIHJlcXVlc3RlZCB0aW1lIGlzIGludmFsaWQhIn0nKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGNoZWNrIHRoZSByZXF1ZXN0ZWQgdGltZQogICAgaWYgKCBkb2N1bWVudC5jb21wb3NlLlJlcXVlc3RlZFRpbWVVc2VkLmNoZWNrZWQgJiYgIUNoZWNrVGltZSggJ1JlcXVlc3RlZFRpbWUnICkgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRoZSByZXF1ZXN0ZWQgdGltZSBpcyBpbnZhbGlkISJ9Jyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0Q2hlY2tKcyAtLT4KICAgIC8vIGNoZWNrIHRoZSByZXF1aXJlZCBmcmVldGV4dCBmaWVsZHMKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJDaGFuZ2VGcmVlVGV4dEZpZWxkIn0udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAnICsgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiQ2hhbmdlRnJlZUtleUZpZWxkIn0udmFsdWUgKyAnIScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IkNoYW5nZUZyZWVUZXh0RmllbGQifS5mb2N1cygpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0Q2hlY2tKcyAtLT4KCiAgICByZXR1cm4gdHJ1ZTsKfQoKLy8tLT4KPC9zY3JpcHQ+Cgo8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiAgIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiAgdmFsdWU9IiI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiICAgICB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSI+CiAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJEVudnsiQm94MCJ9ICRUZXh0eyJJVFNNIENoYW5nZSJ9OiAkVGV4dHsiTkVXIn0gJEVudnsiQm94MSJ9Ij4KICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IklUU00gQ2hhbmdlIn06ICRUZXh0eyJORVcifSAkRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9Im1lbnVpdGVtIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNoYW5nZSIgb25jbGljaz0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKTsgcmV0dXJuIGZhbHNlOyI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgoKPCEtLSBkdGw6YmxvY2s6Q2hhbmdlVGVtcGxhdGUgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTZWxlY3QgQ2hhbmdlIFRlbXBsYXRlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiVGVtcGxhdGUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZE1vdmVUaW1lVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRNb3ZlVGltZVR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5ldyB0aW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZE1vdmVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZE1vdmVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRUZW1wbGF0ZSIgYWNjZXNza2V5PSJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdFRlbXBsYXRlIiB2YWx1ZT0iJFRleHR7IkNyZWF0ZSJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X3RlbXBsYXRlKCk7Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VUZW1wbGF0ZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IklUU00gQ2hhbmdlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiVGl0bGUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNoYW5nZVRpdGxlIiB2YWx1ZT0iJFFEYXRheyJDaGFuZ2VUaXRsZSJ9IiBzaXplPSI3MCIgbWF4bGVuZ3RoPSIyNTAiPgo8IS0tIGR0bDpibG9jazpJbnZhbGlkVGl0bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkVGl0bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGVzY3JpcHRpb24ifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvcklUU00ifQo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0MSIgbmFtZT0iRGVzY3JpcHRpb24iIHJvd3M9IjE1IiBjb2xzPSIkQ29uZmlneyJJVFNNOjpGcm9udGVuZDo6VGV4dEFyZWEifSIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JERhdGF7IkRlc2NyaXB0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSnVzdGlmaWNhdGlvbiJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQyIiBuYW1lPSJKdXN0aWZpY2F0aW9uIiByb3dzPSIxNSIgY29scz0iJENvbmZpZ3siSVRTTTo6RnJvbnRlbmQ6OlRleHRBcmVhIn0iIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iPiREYXRheyJKdXN0aWZpY2F0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNhdGVnb3J5In06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJDYXRlZ29yeVNlbGVjdGlvblN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRDYXRlZ29yeSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRDYXRlZ29yeSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJJbXBhY3QifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkltcGFjdFNlbGVjdGlvblN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRJbXBhY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkSW1wYWN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlByaW9yaXR5In06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJQcmlvcml0eVNlbGVjdGlvblN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dFNwYWNlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0U3BhY2VyIC0tPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkNoYW5nZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJDaGFuZ2VGcmVlVGV4dEZpZWxkIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0IC0tPgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZXhhbXBsZSBmb3IgY3VzdG9taXphdGlvbiBvZiBzaW5nbGUgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcwojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiM8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJDaGFuZ2VGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNoYW5nZUZyZWVUZXh0RmllbGQxIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRDaGFuZ2VGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHQxIC0tPgojCiMKIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkNoYW5nZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNoYW5nZUZyZWVUZXh0RmllbGQyIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRDaGFuZ2VGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHQyIC0tPgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVlc3RlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlJlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIERhdGUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlJlcXVlc3RlZFRpbWVTdHJpbmcifQo8IS0tIGR0bDpibG9jazpJbnZhbGlkUmVxdWVzdGVkVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRSZXF1ZXN0ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVlc3RlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE2Ij48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZUlEPSRMUURhdGF7IkZpbGVJRCJ9O0Zvcm1JRD0kTFFEYXRheyJGb3JtSUQifSI+PGltZyBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRpc2stcy5wbmciIGJvcmRlcj0iMCIgYWx0PSJEb3dubG9hZCIgdGl0bGU9IkRvd25sb2FkIi8+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkRlbGV0ZUF0dGFjaG1lbnQkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iQXR0YWNobWVudE5ldyI+CjwhLS0gZHRsOmJsb2NrOkZpbGVBbHJlYWR5VXBsb2FkZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpGaWxlQWxyZWFkeVVwbG9hZGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ1dHRvbiIgbmFtZT0iU2F2ZUF0dGFjaG1lbnQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRBZGRDaGFuZ2UiIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiBuYW1lPSJBZGRDaGFuZ2UiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgIDwvdGFibGU+CjwvZm9ybT4K
IyAtLQojIEFnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUNBQlRlbXBsYXRlLmR0bCx2IDEuMTEgMjAxMC8wNS8xOCAxMzo1NDozMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKCiAgICAvLyBjaGVjayB0aGUgdGVtcGxhdGUgbmFtZSwgYWxsIHdoaXRlc3BhY2UgY291bnRzIGFzIGVtcHR5CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UZW1wbGF0ZU5hbWUudmFsdWUubWF0Y2goL15ccyokLykpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSB0ZW1wbGF0ZSBtdXN0IGhhdmUgYSBuYW1lISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UZW1wbGF0ZU5hbWUuZm9jdXMoKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9CgovLy0tPgo8L3NjcmlwdD4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7IlNhdmUgQ2hhbmdlIENBQiBhcyB0ZW1wbGF0ZSJ9IDogJENvbmZpZ3siSVRTTUNoYW5nZTo6SG9vayJ9OiAkRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IlNhdmUgQ2hhbmdlIENBQiBhcyB0ZW1wbGF0ZSJ9IDogJENvbmZpZ3siSVRTTUNoYW5nZTo6SG9vayJ9OiAkRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucztDaGFuZ2VJRD0kTFFEYXRheyJDaGFuZ2VJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgoKICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiAgICB2YWx1ZT0iQWRkVGVtcGxhdGUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiICAgICB2YWx1ZT0iJFFEYXRheyJDaGFuZ2VJRCJ9Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDB4IiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlNhdmUgQ2hhbmdlIENBQiBhcyB0ZW1wbGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjEzMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlRlbXBsYXRlIE5hbWUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRlbXBsYXRlTmFtZSIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVOYW1lIn0iIHNpemU9IjcwIiBtYXhsZW5ndGg9IjI1MCI+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUZW1wbGF0ZU5hbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkVGVtcGxhdGVOYW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNvbW1lbnQifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNzAiIG1heGxlbmd0aD0iMjUwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZFNlbGVjdGlvblN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0QWRkVGVtcGxhdGUiIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiBuYW1lPSJBZGRUZW1wbGF0ZSIgdmFsdWU9IiRUZXh0eyJBZGQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbi5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbgojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uLmR0bCx2IDEuMTAgMjAxMC8wMi8wNCAxMjowNDo1NiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJDb25kaXRpb25zIGFuZCBBY3Rpb25zIn0gOiAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJDb25kaXRpb25zIGFuZCBBY3Rpb25zIn0gOiAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUiLCI3MCJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0Q2hhbmdlVmlldyJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiIHZhbHVlPSIkUURhdGF7IkNoYW5nZUlEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNvbmRpdGlvbklEIiB2YWx1ZT0iJFFEYXRheyJDb25kaXRpb25JRCJ9Ii8+CiAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29uZGl0aW9ucyBhbmQgQWN0aW9ucyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1MCI+JFRleHR7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IioiPiRUZXh0eyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMDAiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyJ2YWxpZCJ9LyRUZXh0eyJpbnZhbGlkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJDaGFuZ2VkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNQ2hhbmdlQ29uZGl0aW9uRWRpdDtDaGFuZ2VJRD0kUURhdGF7IkNoYW5nZUlEIn07Q29uZGl0aW9uSUQ9JFFEYXRheyJDb25kaXRpb25JRCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kVGV4dHsiJFFEYXRheyJDb21tZW50In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4kVGV4dHsiJFFEYXRheyJWYWxpZCJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFRpbWVMb25neyIkUURhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMCI+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIgbmFtZT0iRGVsZXRlQ29uZGl0aW9uSUQ6OiRRRGF0YXsiQ29uZGl0aW9uSUQifSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CiMgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWRkIn08L3RkPgojICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkFkZCBuZXcgY29uZGl0aW9uIGFuZCBhY3Rpb24gcGFpciJ9LiZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSIgbmFtZT0iQWRkQ29uZGl0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VDb25kaXRpb25FZGl0LmR0bCx2IDEuMjMgMjAxMC8wMy8yMiAxNTo1NToyOSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFKQVgifQoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQoKZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CgogICAgLy8gY2hlY2sgdGhlIGNvbmRpdGlvbiBuYW1lLCBhbGwgd2hpdGVzcGFjZSBjb3VudHMgYXMgZW1wdHkKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLk5hbWUudmFsdWUubWF0Y2goL15ccyokLykpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBjb25kaXRpb24gbXVzdCBoYXZlIGEgbmFtZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuTmFtZS5mb2N1cygpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJEVudnsiQm94MCJ9ICRUZXh0eyJFZGl0In0gJFRleHR7IkNvbmRpdGlvbiJ9OiAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IkVkaXQifSAkVGV4dHsiQ29uZGl0aW9uIn06ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJDaGFuZ2VUaXRsZSIsIjcwIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01DaGFuZ2VDb25kaXRpb247JkNoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTYXZlIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFuZ2VJRCIgdmFsdWU9IiRRRGF0YXsiQ2hhbmdlSUQifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29uZGl0aW9uSUQiIHZhbHVlPSIkUURhdGF7IkNvbmRpdGlvbklEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiIHZhbHVlPSIkVGV4dHsiU2F2ZSJ9IiBuYW1lPSJTYXZlIiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbmRpdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMjAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iODAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJOYW1lIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IlJlcXVpcmVkIn0iPio8L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTmFtZSIgbmFtZT0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBzaXplPSI3MCIgbWF4bGVuZ3RoPSIyNTAiPgo8IS0tIGR0bDpibG9jazpJbnZhbGlkTmFtZS0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkTmFtZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTWF0Y2hpbmcifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkV4cHJlc3Npb25Db25qdW5jdGlvbiIgdHlwZT0icmFkaW8iIHZhbHVlPSJhbnkiICREYXRheyJhbnlzZWxlY3RlZCJ9Lz4gJFRleHR7IkFueSBleHByZXNzaW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJFeHByZXNzaW9uQ29uanVuY3Rpb24iIHR5cGU9InJhZGlvIiB2YWx1ZT0iYWxsIiAkRGF0YXsiYWxsc2VsZWN0ZWQifS8+ICRUZXh0eyJBbGwgZXhwcmVzc2lvbnMifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWYWxpZCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlZhbGlkT3B0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiB2YWx1ZT0iJFFEYXRheyJDb21tZW50In0iIHNpemU9IjcwIiBtYXhsZW5ndGg9IjI1MCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRXhwcmVzc2lvbnMifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+CjwhLS0gZHRsOmJsb2NrOkV4cHJlc3Npb25PdmVydmlld1JvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6RXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudE9iamVjdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iMTAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2JqZWN0T3B0aW9uU3RyaW5nIn08L3RkPgo8IS0tIGR0bDpibG9jazpFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50T2JqZWN0IC0tPgo8IS0tIGR0bDpibG9jazpFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50U2VsZWN0b3IgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjEwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlbGVjdG9yT3B0aW9uU3RyaW5nIn08L3RkPgo8IS0tIGR0bDpibG9jazpFeHByZXNzaW9uT3ZlcnZpZXdSb3dFbGVtZW50U2VsZWN0b3IgLS0+CjwhLS0gZHRsOmJsb2NrOkV4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRBdHRyaWJ1dGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjEwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkF0dHJpYnV0ZU9wdGlvblN0cmluZyJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6RXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudEF0dHJpYnV0ZSAtLT4KPCEtLSBkdGw6YmxvY2s6RXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudE9wZXJhdG9yIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIxMCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPcGVyYXRvck9wdGlvblN0cmluZyJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6RXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudE9wZXJhdG9yIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIxMCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRXhwcmVzc2lvbklEOjokUURhdGF7IkV4cHJlc3Npb25JRCJ9OjpDb21wYXJlVmFsdWU6OkRpdiI+CjwhLS0gZHRsOmJsb2NrOkV4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRDb21wYXJlVmFsdWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRXhwcmVzc2lvbklEOjokUURhdGF7IkV4cHJlc3Npb25JRCJ9OjpDb21wYXJlVmFsdWUiIG5hbWU9IkV4cHJlc3Npb25JRDo6JFFEYXRheyJFeHByZXNzaW9uSUQifTo6Q29tcGFyZVZhbHVlIiB2YWx1ZT0iJFFEYXRheyJDb21wYXJlVmFsdWUifSIgc2l6ZT0iMzAiIG1heGxlbmd0aD0iMjUwIj4KPCEtLSBkdGw6YmxvY2s6RXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudENvbXBhcmVWYWx1ZVRleHQgLS0+CjwhLS0gZHRsOmJsb2NrOkV4cHJlc3Npb25PdmVydmlld1Jvd0VsZW1lbnRDb21wYXJlVmFsdWVTZWxlY3Rpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlZhbHVlT3B0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6RXhwcmVzc2lvbk92ZXJ2aWV3Um93RWxlbWVudENvbXBhcmVWYWx1ZVNlbGVjdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9IiBuYW1lPSJEZWxldGVFeHByZXNzaW9uSUQ6OiRRRGF0YXsiRXhwcmVzc2lvbklEIn0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjEwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpFeHByZXNzaW9uT3ZlcnZpZXdSb3cgLS0+CjwhLS0gZW1wdHkgcm93LCBmb3IgaGF2aW5nIGEgdmFsaWQgSFRNTCB0YWJsZSBpbiB0aGUgYWJzZW5jZSBvZiBleHByZXNzaW9ucyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkIGNvbHNwYW49IjkiPjwvdGQ+PC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWRkIG5ldyBleHByZXNzaW9uIn0uJm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9IiBuYW1lPSJBZGRFeHByZXNzaW9uIiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFjdGlvbnMifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgo8IS0tIGR0bDpibG9jazpBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRPYmplY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjEwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9iamVjdE9wdGlvblN0cmluZyJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50T2JqZWN0IC0tPgo8IS0tIGR0bDpibG9jazpBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRTZWxlY3RvciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iMTAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU2VsZWN0b3JPcHRpb25TdHJpbmcifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudFNlbGVjdG9yIC0tPgo8IS0tIGR0bDpibG9jazpBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRBdHRyaWJ1dGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9IjEwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkF0dHJpYnV0ZU9wdGlvblN0cmluZyJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50QXR0cmlidXRlIC0tPgo8IS0tIGR0bDpibG9jazpBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRPcGVyYXRvciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iMTAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3BlcmF0b3JPcHRpb25TdHJpbmcifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudE9wZXJhdG9yIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIxMCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQWN0aW9uSUQ6OiRRRGF0YXsiQWN0aW9uSUQifTo6QWN0aW9uVmFsdWU6OkRpdiI+CjwhLS0gZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3Um93RWxlbWVudEFjdGlvblZhbHVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IkFjdGlvbklEOjokUURhdGF7IkFjdGlvbklEIn06OkFjdGlvblZhbHVlIiBuYW1lPSJBY3Rpb25JRDo6JFFEYXRheyJBY3Rpb25JRCJ9OjpBY3Rpb25WYWx1ZSIgdmFsdWU9IiRRRGF0YXsiQWN0aW9uVmFsdWUifSIgc2l6ZT0iMzAiIG1heGxlbmd0aD0iMjUwIj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXdSb3dFbGVtZW50QWN0aW9uVmFsdWVUZXh0IC0tPgo8IS0tIGR0bDpibG9jazpBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRBY3Rpb25WYWx1ZVNlbGVjdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVmFsdWVPcHRpb25TdHJpbmcifQo8IS0tIGR0bDpibG9jazpBY3Rpb25PdmVydmlld1Jvd0VsZW1lbnRBY3Rpb25WYWx1ZVNlbGVjdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9IiBuYW1lPSJEZWxldGVBY3Rpb25JRDo6JFFEYXRheyJBY3Rpb25JRCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHdpZHRoPSIxMCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXdSb3cgLS0+CjwhLS0gZW1wdHkgcm93LCBmb3IgaGF2aW5nIGEgdmFsaWQgSFRNTCB0YWJsZSBpbiB0aGUgYWJzZW5jZSBvZiBhY3Rpb25zIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQgY29sc3Bhbj0iNyI+PC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJBZGQgbmV3IGFjdGlvbiJ9LiZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSIgbmFtZT0iQWRkQWN0aW9uIiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSIgbmFtZT0iU2F2ZSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTUNoYW5nZUVkaXQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01DaGFuZ2VFZGl0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VFZGl0LmR0bCx2IDEuNTIgMjAxMC8wNi8yMyAxMzo1MDowMyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFKQVgifQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkphdmFTY3JpcHRQYXRoIn1pdHNtLWNoYW5nZW1hbmFnZW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKCiAgICAvLyBjaGVjayB0aGUgdGl0bGUsIGFsbCB3aGl0ZXNwYWNlIGNvdW50cyBhcyBlbXB0eQogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuQ2hhbmdlVGl0bGUudmFsdWUubWF0Y2goL15ccyokLykpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBjaGFuZ2UgbXVzdCBoYXZlIGEgdGl0bGUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLkNoYW5nZVRpdGxlLmZvY3VzKCk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBjaGVjayB0aGUgcmVxdWVzdGVkIHRpbWUKICAgIGlmICggZG9jdW1lbnQuY29tcG9zZS5SZXF1ZXN0ZWRUaW1lVXNlZC5jaGVja2VkICYmICFDaGVja1RpbWUoICdSZXF1ZXN0ZWRUaW1lJyApICkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaGUgcmVxdWVzdGVkIHRpbWUgaXMgaW52YWxpZCEifScpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dENoZWNrSnMgLS0+CiAgICAvLyBjaGVjayB0aGUgcmVxdWlyZWQgZnJlZXRleHQgZmllbGRzCiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiQ2hhbmdlRnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IkNoYW5nZUZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJDaGFuZ2VGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dENoZWNrSnMgLS0+CgogICAgcmV0dXJuIHRydWU7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJEVudnsiQm94MCJ9ICRUZXh0eyJFZGl0In0gJENvbmZpZ3siSVRTTUNoYW5nZTo6SG9vayJ9OiAkUURhdGF7IkNoYW5nZU51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IkNoYW5nZVRpdGxlIn0iPgogICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJFZGl0In0gJENvbmZpZ3siSVRTTUNoYW5nZTo6SG9vayJ9OiAkUURhdGF7IkNoYW5nZU51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IkNoYW5nZVRpdGxlIiwiNzAifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdENoYW5nZVZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iICB2YWx1ZT0iU2F2ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFuZ2VJRCIgICB2YWx1ZT0iJFFEYXRheyJDaGFuZ2VJRCJ9Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiSVRTTSBDaGFuZ2UifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMzAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJUaXRsZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ2hhbmdlVGl0bGUiIHZhbHVlPSIkUURhdGF7IkNoYW5nZVRpdGxlIn0iIHNpemU9IjcwIiBtYXhsZW5ndGg9IjI1MCI+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUaXRsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUaXRsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJEZXNjcmlwdGlvbiJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pgo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KJEluY2x1ZGV7IlJpY2hUZXh0RWRpdG9ySVRTTSJ9CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQxIiBuYW1lPSJEZXNjcmlwdGlvbiIgcm93cz0iMTUiIGNvbHM9IiRDb25maWd7IklUU006OkZyb250ZW5kOjpUZXh0QXJlYSJ9IiB3cmFwPSIkRW52eyJCcm93c2VyV3JhcCJ9Ij4kRGF0YXsiRGVzY3JpcHRpb24ifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJKdXN0aWZpY2F0aW9uIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dDIiIG5hbWU9Ikp1c3RpZmljYXRpb24iIHJvd3M9IjE1IiBjb2xzPSIkQ29uZmlneyJJVFNNOjpGcm9udGVuZDo6VGV4dEFyZWEifSIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JERhdGF7Ikp1c3RpZmljYXRpb24ifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ2F0ZWdvcnkifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNhdGVnb3J5U2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENhdGVnb3J5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENhdGVnb3J5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkltcGFjdCJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW1wYWN0U2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZEltcGFjdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRJbXBhY3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUHJpb3JpdHkifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlByaW9yaXR5U2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkNoYW5nZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJDaGFuZ2VGcmVlVGV4dEZpZWxkIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0IC0tPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dFNwYWNlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0U3BhY2VyIC0tPgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZXhhbXBsZSBmb3IgY3VzdG9taXphdGlvbiBvZiBzaW5nbGUgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcwojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiM8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJDaGFuZ2VGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNoYW5nZUZyZWVUZXh0RmllbGQxIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRDaGFuZ2VGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHQxIC0tPgojCiMKIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkNoYW5nZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNoYW5nZUZyZWVUZXh0RmllbGQyIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRDaGFuZ2VGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHQyIC0tPgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXRlU2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KPCEtLSBkdGw6YmxvY2s6UmVxdWVzdGVkVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUmVxdWVzdGVkIChieSBjdXN0b21lcikgRGF0ZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUmVxdWVzdGVkVGltZVN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRSZXF1ZXN0ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFJlcXVlc3RlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWVzdGVkVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTYiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtGaWxlSUQ9JExRRGF0YXsiRmlsZUlEIn07Q2hhbmdlSUQ9JExRRGF0YXsiQ2hhbmdlSUQifSI+PGltZyBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRpc2stcy5wbmciIGJvcmRlcj0iMCIgYWx0PSJEb3dubG9hZCIgdGl0bGU9IkRvd25sb2FkIi8+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkRlbGV0ZUF0dGFjaG1lbnQkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iQXR0YWNobWVudE5ldyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTAwJSI+PGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ1dHRvbiIgbmFtZT0iU2F2ZUF0dGFjaG1lbnQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RmlsZUFscmVhZHlVcGxvYWRlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpbGVBbHJlYWR5VXBsb2FkZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRFZGl0Q2hhbmdlIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgbmFtZT0iRWRpdENoYW5nZSIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTUNoYW5nZUhpc3RvcnkuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01DaGFuZ2VIaXN0b3J5CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VIaXN0b3J5LmR0bCx2IDEuMjAgMjAxMC8wMi8wNCAxMjowNDo1NiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7Ikhpc3Rvcnkgb2YifSAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7Ikhpc3Rvcnkgb2YifSAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUiLCI3MCJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0Q2hhbmdlVmlldyJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgIDxjb2w+CiAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iNjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjYwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgIDxjb2w+CiAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWN0aW9uIn06CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDb21tZW50In06CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJEZXRhaWxzIn06CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJXb3Jrb3JkZXIifToKICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlVzZXIifToKICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNyZWF0ZXRpbWUifToKICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSIkUURhdGF7ImNzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICRRdW90ZXsiJERhdGF7Ikhpc3RvcnlUeXBlIn0ifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNvbnRlbnQifSI+JFFEYXRheyJDb250ZW50IiwiMTAwIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVpvb21EYXNoIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAtCjwhLS0gZHRsOmJsb2NrOkhpc3Rvcnlab29tRGFzaCAtLT4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVpvb20gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNJERhdGF7Ilpvb21UeXBlIn1IaXN0b3J5Wm9vbSZIaXN0b3J5RW50cnlJRD0kRGF0YXsiSGlzdG9yeUVudHJ5SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7Ik1vcmUgSW5mbyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+eDwvYT4KPCEtLSBkdGw6YmxvY2s6SGlzdG9yeVpvb20gLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOkRhc2ggLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIC0KPCEtLSBkdGw6YmxvY2s6RGFzaCAtLT4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyWm9vbSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Xb3JrT3JkZXJab29tJldvcmtPcmRlcklEPSREYXRheyJXb3JrT3JkZXJJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiWm9vbSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+eDwvYT4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyWm9vbSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFF1b3RleyIkRGF0YXsiVXNlckxvZ2luIn0gKCREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9KSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRdW90ZXsiJERhdGF7IlVzZXJMb2dpbiJ9In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIyMCJ9KQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ2hhbmdlSGlzdG9yeVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZUhpc3Rvcnlab29tLmR0bCx2IDEuMTYgMjAxMC8wMi8wNCAxMjowNDo1NiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAubm93cmFwIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQoKICAgIC5maWVsZHZhbHVlcyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgIH0KPC9zdHlsZT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7Ikhpc3Rvcnkgb2YifSAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7Ikhpc3Rvcnkgb2YifSAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUiLCI3MCJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuSGlzdG9yeSJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJEZXRhaWxlZCBoaXN0b3J5IGluZm9ybWF0aW9uIG9mIn0gJERhdGF7Ikhpc3RvcnlUeXBlIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkgbm93cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik1vZGlmaWVkIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRmllbGRuYW1lIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkgbm93cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik9sZCBWYWx1ZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHZhbHVlcyI+JERhdGF7IkNvbnRlbnRPbGQifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSBub3dyYXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiTmV3IFZhbHVlIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkdmFsdWVzIj4kRGF0YXsiQ29udGVudE5ldyJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IG5vd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2VkIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJFFEYXRheyJDaGFuZ2VUaW1lIn0ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSBub3dyYXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ2hhbmdlZCBieSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUXVvdGV7IiREYXRheyJVc2VyTG9naW4ifSAoJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0pIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFF1b3RleyIkRGF0YXsiVXNlckxvZ2luIn0ifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjQwIn0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTUNoYW5nZUludm9sdmVkUGVyc29ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlSW52b2x2ZWRQZXJzb25zLmR0bCx2IDEuMzUgMjAxMC8wNS8yOCAxNzo1MzowNiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFKQVgifQoKJEluY2x1ZGV7IkFnZW50SVRTTVVzZXJTZWFyY2gifQokSW5jbHVkZXsiQWdlbnRJVFNNQ0FCTWVtYmVyU2VhcmNoIn0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAubXlBdXRvQ29tcGxldGUgewogICAgICAgIHdpZHRoOiAgICAgICAgICAzMmVtOyAgICAvKiBzZXQgd2lkdGggaGVyZSBvciBlbHNlIHdpZGdldCB3aWxsIGV4cGFuZCB0byBmaXQgaXRzIGNvbnRhaW5lciAqLwogICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjVlbTsKICAgIH0KCiAgICAgLyogbmVlZGVkIGZvciBzdGFja2VkIGluc3RhbmNlcyBmb3IgaWUgJiBzZiB6LWluZGV4IGJ1ZyBvZiBhYnNvbHV0ZSBpbnNpZGUgcmVsYXRpdmUgZWxzICovCiAgICAgI215QXV0b0NvbXBsZXRlMSB7IHotaW5kZXg6OTAwMTsgfQogICAgICNteUF1dG9Db21wbGV0ZTIgeyB6LWluZGV4OjkwMDA7IH0KCjwvc3R5bGU+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIGNsZWFyX2ZpZWxkMSgpIHsKICAgIGRvY3VtZW50LmNvbXBvc2UuQ2hhbmdlTWFuYWdlci52YWx1ZSA9ICIiOwogICAgZG9jdW1lbnQuY29tcG9zZS5DaGFuZ2VNYW5hZ2VyLmZvY3VzKCk7Cn0KZnVuY3Rpb24gY2xlYXJfZmllbGQyKCkgewogICAgZG9jdW1lbnQuY29tcG9zZS5DaGFuZ2VCdWlsZGVyLnZhbHVlID0gIiI7CiAgICBkb2N1bWVudC5jb21wb3NlLkNoYW5nZUJ1aWxkZXIuZm9jdXMoKTsKfQpmdW5jdGlvbiBjbGVhcl9maWVsZDMoKSB7CiAgICBkb2N1bWVudC5jb21wb3NlLk5ld0NBQk1lbWJlci52YWx1ZSA9ICIiOwogICAgZG9jdW1lbnQuY29tcG9zZS5OZXdDQUJNZW1iZXIuZm9jdXMoKTsKfQoKLy8gZG8gaW5pdGlhbGl6YXRpb24gd2hlbiB0aGUgRE9NIGlzIGZ1bGx5IGxvYWRlZApkb2N1bWVudC5vYnNlcnZlKCAiZG9tOmxvYWRlZCIsIGZ1bmN0aW9uKCkgewoKICAgIC8vIGNsZWFyIHRoZSBDaGFuZ2VNYW5hZ2VyIGlucHV0IGZpZWxkLCB3aGVuIGl0IGdhaW5zIGZvY3VzCiAgICAkKCdteUF1dG9Db21wbGV0ZUlucHV0MScpLm9ic2VydmUoCiAgICAgICAgJ2ZvY3VzJywKICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSgnJyk7CiAgICAgICAgfQogICAgKTsKCiAgICAvLyBjbGVhciB0aGUgQ2hhbmdlQnVpbGRlciBpbnB1dCBmaWVsZCwgd2hlbiBpdCBnYWlucyBmb2N1cwogICAgJCgnbXlBdXRvQ29tcGxldGVJbnB1dDInKS5vYnNlcnZlKAogICAgICAgICdmb2N1cycsCiAgICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoJycpOwogICAgICAgIH0KICAgICk7CgogICAgLy8gY2xlYXIgdGhlIENBQk1lbWJlciBpbnB1dCBmaWVsZCwgd2hlbiBpdCBnYWlucyBmb2N1cwogICAgJCgnbXlDQUJBdXRvQ29tcGxldGVJbnB1dCcpLm9ic2VydmUoCiAgICAgICAgJ2ZvY3VzJywKICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSgnJyk7CiAgICAgICAgfQogICAgKTsKfSApOwoKLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJEVudnsiQm94MCJ9ICRUZXh0eyJFZGl0In0gJFRleHR7Ikludm9sdmVkIFBlcnNvbnMifSAkVGV4dHsib2YifSAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiQ2hhbmdlVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IkVkaXQifSAkVGV4dHsiSW52b2x2ZWQgUGVyc29ucyJ9ICRUZXh0eyJvZiJ9ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJDaGFuZ2VUaXRsZSIsIjcwIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RDaGFuZ2VWaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgICAgICAgIC0KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01DaGFuZ2VDQUJUZW1wbGF0ZTtDaGFuZ2VJRD0kRGF0YXsiQ2hhbmdlSUQifSIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiVGVtcGxhdGUifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgICAgICAgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgICAgICAgICB2YWx1ZT0iU2F2ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFuZ2VJRCIgICAgICAgICAgdmFsdWU9IiRRRGF0YXsiQ2hhbmdlSUQifSI+Cgo8IS0tICAgICAgICAjIyBIaWRkZW5GaWVsZHMgZm9yIENoYW5nZU1hbmFnZXIgQXV0b2NvbXBsZXRpb24gIyMgICAgICAgICAgICAtLT4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNlbGVjdGVkVXNlcjEiICAgICB2YWx1ZT0iJFFEYXRheyJTZWxlY3RlZFVzZXIxIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVXNlclNlYXJjaEdyb3VwczEiIHZhbHVlPSJpdHNtLWNoYW5nZS1tYW5hZ2VyIj4KCjwhLS0gICAgICAgICMjIEhpZGRlbkZpZWxkcyBmb3IgQ2hhbmdlQnVpbGRlciBBdXRvY29tcGxldGlvbiAjIyAgICAgICAgICAgIC0tPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRVc2VyMiIgICAgIHZhbHVlPSIkUURhdGF7IlNlbGVjdGVkVXNlcjIifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJVc2VyU2VhcmNoR3JvdXBzMiIgdmFsdWU9Iml0c20tY2hhbmdlLWJ1aWxkZXIiPgoKPCEtLSAgICAgICAgIyMgSGlkZGVuRmllbGRzIGZvciBDQUJNZW1iZXIgQXV0b2NvbXBsZXRpb24gIyMgICAgICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDQUJNZW1iZXJUeXBlIiAgICAgdmFsdWU9IiRRRGF0YXsiQ0FCTWVtYmVyVHlwZSJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNBQk1lbWJlcklEIiAgICAgICB2YWx1ZT0iJFFEYXRheyJDQUJNZW1iZXJJRCJ9Ij4KCiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikludm9sdmVkIFBlcnNvbnMifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMzAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNoYW5nZU1hbmFnZXIifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQxIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibXlBdXRvQ29tcGxldGUxIiBjbGFzcz0ibXlBdXRvQ29tcGxldGUiPgo8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQxIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibXlBdXRvQ29tcGxldGVJbnB1dDEiIHR5cGU9InRleHQiIG5hbWU9IkNoYW5nZU1hbmFnZXIiIHZhbHVlPSIkUURhdGF7IkNoYW5nZU1hbmFnZXIifSIgc2l6ZT0iNzAiLz4KPCEtLSBkdGw6YmxvY2s6VXNlclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZDEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibXlBdXRvQ29tcGxldGVDb250YWluZXIxIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlRGl2RW5kMSAtLT4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZU1hbmFnZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkQ2hhbmdlTWFuYWdlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ2hhbmdlTWFuYWdlclN0cmcifQo8IS0tIGR0bDpibG9jazpUYWtlQ2hhbmdlTWFuYWdlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iRXhwYW5kTWFuYWdlcjIiIHZhbHVlPSIkVGV4dHsiVGFrZSB0aGlzIFVzZXIifSIvPgo8IS0tIGR0bDpibG9jazpUYWtlQ2hhbmdlTWFuYWdlciAtLT4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoVXNlckJ1dHRvbjEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRNYW5hZ2VyMSIgdmFsdWU9IiRUZXh0eyJTZWFyY2ggVXNlciJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJDbGVhclVzZXIxIiB2YWx1ZT0iJFRleHR7IkNsZWFyIn0gJFRleHR7IlVzZXIifSIgb25jbGljaz0iamF2YXNjcmlwdDpjbGVhcl9maWVsZDEoKTsgcmV0dXJuIGZhbHNlOyIvPgo8IS0tIGR0bDpibG9jazpTZWFyY2hVc2VyQnV0dG9uMSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2VCdWlsZGVyIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IlJlcXVpcmVkIn0iPio8L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6VXNlclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0MiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlMiIgY2xhc3M9Im15QXV0b0NvbXBsZXRlIj4KPCEtLSBkdGw6YmxvY2s6VXNlclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0MiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im15QXV0b0NvbXBsZXRlSW5wdXQyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJDaGFuZ2VCdWlsZGVyIiB2YWx1ZT0iJFFEYXRheyJDaGFuZ2VCdWlsZGVyIn0iIHNpemU9IjcwIi8+CjwhLS0gZHRsOmJsb2NrOlVzZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZFbmQyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlQ29udGFpbmVyMiI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VXNlclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZDIgLS0+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRDaGFuZ2VCdWlsZGVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENoYW5nZUJ1aWxkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNoYW5nZUJ1aWxkZXJTdHJnIn0KPCEtLSBkdGw6YmxvY2s6VGFrZUNoYW5nZUJ1aWxkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkV4cGFuZEJ1aWxkZXIyIiB2YWx1ZT0iJFRleHR7IlRha2UgdGhpcyBVc2VyIn0iLz4KPCEtLSBkdGw6YmxvY2s6VGFrZUNoYW5nZUJ1aWxkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaFVzZXJCdXR0b24yIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iRXhwYW5kQnVpbGRlcjEiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIFVzZXIifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQ2xlYXJVc2VyMiIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9ICRUZXh0eyJVc2VyIn0iIG9uY2xpY2s9ImphdmFzY3JpcHQ6Y2xlYXJfZmllbGQyKCk7IHJldHVybiBmYWxzZTsiLz4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoVXNlckJ1dHRvbjIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDaGFuZ2UgQWR2aXNvcnkgQm9hcmQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMzAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkFkZCBDQUIgVGVtcGxhdGUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpDQUJUZW1wbGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJDQUJUZW1wbGF0ZVN0cmcifQo8IS0tIGR0bDpibG9jazpDQUJUZW1wbGF0ZSAtLT4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uIiBuYW1lPSJBZGRDQUJUZW1wbGF0ZSIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWRkIHRvIENBQiJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjY1JSI+CjwhLS0gZHRsOmJsb2NrOkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibXlDQUJBdXRvQ29tcGxldGUiIGNsYXNzPSJteUNBQkF1dG9Db21wbGV0ZSI+CjwhLS0gZHRsOmJsb2NrOkNBQk1lbWJlclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibXlDQUJBdXRvQ29tcGxldGVJbnB1dCIgdHlwZT0idGV4dCIgbmFtZT0iTmV3Q0FCTWVtYmVyIiB2YWx1ZT0iJFFEYXRheyJOZXdDQUJNZW1iZXIifSIgc2l6ZT0iNzAiLz4KPCEtLSBkdGw6YmxvY2s6Q0FCTWVtYmVyU2VhcmNoQXV0b0NvbXBsZXRlRGl2RW5kIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15Q0FCQXV0b0NvbXBsZXRlQ29udGFpbmVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDQUJNZW1iZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZFbmQgLS0+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRDQUJNZW1iZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+PGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRDQUJNZW1iZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ0FCTWVtYmVyU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOlRha2VDQUJNZW1iZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkV4cGFuZENBQk1lbWJlcjIiIHZhbHVlPSIkVGV4dHsiVGFrZSB0aGlzIFVzZXIifSIvPgo8IS0tIGR0bDpibG9jazpUYWtlQ0FCTWVtYmVyIC0tPgo8IS0tIGR0bDpibG9jazpTZWFyY2hDQUJNZW1iZXJCdXR0b24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDQUJNZW1iZXIxIiB2YWx1ZT0iJFRleHR7IlNlYXJjaCBVc2VyIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkNsZWFyQ0FCTWVtYmVyIiB2YWx1ZT0iJFRleHR7IkNsZWFyIn0gJFRleHR7IlVzZXIifSIgb25jbGljaz0iamF2YXNjcmlwdDpjbGVhcl9maWVsZDMoKTsgcmV0dXJuIGZhbHNlOyIvPgo8IS0tIGR0bDpibG9jazpTZWFyY2hDQUJNZW1iZXJCdXR0b24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidXR0b24iIG5hbWU9IkFkZENBQk1lbWJlciIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ3VycmVudCBDQUIifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJBZ2VudCJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBZ2VudENBQiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IiRRRGF0YXsiVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0ifSkiPiRRRGF0YXsiVXNlckxvZ2luIiwiMjUifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjI1In0pPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ1dHRvbiIgbmFtZT0iRGVsZXRlQ0FCQWdlbnQkUURhdGF7IlVzZXJJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFnZW50Q0FCIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXN0b21lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyQ0FCIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFFEYXRheyJVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSJ9KSI+JFFEYXRheyJVc2VyTG9naW4iLCIyNSJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMjUifSk8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uIiBuYW1lPSJEZWxldGVDQUJDdXN0b21lciRRRGF0YXsiVXNlckxvZ2luIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJDQUIgLS0+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgoKICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyLmR0bCAtIGh0bWwgZm9yIGNoYW5nZSBvdmVydmlldyB0YWJsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlT3ZlcnZpZXdOYXZCYXIuZHRsLHYgMS44IDIwMTAvMDIvMDMgMTM6MTM6MTcgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCjxhIG5hbWU9InN1Ym5hdiI+PC9hPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhciAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiJFFEYXRheyJUaXRsZU5hbWUifSJ9OiAkVGV4dHsiJFFEYXRheyJUaXRsZVZhbHVlIn0ifSAkRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJNYWluIC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgICRUZXh0eyIkUURhdGF7Ik1haW5OYW1lIn0ifTogJERhdGF7Ik1haW5Db250ZW50In0KICAgICAgICA8L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJNYWluIC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOTAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJGaWx0ZXIifToKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJGaWx0ZXJMaW5rIn1GaWx0ZXI9JExRRGF0YXsiRmlsdGVyIn0iIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJOYW1lIn0ifQo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZENvdW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJFFEYXRheyJDb3VudCJ9KQo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZENvdW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkZpbHRlckxpbmsifUZpbHRlcj0kTFFEYXRheyJGaWx0ZXIifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90Q291bnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgkUURhdGF7IkNvdW50In0pCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90Q291bnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNwbGl0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyUGFnZUJhY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua0JhY2sifSI+JFRleHR7IkNoYW5nZSBzZWFyY2ggb3B0aW9ucyJ9PC9hPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclBhZ2VCYWNrIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclBhZ2VOYXZCYXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2VzIn06ICREYXRheyJSZXN1bHQifSAkVGV4dHsib2YifSAkRGF0YXsiVG90YWxIaXRzIn0gLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUGFnZSJ9OiAkRGF0YXsiU2l0ZU5hdkJhciJ9CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZVNlbGVjdGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mRmlsdGVyPSRMUURhdGF7IkZpbHRlciJ9JlZpZXc9JExRRGF0YXsiVmlldyJ9JiREYXRheyJMaW5rRmlsdGVyIn0jc3VibmF2IiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiTmFtZSJ9In0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiSW1hZ2VTZWxlY3RlZCJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9Ii8+PC9hPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclZpZXdNb2RlU2VsZWN0ZWQgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZpbHRlcj0kTFFEYXRheyJGaWx0ZXIifSZWaWV3PSRMUURhdGF7IlZpZXcifSYkRGF0YXsiTGlua0ZpbHRlciJ9I3N1Ym5hdiIgdGl0bGU9IiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkltYWdlIn0iIGFsdD0iJFRleHR7IiRRRGF0YXsiTmFtZSJ9In0iLz48L2E+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyIC0tPgo=
IyAtLQojIEFnZW50SVRTTUNoYW5nZU92ZXJ2aWV3TmF2QmFyU21hbGwuZHRsIC0gaHRtbCBmb3IgY2hhbmdlIG92ZXJ2aWV3IHRhYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VPdmVydmlld05hdkJhclNtYWxsLmR0bCx2IDEuMyAyMDEwLzAxLzIxIDE2OjEwOjA4IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhciAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI5MCUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclBhZ2VOYXZCYXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2VzIn06ICREYXRheyJSZXN1bHQifSAkVGV4dHsib2YifSAkRGF0YXsiVG90YWxIaXRzIn0gLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUGFnZSJ9OiAkRGF0YXsiU2l0ZU5hdkJhciJ9CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyUGFnZU5hdkJhciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkZpbHRlciJ9Ogo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkZpbHRlckxpbmsifUZpbHRlcj0kTFFEYXRheyJGaWx0ZXIifSIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lIj48Yj4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifSAoJFFEYXRheyJDb3VudCJ9KTwvYj48L2E+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJGaWx0ZXJMaW5rIn1GaWx0ZXI9JExRRGF0YXsiRmlsdGVyIn0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9ICgkUURhdGF7IkNvdW50In0pPC9hPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU3BsaXQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU3BsaXQgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyVmlld01vZGUgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZpbHRlcj0kTFFEYXRheyJGaWx0ZXIifSZWaWV3PSRMUURhdGF7IlZpZXcifSNzdWJuYXYiIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJOYW1lIn0ifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJJbWFnZVNlbGVjdGVkIn0iIGFsdD0iJFRleHR7IiRRRGF0YXsiTmFtZSJ9In0iLz48L2E+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZU5vdFNlbGVjdGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mRmlsdGVyPSRMUURhdGF7IkZpbHRlciJ9JlZpZXc9JExRRGF0YXsiVmlldyJ9I3N1Ym5hdiIgdGl0bGU9IiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkltYWdlIn0iIGFsdD0iJFRleHR7IiRRRGF0YXsiTmFtZSJ9In0iLz48L2E+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyVmlld01vZGVOb3RTZWxlY3RlZCAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyTWFpbiAtLT4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiTWFpbk5hbWUifSJ9OiAkRGF0YXsiTWFpbkNvbnRlbnQifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhck1haW4gLS0+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyIC0tPgo=
IyAtLQojIEFnZW50SVRTTUNoYW5nZU92ZXJ2aWV3U21hbGwuZHRsIC0gaHRtbCBmb3IgY2hhbmdlIG92ZXJ2aWV3IHRhYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2VPdmVydmlld1NtYWxsLmR0bCx2IDEuMjMgMjAxMC8wNC8yNyAyMDo0MjozNSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCIgYWxpZ249ImxlZnQiPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbEhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGggd2lkdGg9IjElIj48L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbEhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWxIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoIHdpZHRoPSIxJSI+PC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWxIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZU51bWJlckhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGg+JENvbmZpZ3siSVRTTUNoYW5nZTo6SG9vayJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1DaGFuZ2VOdW1iZXImT3JkZXJCeT1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4gLwogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkxpbmtTb3J0In0mU29ydEJ5PUNoYW5nZU51bWJlciZPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlTnVtYmVySGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJOdW1iZXJIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9V29ya09yZGVyTnVtYmVyJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Xb3JrT3JkZXJOdW1iZXImT3JkZXJCeT1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlck51bWJlckhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyVGl0bGVIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJXb3JrT3JkZXJUaXRsZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Xb3JrT3JkZXJUaXRsZSZPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Xb3JrT3JkZXJUaXRsZSZPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlclRpdGxlSGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VUaXRsZUhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IkNoYW5nZVRpdGxlIn08YnIvPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkxpbmtTb3J0In0mU29ydEJ5PUNoYW5nZVRpdGxlJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4gLwogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkxpbmtTb3J0In0mU29ydEJ5PUNoYW5nZVRpdGxlJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlVGl0bGVIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlckFnZW50SGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiV29ya09yZGVyQWdlbnQifTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9V29ya09yZGVyQWdlbnRJRCZPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiAvCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9V29ya09yZGVyQWdlbnRJRCZPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyQWdlbnRIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZUJ1aWxkZXJIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDaGFuZ2VCdWlsZGVyIn08YnIvPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkxpbmtTb3J0In0mU29ydEJ5PUNoYW5nZUJ1aWxkZXJJRCZPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiAvCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9Q2hhbmdlQnVpbGRlcklEJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VCdWlsZGVySGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VNYW5hZ2VySGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQ2hhbmdlTWFuYWdlciJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1DaGFuZ2VNYW5hZ2VySUQmT3JkZXJCeT1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4gLwogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkxpbmtTb3J0In0mU29ydEJ5PUNoYW5nZU1hbmFnZXJJRCZPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlTWFuYWdlckhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyQ291bnRIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPiRUZXh0eyJXb3Jrb3JkZXJzIn08L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJDb3VudEhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlU3RhdGVIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDaGFuZ2VTdGF0ZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1DaGFuZ2VTdGF0ZUlEJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1DaGFuZ2VTdGF0ZUlEJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VTdGF0ZUhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyU3RhdGVIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJXb3JrT3JkZXJTdGF0ZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Xb3JrT3JkZXJTdGF0ZUlEJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Xb3JrT3JkZXJTdGF0ZUlEJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJTdGF0ZUhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyVHlwZUhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IldvcmtPcmRlclR5cGUifTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9V29ya09yZGVyVHlwZUlEJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Xb3JrT3JkZXJUeXBlSUQmT3JkZXJCeT1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlclR5cGVIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENhdGVnb3J5SGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQ2F0ZWdvcnkifTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9Q2F0ZWdvcnlJRCZPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiAvCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9Q2F0ZWdvcnlJRCZPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2F0ZWdvcnlIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZEltcGFjdEhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IkltcGFjdCJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1JbXBhY3RJRCZPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiAvCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9SW1wYWN0SUQmT3JkZXJCeT1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZEltcGFjdEhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkUHJpb3JpdHlIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJQcmlvcml0eSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Qcmlvcml0eUlEJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1Qcmlvcml0eUlEJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQcmlvcml0eUhlYWRlciAtLT4KCjwhLS0gZHRsOmJsb2NrOlJlY29yZFNlcnZpY2VzSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiU2VydmljZXMifTxici8+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkU2VydmljZXNIZWFkZXIgLS0+Cgo8IS0tIGR0bDpibG9jazpSZWNvcmRSZXF1ZXN0ZWRUaW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiUmVxdWVzdGVkIFRpbWUifTxici8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSYkRGF0YXsiTGlua1NvcnQifSZTb3J0Qnk9UmVxdWVzdGVkYWxpemVUaW1lJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1SZXF1ZXN0ZWRUaW1lJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRSZXF1ZXN0ZWRUaW1lSGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQbGFubmVkU3RhcnRUaW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiUGxhbm5lZFN0YXJ0VGltZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1QbGFubmVkU3RhcnRUaW1lJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1QbGFubmVkU3RhcnRUaW1lJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQbGFubmVkU3RhcnRUaW1lSGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQbGFubmVkRW5kVGltZUhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IlBsYW5uZWRFbmRUaW1lIn08YnIvPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkxpbmtTb3J0In0mU29ydEJ5PVBsYW5uZWRFbmRUaW1lJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1QbGFubmVkRW5kVGltZSZPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkUGxhbm5lZEVuZFRpbWVIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZEFjdHVhbFN0YXJ0VGltZUhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IkFjdHVhbFN0YXJ0VGltZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1BY3R1YWxTdGFydFRpbWUmT3JkZXJCeT1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4gLwogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mJERhdGF7IkxpbmtTb3J0In0mU29ydEJ5PUFjdHVhbFN0YXJ0VGltZSZPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kb3duLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsiZG93biJ9Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgPC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQWN0dWFsU3RhcnRUaW1lSGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRBY3R1YWxFbmRUaW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQWN0dWFsRW5kVGltZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1BY3R1YWxFbmRUaW1lJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1BY3R1YWxFbmRUaW1lJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRBY3R1YWxFbmRUaW1lSGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDcmVhdGVUaW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQ3JlYXRlZCJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1DcmVhdGVUaW1lJk9yZGVyQnk9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JiREYXRheyJMaW5rU29ydCJ9JlNvcnRCeT1DcmVhdGVUaW1lJk9yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDcmVhdGVUaW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkIC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbCAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiQ2hhbmdlU3RhdGVTaWduYWwifS5wbmciIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDaGFuZ2VTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiRRRGF0YXsiQ2hhbmdlU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VTdGF0ZVNpZ25hbCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWwgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IldvcmtPcmRlclN0YXRlU2lnbmFsIn0ucG5nIiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiV29ya09yZGVyU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkUURhdGF7IldvcmtPcmRlclN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyU3RhdGVTaWduYWwgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZU51bWJlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZU51bWJlckxpbmtTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tJkNoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7Ilpvb20ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIHRpdGxlPSIkUURhdGF7IkNoYW5nZU51bWJlciJ9Ij4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlTnVtYmVyTGlua1N0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VOdW1iZXIifQo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VOdW1iZXJMaW5rRW5kIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZU51bWJlckxpbmtFbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlTnVtYmVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJOdW1iZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJOdW1iZXJMaW5rU3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbSZXb3JrT3JkZXJJRD0kUURhdGF7IldvcmtPcmRlcklEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJab29tIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9Ij4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyTnVtYmVyTGlua1N0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlck51bWJlckxpbmtFbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyTnVtYmVyTGlua0VuZCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJOdW1iZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlclRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJUaXRsZSJ9Ij4kUURhdGF7IldvcmtPcmRlclRpdGxlIiwiNDAifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlclRpdGxlIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VUaXRsZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZVRpdGxlTGlua1N0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7IGNvbG9yOmJsYWNrOyIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tJkNoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7Ilpvb20ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIHRpdGxlPSIkUURhdGF7IkNoYW5nZVRpdGxlIn0iPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VUaXRsZUxpbmtTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVGl0bGUiLCI0MCJ9CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZVRpdGxlTGlua0VuZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VUaXRsZUxpbmtFbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlVGl0bGUgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlckFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJBZ2VudFVzZXJMb2dpbiJ9ICRRRGF0YXsiV29ya09yZGVyQWdlbnRMZWZ0UGFyZW50aGVzaXMifSRRRGF0YXsiV29ya09yZGVyQWdlbnRVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJXb3JrT3JkZXJBZ2VudFVzZXJMYXN0bmFtZSJ9JFFEYXRheyJXb3JrT3JkZXJBZ2VudFJpZ2h0UGFyZW50aGVzaXMifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IldvcmtPcmRlckFnZW50VXNlckxvZ2luIiwiMTUifSAkUURhdGF7IldvcmtPcmRlckFnZW50TGVmdFBhcmVudGhlc2lzIn0kUXVvdGV7IiREYXRheyJXb3JrT3JkZXJBZ2VudFVzZXJGaXJzdG5hbWUifSIsICIxNSJ9ICRRdW90ZXsiJERhdGF7IldvcmtPcmRlckFnZW50VXNlckxhc3RuYW1lIn0iLCIxNSJ9JFFEYXRheyJXb3JrT3JkZXJBZ2VudFJpZ2h0UGFyZW50aGVzaXMifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJBZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlQnVpbGRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMb2dpbiJ9ICRRRGF0YXsiQ2hhbmdlQnVpbGRlckxlZnRQYXJlbnRoZXNpcyJ9JFFEYXRheyJDaGFuZ2VCdWlsZGVyVXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMYXN0bmFtZSJ9JFFEYXRheyJDaGFuZ2VCdWlsZGVyUmlnaHRQYXJlbnRoZXNpcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMb2dpbiIsIjE1In0gJFFEYXRheyJDaGFuZ2VCdWlsZGVyTGVmdFBhcmVudGhlc2lzIn0kUXVvdGV7IiREYXRheyJDaGFuZ2VCdWlsZGVyVXNlckZpcnN0bmFtZSJ9IiwgIjE1In0gJFF1b3RleyIkRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMYXN0bmFtZSJ9IiwiMTUifSRRRGF0YXsiQ2hhbmdlQnVpbGRlclJpZ2h0UGFyZW50aGVzaXMifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VCdWlsZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VNYW5hZ2VyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VNYW5hZ2VyVXNlckxvZ2luIn0gJFFEYXRheyJDaGFuZ2VNYW5hZ2VyTGVmdFBhcmVudGhlc2lzIn0kUURhdGF7IkNoYW5nZU1hbmFnZXJVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJDaGFuZ2VNYW5hZ2VyVXNlckxhc3RuYW1lIn0kUURhdGF7IkNoYW5nZU1hbmFnZXJSaWdodFBhcmVudGhlc2lzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VNYW5hZ2VyVXNlckxvZ2luIiwiMTUifSAkUURhdGF7IkNoYW5nZU1hbmFnZXJMZWZ0UGFyZW50aGVzaXMifSRRdW90ZXsiJERhdGF7IkNoYW5nZU1hbmFnZXJVc2VyRmlyc3RuYW1lIn0iLCAiMTUifSAkUXVvdGV7IiREYXRheyJDaGFuZ2VNYW5hZ2VyVXNlckxhc3RuYW1lIn0iLCIxNSJ9JFFEYXRheyJDaGFuZ2VNYW5hZ2VyUmlnaHRQYXJlbnRoZXNpcyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZU1hbmFnZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlckNvdW50IC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJDb3VudCJ9IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij4kUURhdGF7IldvcmtPcmRlckNvdW50In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJDb3VudCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlU3RhdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJFFEYXRheyJDaGFuZ2VTdGF0ZSJ9In0iPiRUZXh0eyIkUURhdGF7IkNoYW5nZVN0YXRlIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZVN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7IldvcmtPcmRlclN0YXRlIn0ifSI+JFRleHR7IiRRRGF0YXsiV29ya09yZGVyU3RhdGUifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkV29ya09yZGVyU3RhdGUgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFdvcmtPcmRlclR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJFFEYXRheyJXb3JrT3JkZXJUeXBlIn0ifSI+JFRleHR7IiRRRGF0YXsiV29ya09yZGVyVHlwZSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRXb3JrT3JkZXJUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDYXRlZ29yeSAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkNhdGVnb3J5In0ifSI+JFRleHR7IiRRRGF0YXsiQ2F0ZWdvcnkifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2F0ZWdvcnkgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZEltcGFjdCAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkltcGFjdCJ9In0iPiRUZXh0eyIkUURhdGF7IkltcGFjdCJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRJbXBhY3QgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiUHJpb3JpdHkifSJ9Ij4kVGV4dHsiJFFEYXRheyJQcmlvcml0eSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQcmlvcml0eSAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkU2VydmljZXMgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRTZXJ2aWNlc1N1YkVsZW1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkN1ckluY2lTaWduYWwifS1zbWFsbC5wbmciIHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiQ3VySW5jaVN0YXRlIn0ifSJ9IiBhbHQ9IiRRdW90ZXsiJFRleHR7IiREYXRheyJDdXJJbmNpU3RhdGUifSJ9In0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkU2VydmljZXNTdWJFbGVtZW50IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFNlcnZpY2VzIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRSZXF1ZXN0ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRpbWVMb25neyIkUURhdGF7IlJlcXVlc3RlZFRpbWUifSJ9Ij4kVGltZUxvbmd7IiRRRGF0YXsiUmVxdWVzdGVkVGltZSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRSZXF1ZXN0ZWRUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQbGFubmVkU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRpbWVMb25neyIkUURhdGF7IlBsYW5uZWRTdGFydFRpbWUifSJ9Ij4kVGltZUxvbmd7IiRRRGF0YXsiUGxhbm5lZFN0YXJ0VGltZSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQbGFubmVkU3RhcnRUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQbGFubmVkRW5kVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUaW1lTG9uZ3siJFFEYXRheyJQbGFubmVkRW5kVGltZSJ9In0iPiRUaW1lTG9uZ3siJFFEYXRheyJQbGFubmVkRW5kVGltZSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRQbGFubmVkRW5kVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQWN0dWFsU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRpbWVMb25neyIkUURhdGF7IkFjdHVhbFN0YXJ0VGltZSJ9In0iPiRUaW1lTG9uZ3siJFFEYXRheyJBY3R1YWxTdGFydFRpbWUifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQWN0dWFsU3RhcnRUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRBY3R1YWxFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRpbWVMb25neyIkUURhdGF7IkFjdHVhbEVuZFRpbWUifSJ9Ij4kVGltZUxvbmd7IiRRRGF0YXsiQWN0dWFsRW5kVGltZSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRBY3R1YWxFbmRUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDcmVhdGVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRpbWVMb25neyIkUURhdGF7IkNyZWF0ZVRpbWUifSJ9Ij4kVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlVGltZSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDcmVhdGVUaW1lIC0tPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkIC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIGNvbHNwYW49IiRRRGF0YXsiQ29sdW1uQ291bnQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTUNoYW5nZVByaW50LmR0bCAtIHByb3ZpZGVzIEhUTUwgcHJpbnQgdmlldwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlUHJpbnQuZHRsLHYgMS4xMyAyMDEwLzA0LzI3IDIwOjQyOjM1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpDaGFuZ2UgLS0+Cgo8IS0tIGR0bDpibG9jazpDaGFuZ2VIZWFkbGluZSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JFFEYXRheyJIZWFkZXJBcmVhIn0jOiAkUURhdGF7IkhlYWRlclZhbHVlIn0gLSAkUURhdGF7IlRpdGxlIiwiMzAifTwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VIZWFkbGluZSAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjQwJSIvPgogICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjYwJSIvPgogICAgICAgICAgICAgICAgPC9jb2xncm91cD4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlSW5mb0xlZnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IktleSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiID4kUURhdGF7IlZhbHVlIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlSW5mb0xlZnQgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI0MCUiLz4KICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI2MCUiLz4KICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUluZm9SaWdodCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiS2V5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgPiRRRGF0YXsiVmFsdWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VJbmZvUmlnaHQgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlTG9uZ1RleHQgLS0+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpdGxlIn06PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkPiA8cHJlPiRRRGF0YXsiTG9uZ1RleHQifTwvcHJlPjwvdGQ+CiAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VMb25nVGV4dCAtLT4KPC90YWJsZT4KCjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMTAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlTGlua2VkT2JqZWN0cyAtLT4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiTGlua2VkIE9iamVjdHMifToKICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUxpbmtUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPiRUZXh0eyIkRGF0YXsiTGlua1R5cGVOYW1lIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlTGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTGlua1N0cmcifTxicj4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlTGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUxpbmtUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VMaW5rZWRPYmplY3RzIC0tPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJPdmVydmlldyAtLT4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiSVRTTSBXb3Jrb3JkZXIifSAkVGV4dHsiT3ZlcnZpZXcifToKICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTYiPgogICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjI0MCI+CiAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+IzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiV29ya09yZGVyVGl0bGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiV29ya09yZGVyU3RhdGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGxhbm5lZFN0YXJ0VGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQbGFubmVkRW5kVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBY3R1YWxTdGFydFRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWN0dWFsRW5kVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlclJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJXcmFwcGVkV29ya09yZGVyVGl0bGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IldvcmtPcmRlclN0YXRlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJQbGFubmVkU3RhcnRUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJQbGFubmVkRW5kVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQWN0dWFsU3RhcnRUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJBY3R1YWxFbmRUaW0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlck92ZXJ2aWV3IC0tPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDaGFuZ2UgLS0+Cgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJzIC0tPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXIgLS0+Cgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJIZWFkbGluZSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JFFEYXRheyJIZWFkZXJBcmVhIn0jOiAkUURhdGF7IkhlYWRlclZhbHVlIn0gLyAkUURhdGF7IlRpdGxlIiwiMzAifTwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJIZWFkbGluZSAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjQwJSIvPgogICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjYwJSIvPgogICAgICAgICAgICAgICAgPC9jb2xncm91cD4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVySW5mb0xlZnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IktleSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiID4kUURhdGF7IlZhbHVlIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVySW5mb0xlZnQgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI0MCUiLz4KICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI2MCUiLz4KICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckluZm9SaWdodCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiS2V5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgPiRRRGF0YXsiVmFsdWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJJbmZvUmlnaHQgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPldvcmtvcmRlcjogJFFEYXRheyJUaXRsZSJ9PC90ZD4KICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckxvbmdUZXh0IC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJUaXRsZSJ9OjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZD4gPHByZT4kUURhdGF7IkxvbmdUZXh0In08L3ByZT48L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyTG9uZ1RleHQgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckxpbmtlZE9iamVjdHMgLS0+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgJFRleHR7IkxpbmtlZC1PYmplY3QifToKICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckxpbmtUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPiRUZXh0eyIkRGF0YXsiTGlua1R5cGVOYW1lIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyTGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTGlua1N0cmcifTxicj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyTGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckxpbmtUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJMaW5rZWRPYmplY3RzIC0tPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlcnMgLS0+Cg==
IyAtLQojIEFnZW50SVRTTUNoYW5nZVNlYXJjaC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTUNoYW5nZVNlYXJjaAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNQ2hhbmdlU2VhcmNoLmR0bCx2IDEuNDAgMjAxMC8wNy8wMSAxMzo1MjozMyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFKQVgifQoKJEluY2x1ZGV7IkFnZW50Q3VzdG9tZXJTZWFyY2gifQokSW5jbHVkZXsiQWdlbnRJVFNNVXNlclNlYXJjaCJ9Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoubXlBdXRvQ29tcGxldGUgewogICAgd2lkdGg6ICAgICAgICAgIDE3ZW07ICAgIC8qIHNldCB3aWR0aCBoZXJlIG9yIGVsc2Ugd2lkZ2V0IHdpbGwgZXhwYW5kIHRvIGZpdCBpdHMgY29udGFpbmVyICovCiAgICBwYWRkaW5nLWJvdHRvbTogMC41ZW07Cn0KPC9zdHlsZT4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KCi8vIGNsZWFyIENBQkN1c3RvbWVyCmZ1bmN0aW9uIGNsZWFyX2NhYl9jdXN0b21lcigpIHsKICAgIGRvY3VtZW50LmNvbXBvc2UuU2VsZWN0ZWRDdXN0b21lclVzZXIudmFsdWUgPSAiIjsKICAgIGRvY3VtZW50LmNvbXBvc2UuQ0FCQ3VzdG9tZXIudmFsdWUgICAgICAgICAgPSAiIjsKICAgIGRvY3VtZW50LmNvbXBvc2UuQ0FCQ3VzdG9tZXIuZm9jdXMoKTsKfQoKLy8gY2xlYXIgQ0FCQWdlbnQKZnVuY3Rpb24gY2xlYXJfY2FiX2FnZW50KCkgewogICAgZG9jdW1lbnQuY29tcG9zZS5TZWxlY3RlZFVzZXIxLnZhbHVlID0gIiI7CiAgICBkb2N1bWVudC5jb21wb3NlLkNBQkFnZW50LnZhbHVlID0gIiI7CiAgICBkb2N1bWVudC5jb21wb3NlLkNBQkFnZW50LmZvY3VzKCk7Cn0KCi8vIGRvIGluaXRpYWxpemF0aW9uIHdoZW4gdGhlIERPTSBpcyBmdWxseSBsb2FkZWQKZG9jdW1lbnQub2JzZXJ2ZSggImRvbTpsb2FkZWQiLCBmdW5jdGlvbigpIHsKCiAgICAvLyBjbGVhciB0aGUgQ0FCQWdlbnQgaW5wdXQgZmllbGQsIHdoZW4gaXQgZ2FpbnMgZm9jdXMKICAgICQoJ215QXV0b0NvbXBsZXRlSW5wdXQxJykub2JzZXJ2ZSgKICAgICAgICAnZm9jdXMnLAogICAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLnNldFZhbHVlKCcnKTsKICAgICAgICB9CiAgICApOwoKICAgIC8vIGNsZWFyIHRoZSBDQUJDdXN0b21lciBpbnB1dCBmaWVsZCwgd2hlbiBpdCBnYWlucyBmb2N1cwogICAgJCgnbXlBdXRvQ29tcGxldGVJbnB1dCcpLm9ic2VydmUoCiAgICAgICAgJ2ZvY3VzJywKICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSgnJyk7CiAgICAgICAgfQogICAgKTsKCjwhLS0gZHRsOmJsb2NrOlRpbWVTZWxlY3Rpb25KUyAtLT4KCiAgICAvLyByZWdpc3RlciBvbmNoYW5nZS1oYW5kbGVycyBmb3IgdGhlIFRpbWVQb2ludCBkcm9wZG93biBtZW51cwogICAgdmFyIFRpbWVQb2ludEVsZW1lbnRzID0gJCgiJFFEYXRheyJQcmVmaXgifVRpbWVTZWFyY2hUeXBlOjpUaW1lUG9pbnQiKS5hZGphY2VudCgnc2VsZWN0Jyk7CiAgICBUaW1lUG9pbnRFbGVtZW50cy5lYWNoKAogICAgICAgIGZ1bmN0aW9uKGVsZW0pIHsKICAgICAgICAgICAgZWxlbS5vYnNlcnZlKAogICAgICAgICAgICAgICAgJ2NsaWNrJywKICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoIiRRRGF0YXsiUHJlZml4In1UaW1lU2VhcmNoVHlwZTo6VGltZVBvaW50IikuY2hlY2tlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgKTsKCiAgICAvLyByZWdpc3RlciBvbmNoYW5nZS1oYW5kbGVycyBmb3IgdGhlIFRpbWVTbG90IGRyb3Bkb3duIG1lbnVzIGFuZCBjYWxlbmRhciBsaW5rcwogICAgdmFyIFRpbWVTbG90RWxlbWVudHMgID0gJCgiJFFEYXRheyJQcmVmaXgifVRpbWVTZWFyY2hUeXBlOjpUaW1lU2xvdCIpLmFkamFjZW50KCdzZWxlY3QsIGFbdGFyZ2V0PSJjYWxlbmRhciJdJyk7CiAgICBUaW1lU2xvdEVsZW1lbnRzLmVhY2goCiAgICAgICAgZnVuY3Rpb24oZWxlbSkgewogICAgICAgICAgICBlbGVtLm9ic2VydmUoCiAgICAgICAgICAgICAgICAnY2xpY2snLAogICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiJFFEYXRheyJQcmVmaXgifVRpbWVTZWFyY2hUeXBlOjpUaW1lU2xvdCIpLmNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICk7Cgo8IS0tIGR0bDpibG9jazpUaW1lU2VsZWN0aW9uSlMgLS0+Cn0gKTsKCi8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiU2VhcmNoIn06ICRUZXh0eyJJVFNNIENoYW5nZSJ9ICRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnIvPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaCIvPgo8IS0tICMjIEhpZGRlbkZpZWxkcyBmb3IgQ0FCQ3VzdG9tZXIgQXV0b2NvbXBsZXRpb24gIyMgLS0+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRDdXN0b21lclVzZXIifSIvPgo8IS0tICMjIEhpZGRlbkZpZWxkcyBmb3IgQ0FCQWdlbnQgQXV0b2NvbXBsZXRpb24gIyMgLS0+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZFVzZXIxIiAgICAgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRVc2VyMSJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJTZWFyY2hHcm91cHMxIiB2YWx1ZT0iIj4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI1MCUiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI1MCUiPgogICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn0sICRUZXh0eyJJVFNNIFdvcmtvcmRlciJ9ICRUZXh0eyJhbmQifSAkVGV4dHsiQ0FCIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iNTAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iNTAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn0gJFRleHR7IihlLmcuIDEwKjUxNTUgb3IgMTA1NjU4KikifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ2hhbmdlTnVtYmVyIiBzaXplPSIzMCIgdmFsdWU9IiRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0iLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDaGFuZ2VUaXRsZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDaGFuZ2VUaXRsZSIgc2l6ZT0iMzAiIHZhbHVlPSIkUURhdGF7IkNoYW5nZVRpdGxlIn0iLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJXb3JrT3JkZXJUaXRsZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXb3JrT3JkZXJUaXRsZSIgc2l6ZT0iMzAiIHZhbHVlPSIkUURhdGF7IldvcmtPcmRlclRpdGxlIn0iLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDQUJBZ2VudCJ9ICgkVGV4dHsiZS5nLiJ9IDIzNDIzMSk8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkNBQkFnZW50U2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQxIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibXlBdXRvQ29tcGxldGUxIiBjbGFzcz0ibXlBdXRvQ29tcGxldGUiPgo8IS0tIGR0bDpibG9jazpDQUJBZ2VudFNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0MSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9Im15QXV0b0NvbXBsZXRlSW5wdXQxIiB0eXBlPSJ0ZXh0IiBuYW1lPSJDQUJBZ2VudCIgdmFsdWU9IiRRRGF0YXsiQ0FCQWdlbnQifSIgc2l6ZT0iMzAiLz4KPCEtLSBkdGw6YmxvY2s6Q0FCQWdlbnRTZWFyY2hBdXRvQ29tcGxldGVEaXZFbmQxIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlQ29udGFpbmVyMSI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q0FCQWdlbnRTZWFyY2hBdXRvQ29tcGxldGVEaXZFbmQxIC0tPgo8IS0tIGR0bDpibG9jazpJbnZhbGlkQ0FCQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkQ0FCQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNBQkFnZW50U2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6VGFrZUNBQkFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz48aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDQUJBZ2VudDIiIHZhbHVlPSIkVGV4dHsiVGFrZSB0aGlzIENBQiBBZ2VudCJ9Ii8+CjwhLS0gZHRsOmJsb2NrOlRha2VDQUJBZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoVXNlckJ1dHRvbjEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDQUJBZ2VudDEiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0gJFRleHR7IkNBQiJ9ICRUZXh0eyJBZ2VudCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJDbGVhckNBQkFnZW50IiB2YWx1ZT0iJFRleHR7IkNsZWFyIn0gJFRleHR7IkNBQiJ9ICRUZXh0eyJBZ2VudCJ9IiBvbmNsaWNrPSJqYXZhc2NyaXB0OmNsZWFyX2NhYl9hZ2VudCgpOyByZXR1cm4gZmFsc2U7Ii8+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaFVzZXJCdXR0b24xIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDQUJDdXN0b21lciJ9ICgkVGV4dHsiZS5nLiJ9IFVTNDIzMSk8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkNBQkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlIiBjbGFzcz0ibXlBdXRvQ29tcGxldGUiPgo8IS0tIGR0bDpibG9jazpDQUJDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdlN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibXlBdXRvQ29tcGxldGVJbnB1dCIgdHlwZT0idGV4dCIgbmFtZT0iQ0FCQ3VzdG9tZXIiIHZhbHVlPSIkUURhdGF7IkNBQkN1c3RvbWVyIn0iIHNpemU9IjMwIi8+CjwhLS0gZHRsOmJsb2NrOkNBQkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlRGl2RW5kIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlQ29udGFpbmVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDQUJDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZURpdkVuZCAtLT4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZENBQkN1c3RvbWVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgo8IS0tIGR0bDpibG9jazpJbnZhbGlkQ0FCQ3VzdG9tZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkNBQkN1c3RvbWVyU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6VGFrZUNBQkN1c3RvbWVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz48aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDQUJDdXN0b21lcjIiIHZhbHVlPSIkVGV4dHsiVGFrZSB0aGlzIEN1c3RvbWVyIn0iLz4KPCEtLSBkdGw6YmxvY2s6VGFrZUNBQkN1c3RvbWVyIC0tPgo8IS0tIGR0bDpibG9jazpTZWFyY2hDdXN0b21lckJ1dHRvbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkV4cGFuZENBQkN1c3RvbWVyMSIgdmFsdWU9IiRUZXh0eyJTZWFyY2gifSAkVGV4dHsiQ0FCIn0gJFRleHR7IkN1c3RvbWVyIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkNsZWFyQ0FCQ3VzdG9tZXIiIHZhbHVlPSIkVGV4dHsiQ2xlYXIifSAkVGV4dHsiQ0FCIn0gJFRleHR7IkN1c3RvbWVyIn0iIG9uY2xpY2s9ImphdmFzY3JpcHQ6Y2xlYXJfY2FiX2N1c3RvbWVyKCk7IHJldHVybiBmYWxzZTsiLz4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoQ3VzdG9tZXJCdXR0b24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJGdWxsLVRleHQgU2VhcmNoIGluIENoYW5nZSBhbmQgV29ya29yZGVyIn0gKCRUZXh0eyJlLmcuIn0gIk1hcippbiIgJFRleHR7Im9yIn0gIkJhdWUqIik8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iNTAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iNTAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSVRTTSBDaGFuZ2UifSAkVGV4dHsiRGVzY3JpcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRGVzY3JpcHRpb24iIHNpemU9IjMwIiB2YWx1ZT0iJFFEYXRheyJEZXNjcmlwdGlvbiJ9Ii8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSVRTTSBDaGFuZ2UifSAkVGV4dHsiSnVzdGlmaWNhdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJKdXN0aWZpY2F0aW9uIiBzaXplPSIzMCIgdmFsdWU9IiRRRGF0YXsiSnVzdGlmaWNhdGlvbiJ9Ii8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSVRTTSBXb3Jrb3JkZXIifSAkVGV4dHsiSW5zdHJ1Y3Rpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iV29ya09yZGVySW5zdHJ1Y3Rpb24iIHNpemU9IjMwIiB2YWx1ZT0iJFFEYXRheyJXb3JrT3JkZXJJbnN0cnVjdGlvbiJ9Ii8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSVRTTSBXb3Jrb3JkZXIifSAkVGV4dHsiUmVwb3J0In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldvcmtPcmRlclJlcG9ydCIgc2l6ZT0iMzAiIHZhbHVlPSIkUURhdGF7IldvcmtPcmRlclJlcG9ydCJ9Ii8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dEFyZWEgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ2hhbmdlRnJlZVRleHQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI1MCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI1MCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQ2hhbmdlRnJlZUtleUZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDaGFuZ2VGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dEFyZWEgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0QXJlYSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJXb3JrT3JkZXJGcmVlVGV4dCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjUwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjUwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJXb3JrT3JkZXJGcmVlS2V5RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0QXJlYSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJJVFNNIENoYW5nZSJ9ICRUZXh0eyJQcmlvcml0eSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IklUU00gQ2hhbmdlIn0gJFRleHR7IkltcGFjdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+JERhdGF7IkNoYW5nZVByaW9yaXR5U2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kRGF0YXsiQ2hhbmdlSW1wYWN0U2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ2hhbmdlIENhdGVnb3J5In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ2hhbmdlU3RhdGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJDaGFuZ2VDYXRlZ29yeVNlbGVjdGlvblN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+JERhdGF7IkNoYW5nZVN0YXRlU2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ2hhbmdlTWFuYWdlciJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNoYW5nZUJ1aWxkZXIifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJDaGFuZ2VNYW5hZ2VyU2VsZWN0aW9uU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4kRGF0YXsiQ2hhbmdlQnVpbGRlclNlbGVjdGlvblN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNyZWF0ZWQgYnkifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJDcmVhdGVCeVNlbGVjdGlvblN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IldvcmtPcmRlclN0YXRlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiV29ya09yZGVyQWdlbnQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiREYXRheyJXb3JrT3JkZXJTdGF0ZVNlbGVjdGlvblN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+JERhdGF7IldvcmtPcmRlckFnZW50SURTZWxlY3Rpb25TdHJpbmcifSZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVNlbGVjdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyIkRGF0YXsiVGl0bGUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSIkUURhdGF7IlByZWZpeCJ9VGltZVNlYXJjaFR5cGU6Ok5vbmUiIG5hbWU9IiRRRGF0YXsiUHJlZml4In1UaW1lU2VhcmNoVHlwZSIgdmFsdWU9IiIgJERhdGF7IlRpbWVTZWFyY2hUeXBlOjpOb25lIn0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik5vIFhYWCBzZXR0aW5ncyIsICIkUURhdGF7IlRpdGxlIn0ifQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9IiRRRGF0YXsiUHJlZml4In1UaW1lU2VhcmNoVHlwZTo6VGltZVBvaW50IiBuYW1lPSIkUURhdGF7IlByZWZpeCJ9VGltZVNlYXJjaFR5cGUiIHZhbHVlPSJUaW1lUG9pbnQiICREYXRheyJUaW1lU2VhcmNoVHlwZTo6VGltZVBvaW50In0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiREYXRheyJUaXRsZSJ9In0gJERhdGF7IlRpbWVQb2ludFN0YXJ0In0gJERhdGF7IlRpbWVQb2ludCJ9ICREYXRheyJUaW1lUG9pbnRGb3JtYXQifQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9IiRRRGF0YXsiUHJlZml4In1UaW1lU2VhcmNoVHlwZTo6VGltZVNsb3QiIG5hbWU9IiRRRGF0YXsiUHJlZml4In1UaW1lU2VhcmNoVHlwZSIgdmFsdWU9IlRpbWVTbG90IiAkRGF0YXsiVGltZVNlYXJjaFR5cGU6OlRpbWVTbG90In0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiREYXRheyJUaXRsZSJ9In0gJFRleHR7ImJldHdlZW4ifSAkRGF0YXsiVGltZVN0YXJ0In0gJFRleHR7ImFuZCJ9ICREYXRheyJUaW1lU3RvcCJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUaW1lU2xvdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUaW1lU2xvdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lU2VsZWN0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWFyY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxici8+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTUNoYW5nZVRlbXBsYXRlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ2hhbmdlVGVtcGxhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVRlbXBsYXRlLmR0bCx2IDEuMTUgMjAxMC8wNi8yOSAxMjo1NjozMSBzYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKCiAgICAvLyBjaGVjayB0aGUgdGVtcGxhdGUgbmFtZSwgYWxsIHdoaXRlc3BhY2UgY291bnRzIGFzIGVtcHR5CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UZW1wbGF0ZU5hbWUudmFsdWUubWF0Y2goL15ccyokLykpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSB0ZW1wbGF0ZSBtdXN0IGhhdmUgYSBuYW1lISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UZW1wbGF0ZU5hbWUuZm9jdXMoKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9CgovLy0tPgo8L3NjcmlwdD4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7IlNhdmUgQ2hhbmdlIGFzIHRlbXBsYXRlIn0gOiAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICREYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJDaGFuZ2VUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiU2F2ZSBDaGFuZ2UgYXMgdGVtcGxhdGUifSA6ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJERhdGF7IkNoYW5nZU51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IkNoYW5nZVRpdGxlIiwiNzAifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdENoYW5nZVZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgICAgdmFsdWU9IkFkZFRlbXBsYXRlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNoYW5nZUlEIiAgICAgdmFsdWU9IiRRRGF0YXsiQ2hhbmdlSUQifSI+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlNhdmUgQ2hhbmdlIGFzIHRlbXBsYXRlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiVGVtcGxhdGUgTmFtZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGVtcGxhdGVOYW1lIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZU5hbWUifSIgc2l6ZT0iNzAiIG1heGxlbmd0aD0iMjUwIj4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlTmFtZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUZW1wbGF0ZU5hbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ29tbWVudCJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI3MCIgbWF4bGVuZ3RoPSIyNTAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlJlc2V0IFN0YXRlcyJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlN0YXRlUmVzZXQiIHZhbHVlPSIxIiAkUURhdGF7IlN0YXRlUmVzZXQifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRTZWxlY3Rpb25TdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgaWQ9InN1Ym1pdEFkZFRlbXBsYXRlIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgbmFtZT0iQWRkVGVtcGxhdGUiIHZhbHVlPSIkVGV4dHsiQWRkIn0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTUNoYW5nZVRpbWVTbG90LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ2hhbmdlVGltZVNsb3QKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUNoYW5nZVRpbWVTbG90LmR0bCx2IDEuMTUgMjAxMC8wMi8wNCAxMjowNDo1NiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiRJbmNsdWRleyJBSkFYIn0KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpKYXZhU2NyaXB0UGF0aCJ9aXRzbS1jaGFuZ2VtYW5hZ2VtZW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKCiAgICAvLyBjaGVjayBzYW5pdHkgb2YgbW92ZSB0aW1lCiAgICAvLyAyMDEwLTAxLTMyIGlzIHJlamVjdGVkLCBidXQgMjAxMC0wMi0zMSBpcyBhbGxvd2VkCiAgICAvLyBhbiBleGFjdCB0aW1lIGNoZWNrIGlzIHBlcmZvcm1lZCBvbiB0aGUgc2VydmVyc2lkZQogICAgaWYgKCAhQ2hlY2tUaW1lKCAnTW92ZVRpbWUnICkgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRoZSBwbGFubmVkIHRpbWUgaXMgaW52YWxpZCEifScpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KCi8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiTW92ZSBUaW1lIFNsb3QifSAkQ29uZmlneyJJVFNNQ2hhbmdlOjpIb29rIn06ICREYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0iPgogICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJNb3ZlIFRpbWUgU2xvdCJ9ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJERhdGF7IkNoYW5nZU51bWJlciJ9ICRFbnZ7IkJveDEifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdENoYW5nZVZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ik1vdmVUaW1lU2xvdCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFuZ2VJRCIgIHZhbHVlPSIkUURhdGF7IkNoYW5nZUlEIn0iPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJNb3ZlIFRpbWUgU2xvdCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjEzMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRpbWVUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRpbWVUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgdGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJNb3ZlVGltZVNlbGVjdGlvblN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRNb3ZlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRNb3ZlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0TW92ZVRpbWVTbG90IiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgbmFtZT0iTW92ZVRpbWVTbG90IiB2YWx1ZT0iJFRleHR7Ik1vdmUifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTUNoYW5nZVpvb20uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01DaGFuZ2Vab29tCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01DaGFuZ2Vab29tLmR0bCx2IDEuNTMgMjAxMC8wNi8yMiAwMTo0ODozOCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiWm9vbSJ9ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJDaGFuZ2VUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiWm9vbSJ9ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJDaGFuZ2VUaXRsZSIsIjcwIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgICAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iIHRpdGxlPSIkVGV4dHsiJERhdGF7IkRlc2NyaXB0aW9uIn0ifSI+JFRleHR7IiREYXRheyJOYW1lIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjUlIiBjbGFzcz0ibWVudSI+PC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPGNvbGdyb3VwPgogICAgICAgIDxjb2wgd2lkdGg9Ijc1JSI+CiAgICAgICAgPGNvbCB3aWR0aD0iMjUlIj4KICAgIDwvY29sZ3JvdXA+CiAgICA8dHI+CiAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckdyYXBoIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IldvcmtPcmRlckdyYXBoIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyR3JhcGggLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxociBzaXplPSIyIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIj4KICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiRGVzY3JpcHRpb24ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGVzY3JpcHRpb24ifTombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJEZXNjcmlwdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+PC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiSnVzdGlmaWNhdGlvbiJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJKdXN0aWZpY2F0aW9uIn06Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSnVzdGlmaWNhdGlvbiJ9CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+PC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IkF0dGFjaG1lbnQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQXR0YWNobWVudCJ9OiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjI1MCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249RG93bmxvYWRBdHRhY2htZW50O0ZpbGVJRD0kUURhdGF7IkZpbGVJRCJ9O0NoYW5nZUlEPSRRRGF0YXsiQ2hhbmdlSUQifSI+PGltZyBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRpc2stcy5wbmciIGJvcmRlcj0iMCIgYWx0PSJEb3dubG9hZCIgdGl0bGU9IkRvd25sb2FkIi8+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiREYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CjwhLS0gZW1wdHkgcm93LCBmb3IgaGF2aW5nIGEgdmFsaWQgSFRNTCB0YWJsZSBpbiB0aGUgYWJzZW5jZSBvZiBhdHRhY2htZW50cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQgY29sc3Bhbj0iMyI+PC90ZD48L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPjwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZUNvbXBsZXggLS0+CiAgICAgICAgICAgIDxociBzaXplPSIyIj4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9Ijk4JSIgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkxpbmtUYWJsZVN0cmcifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZUNvbXBsZXggLS0+CiAgICAgICAgPC90ZD4KICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJDaGFuZ2VTdGF0ZSJ9OiA8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJERhdGF7IkNoYW5nZVN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiREYXRheyJDaGFuZ2VTdGF0ZSJ9In0mbmJzcDsmbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkNoYW5nZVN0YXRlU2lnbmFsIn0ucG5nIiB0aXRsZT0iJFRleHR7IiREYXRheyJDaGFuZ2VTdGF0ZSJ9In0iIGFsdD0iJFRleHR7IiREYXRheyJDaGFuZ2VTdGF0ZSJ9In0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJQbGFubmVkU3RhcnRUaW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkVtcHR5UGxhbm5lZFN0YXJ0VGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+LTwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eVBsYW5uZWRTdGFydFRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlBsYW5uZWRTdGFydFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiUGxhbm5lZFN0YXJ0VGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IlBsYW5uZWRTdGFydFRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpQbGFubmVkU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IlBsYW5uZWRFbmRUaW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkVtcHR5UGxhbm5lZEVuZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9Ii0iPi08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6RW1wdHlQbGFubmVkRW5kVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6UGxhbm5lZEVuZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiUGxhbm5lZEVuZFRpbWUifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZUxvbmd7IiREYXRheyJQbGFubmVkRW5kVGltZSJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlBsYW5uZWRFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkFjdHVhbFN0YXJ0VGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPgo8IS0tIGR0bDpibG9jazpFbXB0eUFjdHVhbFN0YXJ0VGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+LTwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eUFjdHVhbFN0YXJ0VGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6QWN0dWFsU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkFjdHVhbFN0YXJ0VGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkFjdHVhbFN0YXJ0VGltZSJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkFjdHVhbFN0YXJ0VGltZSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJBY3R1YWxFbmRUaW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkVtcHR5QWN0dWFsRW5kVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+LTwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eUFjdHVhbEVuZFRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOkFjdHVhbEVuZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQWN0dWFsRW5kVGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkFjdHVhbEVuZFRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpBY3R1YWxFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1ZXN0ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJSZXF1ZXN0ZWQgKGJ5IGN1c3RvbWVyKSBEYXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiUmVxdWVzdGVkVGltZSJ9Ij4kVGltZUxvbmd7IiREYXRheyJSZXF1ZXN0ZWRUaW1lIn0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1ZXN0ZWRUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpFbXB0eVJlcXVlc3RlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IlJlcXVlc3RlZCAoYnkgY3VzdG9tZXIpIERhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+LTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpFbXB0eVJlcXVlc3RlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTaG93UGxhbm5lZEVmZm9ydCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlBsYW5uZWRFZmZvcnQifTogPC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpFbXB0eVBsYW5uZWRFZmZvcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6RW1wdHlQbGFubmVkRWZmb3J0IC0tPgo8IS0tIGR0bDpibG9jazpQbGFubmVkRWZmb3J0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlBsYW5uZWRFZmZvcnQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlBsYW5uZWRFZmZvcnQifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6UGxhbm5lZEVmZm9ydCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2hvd1BsYW5uZWRFZmZvcnQgLS0+CjwhLS0gZHRsOmJsb2NrOlNob3dBY2NvdW50ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQWNjb3VudGVkVGltZSJ9OiA8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkVtcHR5QWNjb3VudGVkVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eUFjY291bnRlZFRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOkFjY291bnRlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQWNjb3VudGVkVGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQWNjb3VudGVkVGltZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpBY2NvdW50ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTaG93QWNjb3VudGVkVGltZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNhdGVnb3J5IC0tPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDYXRlZ29yeSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJERhdGF7IkNhdGVnb3J5In0ifSI+JFRleHR7IiREYXRheyJDYXRlZ29yeSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Q2F0ZWdvcnkgLS0+CjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkRGF0YXsiSW1wYWN0In0ifSI+JFRleHR7IiREYXRheyJJbXBhY3QifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9Ij4kVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CgojIHNob3cgQ2hhbmdlRnJlZUtleSBhbmQgQ2hhbmdlRnJlZVRleHQgZmllbGRzCjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRRRGF0YXsiQ2hhbmdlRnJlZUtleSIsIjI1In06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0UGxhaW4gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlRnJlZVRleHQifSI+JFFEYXRheyJDaGFuZ2VGcmVlVGV4dCIsIjI1In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHRQbGFpbiAtLT4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHRMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZUZyZWVUZXh0In0iPjxhIGhyZWY9IiREYXRheyJDaGFuZ2VGcmVlVGV4dExpbmsifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiQ2hhbmdlRnJlZVRleHQiLCIyNSJ9PC9hPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dExpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0IC0tPgo8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dFNwYWNlciAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0U3BhY2VyIC0tPgoKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGV4YW1wbGUgZm9yIGN1c3RvbWl6YXRpb24gb2Ygc2luZ2xlIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHQxIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRRRGF0YXsiQ2hhbmdlRnJlZUtleTEiLCIyNSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CiM8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dFBsYWluMSAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VGcmVlVGV4dDEifSI+JFFEYXRheyJDaGFuZ2VGcmVlVGV4dDEiLCIyNSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dFBsYWluMSAtLT4KIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0TGluazEgLS0+CiMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlRnJlZVRleHQxIn0iPjxhIGhyZWY9IiRDb25maWd7IkNoYW5nZUZyZWVUZXh0TGluazEifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiQ2hhbmdlRnJlZVRleHQxIiwiMjUifTwvYT48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0TGluazEgLS0+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0MSAtLT4KIwojPCEtLSBkdGw6YmxvY2s6Q2hhbmdlRnJlZVRleHQyIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRRRGF0YXsiQ2hhbmdlRnJlZUtleTIiLCIyNSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CiM8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dFBsYWluMiAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VGcmVlVGV4dDIifSI+JFFEYXRheyJDaGFuZ2VGcmVlVGV4dDIiLCIyNSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpDaGFuZ2VGcmVlVGV4dFBsYWluMiAtLT4KIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0TGluazIgLS0+CiMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlRnJlZVRleHQyIn0iPjxhIGhyZWY9IiRDb25maWd7IkNoYW5nZUZyZWVUZXh0TGluazIifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiQ2hhbmdlRnJlZVRleHQyIiwiMjUifTwvYT48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0TGluazIgLS0+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkNoYW5nZUZyZWVUZXh0MiAtLT4KIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDaGFuZ2UgSW5pdGlhdG9yKHMpIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkVtcHR5Q2hhbmdlSW5pdGlhdG9ycyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+LTwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eUNoYW5nZUluaXRpYXRvcnMgLS0+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUluaXRpYXRvckV4aXN0cyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2UgSW5pdGlhdG9ycyJ9Ij4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlSW5pdGlhdG9yIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDaGFuZ2VJbml0aWF0b3IgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDaGFuZ2VJbml0aWF0b3JFeGlzdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNoYW5nZU1hbmFnZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6RW1wdHlDaGFuZ2VNYW5hZ2VyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSItIj4tPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVtcHR5Q2hhbmdlTWFuYWdlciAtLT4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlTWFuYWdlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VNYW5hZ2VyVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZU1hbmFnZXJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZU1hbmFnZXJVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNoYW5nZU1hbmFnZXJVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VNYW5hZ2VyVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VNYW5hZ2VyVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q2hhbmdlTWFuYWdlciAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ2hhbmdlQnVpbGRlciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZUJ1aWxkZXJVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZUJ1aWxkZXJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZUJ1aWxkZXJVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDQUIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6RW1wdHlDQUIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9Ii0iPi08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6RW1wdHlDQUIgLS0+CjwhLS0gZHRsOmJsb2NrOkNBQiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2UgQWR2aXNvcnkgQm9hcmQifSI+CjwhLS0gZHRsOmJsb2NrOkNBQkFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDQUJBZ2VudFVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDQUJBZ2VudFVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ0FCQWdlbnRVc2VyTGFzdG5hbWUifSJ9KSI+JFFEYXRheyJDQUJBZ2VudFVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNBQkFnZW50VXNlckZpcnN0bmFtZSJ9ICREYXRheyJDQUJBZ2VudFVzZXJMYXN0bmFtZSJ9IiwiMTUifSk8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q0FCQWdlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOkNBQkN1c3RvbWVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDQUJDdXN0b21lclVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDQUJDdXN0b21lclVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ0FCQ3VzdG9tZXJVc2VyTGFzdG5hbWUifSJ9KSI+JFFEYXRheyJDQUJDdXN0b21lclVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNBQkN1c3RvbWVyVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDQUJDdXN0b21lclVzZXJMYXN0bmFtZSJ9IiwiMTUifSk8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q0FCQ3VzdG9tZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDQUIgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDcmVhdGVVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCBieSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVTaW1wbGUgLS0+CiAgICAgICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTVRlbXBsYXRlRGVsZXRlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNVGVtcGxhdGVEZWxldGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVRlbXBsYXRlRGVsZXRlLmR0bCx2IDEuNSAyMDEwLzA0LzI3IDIwOjQyOjM1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJEVudnsiQm94MCJ9ICRUZXh0eyJEZWxldGUifSAkVGV4dHsiVGVtcGxhdGUifSAkUURhdGF7Ik5hbWUifSAkRW52eyJCb3gxIn0iPgogICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJEZWxldGUifSAkVGV4dHsiVGVtcGxhdGUifSAkUURhdGF7Ik5hbWUifSAkRW52eyJCb3gxIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5UZW1wbGF0ZXMifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjM1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGVsZXRlIn0gJFRleHR7IlRlbXBsYXRlIn0gJFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMzAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2w+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5hbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbW1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNvbW1lbnQiLCAiNDAifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgdGVtcGxhdGU/In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjEwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IkFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJObyJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVEZWxldGUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSIkUURhdGF7IlRlbXBsYXRlSUQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJZZXMifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTVRlbXBsYXRlRWRpdC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTVRlbXBsYXRlRWRpdAojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVFZGl0LmR0bCx2IDEuNSAyMDEwLzA0LzI3IDIwOjQyOjM1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewoKICAgIC8vIGNoZWNrIHRoZSB0ZW1wbGF0ZSBuYW1lLCBhbGwgd2hpdGVzcGFjZSBjb3VudHMgYXMgZW1wdHkKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRlbXBsYXRlTmFtZS52YWx1ZS5tYXRjaCgvXlxzKiQvKSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHRlbXBsYXRlIG11c3QgaGF2ZSBhIG5hbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRlbXBsYXRlTmFtZS5mb2N1cygpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KCi8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiRWRpdCJ9ICRUZXh0eyIkUURhdGF7IlR5cGUifSJ9ICRUZXh0eyJUZW1wbGF0ZSJ9ICRRRGF0YXsiTmFtZSJ9ICRFbnZ7IkJveDEifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IkVkaXQifSAkVGV4dHsiJFFEYXRheyJUeXBlIn0ifSAkVGV4dHsiVGVtcGxhdGUifSAkUURhdGF7Ik5hbWUifSAkRW52eyJCb3gxIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5UZW1wbGF0ZXMifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iICB2YWx1ZT0iVXBkYXRlVGVtcGxhdGUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVJRCJ9Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRWRpdCBUZW1wbGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjEzMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlRlbXBsYXRlIE5hbWUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRlbXBsYXRlTmFtZSIgdmFsdWU9IiRRRGF0YXsiVGVtcGxhdGVOYW1lIn0iIHNpemU9IjcwIiBtYXhsZW5ndGg9IjI1MCI+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUZW1wbGF0ZU5hbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkVGVtcGxhdGVOYW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNvbW1lbnQifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNzAiIG1heGxlbmd0aD0iMjUwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZFNlbGVjdGlvblN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0RWRpdFRlbXBsYXRlIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgbmFtZT0iRWRpdFRlbXBsYXRlIiB2YWx1ZT0iJFRleHR7IlNhdmUifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdOYXZCYXIuZHRsIC0gaHRtbCBmb3IgdGVtcGxhdGUgb3ZlcnZpZXcgdGFibGUKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdOYXZCYXIuZHRsLHYgMS42IDIwMTAvMDIvMDMgMTM6MTM6MTcgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCjxhIG5hbWU9InN1Ym5hdiI+PC9hPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhciAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiJFFEYXRheyJUaXRsZU5hbWUifSJ9OiAkVGV4dHsiJFFEYXRheyJUaXRsZVZhbHVlIn0ifSAkRW52eyJCb3gxIn0KICAgICAgICA8L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJNYWluIC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgICRUZXh0eyIkUURhdGF7Ik1haW5OYW1lIn0ifTogJERhdGF7Ik1haW5Db250ZW50In0KICAgICAgICA8L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJNYWluIC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOTAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJGaWx0ZXIifToKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9OyREYXRheyJGaWx0ZXJMaW5rIn1GaWx0ZXI9JExRRGF0YXsiRmlsdGVyIn0iIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZSI+PGI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In0gKCRRRGF0YXsiQ291bnQifSk8L2I+PC9hPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZCAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTskRGF0YXsiRmlsdGVyTGluayJ9RmlsdGVyPSRMUURhdGF7IkZpbHRlciJ9Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifSAoJFFEYXRheyJDb3VudCJ9KTwvYT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNwbGl0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyUGFnZUJhY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTskRGF0YXsiTGlua0JhY2sifSI+JFRleHR7IkNoYW5nZSBzZWFyY2ggb3B0aW9ucyJ9PC9hPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclBhZ2VCYWNrIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclBhZ2VOYXZCYXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJUZW1wbGF0ZXMifTogJERhdGF7IlJlc3VsdCJ9ICRUZXh0eyJvZiJ9ICREYXRheyJUb3RhbEhpdHMifSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJQYWdlIn06ICREYXRheyJTaXRlTmF2QmFyIn0KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJQYWdlTmF2QmFyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclZpZXdNb2RlIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclZpZXdNb2RlU2VsZWN0ZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtGaWx0ZXI9JExRRGF0YXsiRmlsdGVyIn07Vmlldz0kTFFEYXRheyJWaWV3In07JERhdGF7IkxpbmtGaWx0ZXIifSNzdWJuYXYiIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJOYW1lIn0ifSI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJJbWFnZVNlbGVjdGVkIn0iIGFsdD0iJFRleHR7IiRRRGF0YXsiTmFtZSJ9In0iLz48L2E+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyVmlld01vZGVTZWxlY3RlZCAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZU5vdFNlbGVjdGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07RmlsdGVyPSRMUURhdGF7IkZpbHRlciJ9O1ZpZXc9JExRRGF0YXsiVmlldyJ9OyREYXRheyJMaW5rRmlsdGVyIn0jc3VibmF2IiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiTmFtZSJ9In0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiSW1hZ2UifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJOYW1lIn0ifSIvPjwvYT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZU5vdFNlbGVjdGVkIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclZpZXdNb2RlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXIgLS0+Cg==
IyAtLQojIEFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdOYXZCYXJTbWFsbC5kdGwgLSBodG1sIGZvciB0ZW1wbGF0ZSBvdmVydmlldyB0YWJsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlld05hdkJhclNtYWxsLmR0bCx2IDEuNCAyMDEwLzAxLzIyIDExOjM1OjE2IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhciAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI5MCUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclBhZ2VOYXZCYXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJUZW1wbGF0ZXMifTogJERhdGF7IlJlc3VsdCJ9ICRUZXh0eyJvZiJ9ICREYXRheyJUb3RhbEhpdHMifSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJQYWdlIn06ICREYXRheyJTaXRlTmF2QmFyIn0KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJQYWdlTmF2QmFyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRmlsdGVyIn06CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTskRGF0YXsiRmlsdGVyTGluayJ9RmlsdGVyPSRMUURhdGF7IkZpbHRlciJ9IiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmUiPjxiPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9ICgkUURhdGF7IkNvdW50In0pPC9iPjwvYT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07JERhdGF7IkZpbHRlckxpbmsifUZpbHRlcj0kTFFEYXRheyJGaWx0ZXIifSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In0gKCRRRGF0YXsiQ291bnQifSk8L2E+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90IC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TcGxpdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlckl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhckZpbHRlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZVNlbGVjdGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07RmlsdGVyPSRMUURhdGF7IkZpbHRlciJ9O1ZpZXc9JExRRGF0YXsiVmlldyJ9I3N1Ym5hdiIgdGl0bGU9IiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0kUURhdGF7IkltYWdlU2VsZWN0ZWQifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJOYW1lIn0ifSIvPjwvYT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZVNlbGVjdGVkIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclZpZXdNb2RlTm90U2VsZWN0ZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtGaWx0ZXI9JExRRGF0YXsiRmlsdGVyIn07Vmlldz0kTFFEYXRheyJWaWV3In0jc3VibmF2IiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiTmFtZSJ9In0iPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiSW1hZ2UifSIgYWx0PSIkVGV4dHsiJFFEYXRheyJOYW1lIn0ifSIvPjwvYT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJWaWV3TW9kZU5vdFNlbGVjdGVkIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld05hdkJhclZpZXdNb2RlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXJNYWluIC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJNYWluTmFtZSJ9In06ICREYXRheyJNYWluQ29udGVudCJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TmF2QmFyTWFpbiAtLT4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdOYXZCYXIgLS0+Cg==
IyAtLQojIEFnZW50SVRTTVRlbXBsYXRlT3ZlcnZpZXdTbWFsbC5kdGwgLSBodG1sIGZvciB0ZW1wbGF0ZSBvdmVydmlldyB0YWJsZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVGVtcGxhdGVPdmVydmlld1NtYWxsLmR0bCx2IDEuOCAyMDEwLzA0LzI3IDIwOjQyOjM1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0ibGVmdCI+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFRlbXBsYXRlSURIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJUZW1wbGF0ZUlEIn08L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRUZW1wbGF0ZUlESGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmROYW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiTmFtZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9OyREYXRheyJMaW5rU29ydCJ9O1NvcnRCeT1OYW1lO09yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4gLwogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07JERhdGF7IkxpbmtTb3J0In07U29ydEJ5PU5hbWU7T3JkZXJCeT1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmROYW1lSGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRUeXBlSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiVHlwZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9OyREYXRheyJMaW5rU29ydCJ9O1NvcnRCeT1UZW1wbGF0ZVR5cGVJRDtPcmRlckJ5PURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9dXAtc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJ1cCJ9Ij48L2E+IC8KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9OyREYXRheyJMaW5rU29ydCJ9O1NvcnRCeT1UZW1wbGF0ZVR5cGVJRDtPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFR5cGVIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENvbW1lbnRIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDb21tZW50In08L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDb21tZW50SGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRWYWxpZEhlYWRlciAtLT4KICAgICAgICAgICAgICAgICAgICA8dGg+JFRleHR7IlZhbGlkIn08YnIvPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07JERhdGF7IkxpbmtTb3J0In07U29ydEJ5PVZhbGlkSUQ7T3JkZXJCeT1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiAvCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTskRGF0YXsiTGlua1NvcnQifTtTb3J0Qnk9VmFsaWRJRDtPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZFZhbGlkSGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmREZWxldGVIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoIGFsaWduPSJjZW50ZXIiPiRUZXh0eyJEZWxldGUifTwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZERlbGV0ZUhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ3JlYXRlQnlIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDcmVhdGVCeSJ9PC90aD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ3JlYXRlQnlIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENyZWF0ZVRpbWVIZWFkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDcmVhdGVUaW1lIn08YnIvPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07JERhdGF7IkxpbmtTb3J0In07U29ydEJ5PUNyZWF0ZVRpbWU7T3JkZXJCeT1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifXVwLXNtYWxsLnBuZyIgYWx0PSIkVGV4dHsidXAifSI+PC9hPiAvCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTskRGF0YXsiTGlua1NvcnQifTtTb3J0Qnk9Q3JlYXRlVGltZTtPcmRlckJ5PVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZG93bi1zbWFsbC5wbmciIGFsdD0iJFRleHR7ImRvd24ifSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENyZWF0ZVRpbWVIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZUJ5SGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQ2hhbmdlQnkifTwvdGg+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZUJ5SGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VUaW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDx0aD4kVGV4dHsiQ2hhbmdlVGltZSJ9PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iT3ZlcnZpZXdDb250cm9sIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9OyREYXRheyJMaW5rU29ydCJ9O1NvcnRCeT1DaGFuZ2VUaW1lO09yZGVyQnk9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn11cC1zbWFsbC5wbmciIGFsdD0iJFRleHR7InVwIn0iPjwvYT4gLwogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07JERhdGF7IkxpbmtTb3J0In07U29ydEJ5PUNoYW5nZVRpbWU7T3JkZXJCeT1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifWRvd24tc21hbGwucG5nIiBhbHQ9IiRUZXh0eyJkb3duIn0iPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RoPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VUaW1lSGVhZGVyIC0tPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkIC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgo8IS0tIGR0bDpibG9jazpSZWNvcmRUZW1wbGF0ZUlEIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUZW1wbGF0ZUlEIn0iPiRRRGF0YXsiVGVtcGxhdGVJRCIsIjQwIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRUZW1wbGF0ZUlEIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmROYW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01UZW1wbGF0ZUVkaXQ7VGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkVkaXQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIHRpdGxlPSIkUURhdGF7Ik5hbWUifSAoSUQ9JFFEYXRheyJUZW1wbGF0ZUlEIn0pIj4kUURhdGF7Ik5hbWUifTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmROYW1lIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiVHlwZSJ9In0gKElEPSRRRGF0YXsiVHlwZUlEIn0pIj4kVGV4dHsiJFFEYXRheyJUeXBlIiwiNDAifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ29tbWVudCAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ29tbWVudCJ9Ij4kUURhdGF7IkNvbW1lbnQiLCI0MCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ29tbWVudCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkVmFsaWQgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiJFFEYXRheyJWYWxpZCJ9In0iPiRUZXh0eyIkUURhdGF7IlZhbGlkIiwiNDAifSJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkVmFsaWQgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZERlbGV0ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNVGVtcGxhdGVEZWxldGU7VGVtcGxhdGVJRD0kUURhdGF7IlRlbXBsYXRlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkRlbGV0ZSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgdGl0bGU9IkRlbGV0ZTogJFFEYXRheyJOYW1lIn0iPng8L2E+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkRGVsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDcmVhdGVCeSAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ3JlYXRlQnlVc2VyTG9naW4ifSAkUURhdGF7IkNyZWF0ZUJ5TGVmdFBhcmVudGhlc2lzIn0kUURhdGF7IkNyZWF0ZUJ5VXNlckZpcnN0bmFtZSJ9ICRRRGF0YXsiQ3JlYXRlQnlVc2VyTGFzdG5hbWUifSRRRGF0YXsiQ3JlYXRlQnlSaWdodFBhcmVudGhlc2lzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDcmVhdGVCeVVzZXJMb2dpbiIsIjE1In0gJFFEYXRheyJDcmVhdGVCeUxlZnRQYXJlbnRoZXNpcyJ9JFF1b3RleyIkRGF0YXsiQ3JlYXRlQnlVc2VyRmlyc3RuYW1lIn0iLCAiMTUifSAkUXVvdGV7IiREYXRheyJDcmVhdGVCeVVzZXJMYXN0bmFtZSJ9IiwiMTUifSRRRGF0YXsiQ3JlYXRlQnlSaWdodFBhcmVudGhlc2lzIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ3JlYXRlQnkgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENyZWF0ZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNyZWF0ZVRpbWUifSI+JFFEYXRheyJDcmVhdGVUaW1lIiwiNDAifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENyZWF0ZVRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlJlY29yZENoYW5nZUJ5IC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VCeVVzZXJMb2dpbiJ9ICRRRGF0YXsiQ2hhbmdlQnlMZWZ0UGFyZW50aGVzaXMifSRRRGF0YXsiQ2hhbmdlQnlVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJDaGFuZ2VCeVVzZXJMYXN0bmFtZSJ9JFFEYXRheyJDaGFuZ2VCeVJpZ2h0UGFyZW50aGVzaXMifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNoYW5nZUJ5VXNlckxvZ2luIiwiMTUifSAkUURhdGF7IkNoYW5nZUJ5TGVmdFBhcmVudGhlc2lzIn0kUXVvdGV7IiREYXRheyJDaGFuZ2VCeVVzZXJGaXJzdG5hbWUifSIsICIxNSJ9ICRRdW90ZXsiJERhdGF7IkNoYW5nZUJ5VXNlckxhc3RuYW1lIn0iLCIxNSJ9JFFEYXRheyJDaGFuZ2VCeVJpZ2h0UGFyZW50aGVzaXMifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpSZWNvcmRDaGFuZ2VCeSAtLT4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlVGltZSJ9Ij4kUURhdGF7IkNoYW5nZVRpbWUiLCI0MCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6UmVjb3JkQ2hhbmdlVGltZSAtLT4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlY29yZCAtLT4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSIkUURhdGF7IkNvbHVtbkNvdW50In0iPgogICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTVVzZXJTZWFyY2guZHRsIC0gcHJvdmlkZXMgYXV0b2NvbXBsZXRlIGZlYXR1cmUgZm9yIGN1c3RvbWVyIHNlYXJjaAojIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNVXNlclNlYXJjaC5kdGwsdiAxLjYgMjAwOS8xMi8wMyAxMToxNToyNyBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOlVzZXJTZWFyY2hBdXRvQ29tcGxldGUgLS0+Cgo8IS0tQ1NTIGZpbGUgKGRlZmF1bHQgWVVJIFNhbSBTa2luKSAtLT4KPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2F1dG9jb21wbGV0ZS9hc3NldHMvc2tpbnMvc2FtL2F1dG9jb21wbGV0ZS5jc3MiPgoKPCEtLSBEZXBlbmRlbmNpZXMgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC95YWhvby1kb20tZXZlbnQveWFob28tZG9tLWV2ZW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2RhdGFzb3VyY2UvZGF0YXNvdXJjZS1taW4uanMiPjwvc2NyaXB0PgoKPCEtLSBPUFRJT05BTDogQ29ubmVjdGlvbiAocmVxdWlyZWQgb25seSBpZiB1c2luZyBYSFJEYXRhU291cmNlKSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OllVSVBhdGgifWJ1aWxkL2Nvbm5lY3Rpb24vY29ubmVjdGlvbi1taW4uanMiPjwvc2NyaXB0PgoKPCEtLSBPUFRJT05BTDogQW5pbWF0aW9uIChyZXF1aXJlZCBvbmx5IGlmIGVuYWJsaW5nIGFuaW1hdGlvbikgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9hbmltYXRpb24vYW5pbWF0aW9uLW1pbi5qcyI+PC9zY3JpcHQ+Cgo8IS0tIE9QVElPTkFMOiBKU09OIChlbmFibGVzIEpTT04gdmFsaWRhdGlvbikgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9qc29uL2pzb24tbWluLmpzIj48L3NjcmlwdD4KCjwhLS0gU291cmNlIGZpbGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpZVUlQYXRoIn1idWlsZC9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLW1pbi5qcyI+PC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgooZnVuY3Rpb24oKSB7CgogICAgdmFyIERvbSA9IFlBSE9PLnV0aWwuRG9tLAogICAgICAgIEV2ZW50ID0gWUFIT08udXRpbC5FdmVudDsKCiAgICBFdmVudC5vbkRPTVJlYWR5KGZ1bmN0aW9uKCkgewoKICAgICAgICAvLyBhZGQgeXVpIGNzcyB0byBib2R5IHRhZwogICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NOYW1lID0gInl1aS1za2luLXNhbSI7Cgo8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlQ29kZSAtLT4KICAgICAgICAvLyBkZWZpbmUgWEhSRGF0YVNvdXJjZSBmb3IgYXV0b2NvbXBsZXRlIG9iamVjdAogICAgICAgIHZhciBteURhdGFTb3VyY2UkRGF0YXsiSW5wdXROciJ9ID0gbmV3IFlBSE9PLnV0aWwuWEhSRGF0YVNvdXJjZSgnJyk7CiAgICAgICAgbXlEYXRhU291cmNlJERhdGF7IklucHV0TnIifS5yZXNwb25zZVR5cGUgPSBZQUhPTy51dGlsLlhIUkRhdGFTb3VyY2UuVFlQRV9KU09OOwogICAgICAgIG15RGF0YVNvdXJjZSREYXRheyJJbnB1dE5yIn0ubWF4Q2FjaGVFbnRyaWVzID0gMTAwOwogICAgICAgIG15RGF0YVNvdXJjZSREYXRheyJJbnB1dE5yIn0uY29ublhock1vZGUgPSAnY2FuY2VsU3RhbGVSZXF1ZXN0cyc7CgogICAgICAgIC8vIGRlZmluZSB0aGUgc2NoZW1hIG9mIHRoZSByZXN1bHRzIGZvciBhdXRvY29tcGxldGUgb2JqZWN0CiAgICAgICAgbXlEYXRhU291cmNlJERhdGF7IklucHV0TnIifS5yZXNwb25zZVNjaGVtYSA9IHsKICAgICAgICAgICAgcmVzdWx0c0xpc3QgOiAiUmVzcG9uc2UuUmVzdWx0cyIsIC8vIFN0cmluZyBwb2ludGVyIHRvIHJlc3VsdCBkYXRhCiAgICAgICAgICAgIGZpZWxkcyA6IFsKICAgICAgICAgICAgICAgIHsga2V5OiAiVXNlcktleSIgfSwKICAgICAgICAgICAgICAgIHsga2V5OiAiVXNlclZhbHVlIiB9LAogICAgICAgICAgICAgICAgeyBrZXk6ICJVc2VyVmFsdWVQbGFpbiIgfQogICAgICAgICAgICBdCiAgICAgICAgfTsKICAgICAgICAvLyBkZWZpbmUgYXV0b2NvbXBsZXRlIG9iamVjdAogICAgICAgIHZhciBteUF1dG9Db21wJERhdGF7IklucHV0TnIifSA9IG5ldyBZQUhPTy53aWRnZXQuQXV0b0NvbXBsZXRlKCJteUF1dG9Db21wbGV0ZUlucHV0JERhdGF7IklucHV0TnIifSIsICJteUF1dG9Db21wbGV0ZUNvbnRhaW5lciREYXRheyJJbnB1dE5yIn0iLCBteURhdGFTb3VyY2UkRGF0YXsiSW5wdXROciJ9KTsKICAgICAgICBteUF1dG9Db21wJERhdGF7IklucHV0TnIifS5yZXN1bHRUeXBlTGlzdCA9IGZhbHNlOwoKICAgICAgICAvLyBnZXQgZ3JvdXBzIHRoZSB1c2VyIHNob3VsZCBiZWxvbmcgdG8KICAgICAgICB2YXIgVXNlckdyb3VwJERhdGF7IklucHV0TnIifSA9IGRvY3VtZW50LmNvbXBvc2UuVXNlclNlYXJjaEdyb3VwcyREYXRheyJJbnB1dE5yIn0udmFsdWU7CgogICAgICAgIC8vIGRlZmluZSByZXF1ZXN0IHBhcmFtZXRlcnMKICAgICAgICBteUF1dG9Db21wJERhdGF7IklucHV0TnIifS5nZW5lcmF0ZVJlcXVlc3QgPSBmdW5jdGlvbihzUXVlcnkkRGF0YXsiSW5wdXROciJ9KSB7CiAgICAgICAgICByZXR1cm4gIj9BY3Rpb249QWdlbnRJVFNNVXNlclNlYXJjaCZTZWFyY2g9IiArIHNRdWVyeSREYXRheyJJbnB1dE5yIn0gKyAiKiIgKyAiJkdyb3Vwcz0iICsgVXNlckdyb3VwJERhdGF7IklucHV0TnIifTsKICAgICAgICB9OwoKICAgICAgICAvLyBkZWZpbmUgb3V0cHV0IGZvcm1hdCBmb3IgZHJvcCBkb3duIGxpc3QKICAgICAgICBteUF1dG9Db21wJERhdGF7IklucHV0TnIifS5mb3JtYXRSZXN1bHQgPSBmdW5jdGlvbihvUmVzdWx0RGF0YSREYXRheyJJbnB1dE5yIn0sIHNRdWVyeSREYXRheyJJbnB1dE5yIn0sIHNSZXN1bHRNYXRjaCREYXRheyJJbnB1dE5yIn0pIHsKICAgICAgICAgICAgcmV0dXJuIChvUmVzdWx0RGF0YSREYXRheyJJbnB1dE5yIn0uVXNlclZhbHVlICsgIiAoIiArIG9SZXN1bHREYXRhJERhdGF7IklucHV0TnIifS5Vc2VyS2V5ICsgIikiKTsKICAgICAgICB9OwoKICAgICAgICAvLyBkZWZpbmUgdmFyaW91cyBhdXRvY29tcGxldGUgcHJvcGVydGllcwogICAgICAgIG15QXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9Lm1pblF1ZXJ5TGVuZ3RoICAgICAgICAgICA9ICRRRGF0YXsibWluUXVlcnlMZW5ndGgifTsKICAgICAgICBteUF1dG9Db21wJERhdGF7IklucHV0TnIifS5xdWVyeURlbGF5ICAgICAgICAgICAgICAgPSAkUURhdGF7InF1ZXJ5RGVsYXkifTsKICAgICAgICBteUF1dG9Db21wJERhdGF7IklucHV0TnIifS50eXBlQWhlYWQgICAgICAgICAgICAgICAgPSAkUURhdGF7InR5cGVBaGVhZCJ9OwogICAgICAgIG15QXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9Lm1heFJlc3VsdHNEaXNwbGF5ZWQgICAgICA9ICRRRGF0YXsibWF4UmVzdWx0c0Rpc3BsYXllZCJ9OwogICAgICAgIG15QXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9LmFuaW1WZXJ0ICAgICAgICAgICAgICAgICA9IHRydWU7CiAgICAgICAgbXlBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0uYW5pbVNwZWVkICAgICAgICAgICAgICAgID0gMC4yOwogICAgICAgIG15QXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9LmFsbG93QnJvd3NlckF1dG9jb21wbGV0ZSA9IGZhbHNlOwoKICAgICAgICAvLyBmaXhlcyBJRTYgYnVnIHRoYXQgY2F1c2VzIGZvcm0gc2VsZWN0IGVsZW1lbnRzIHRvIGJlIGRpc3BsYXllZAogICAgICAgIC8vIG92ZXIgZWxlbWVudHMgd2l0aCBhIGhpZ2hlciB6LWluZGV4CiAgICAgICAgbXlBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0udXNlSUZyYW1lID0gdHJ1ZTsKCiAgICAgICAgLy8gZGVmaW5lIGN1c3RvbSBpdGVtU2VsZWN0IGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICB2YXIgaXRlbVNlbGVjdEhhbmRsZXIkRGF0YXsiSW5wdXROciJ9ID0gZnVuY3Rpb24oc1R5cGUkRGF0YXsiSW5wdXROciJ9LCBhQXJncyREYXRheyJJbnB1dE5yIn0pIHsKICAgICAgICAgICAgdmFyIG9NeUFjSW5zdGFuY2UkRGF0YXsiSW5wdXROciJ9ID0gYUFyZ3MkRGF0YXsiSW5wdXROciJ9WzBdOyAgLy8geW91ciBBdXRvQ29tcGxldGUgaW5zdGFuY2UKICAgICAgICAgICAgdmFyIGVsTGlzdEl0ZW0kRGF0YXsiSW5wdXROciJ9ICAgID0gYUFyZ3MkRGF0YXsiSW5wdXROciJ9WzFdOyAgLy8gdGhlIDxsaT4gZWxlbWVudCBzZWxlY3RlZCBpbiB0aGUgc3VnZ2VzdGlvbiBjb250YWluZXIKICAgICAgICAgICAgdmFyIG9EYXRhJERhdGF7IklucHV0TnIifSAgICAgICAgID0gYUFyZ3MkRGF0YXsiSW5wdXROciJ9WzJdOyAgLy8gb2JqZWN0IGxpdGVyYWwgb2YgZGF0YSBmb3IgdGhlIHJlc3VsdAoKICAgICAgICAgICAgLy8gc2V0IGF1dG9jb21wbGV0ZSBmaWVsZCB3aXRoIHNlbGVjdGVkIHZhbHVlCiAgICAgICAgICAgIG9NeUFjSW5zdGFuY2UkRGF0YXsiSW5wdXROciJ9LmdldElucHV0RWwoKS52YWx1ZSA9IG9EYXRhJERhdGF7IklucHV0TnIifS5Vc2VyVmFsdWVQbGFpbjsKCiAgICAgICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRVc2VyCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlNlbGVjdGVkVXNlciREYXRheyJJbnB1dE5yIn0pIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU2VsZWN0ZWRVc2VyJERhdGF7IklucHV0TnIifS52YWx1ZSA9IG9EYXRhJERhdGF7IklucHV0TnIifS5Vc2VyS2V5OwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gc3Vic2NyaWJlIGN1c3RvbSBpdGVtU2VsZWN0IGhhbmRsZXIgdG8gdGhlIGV2ZW50CiAgICAgICAgbXlBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0uaXRlbVNlbGVjdEV2ZW50LnN1YnNjcmliZShpdGVtU2VsZWN0SGFuZGxlciREYXRheyJJbnB1dE5yIn0pOwoKICAgICAgICAvLyBkeW5hbWljYWxseSBhZGp1c3QgdGhlIHdpZHRoIG9mIHRoZSBhdXRvY29tcGxldGUgY29udGFpbmVyCiAgICAgICAgbXlBdXRvQ29tcCREYXRheyJJbnB1dE5yIn0uZG9CZWZvcmVMb2FkRGF0YSA9IGZ1bmN0aW9uIChvUmVxdWVzdCREYXRheyJJbnB1dE5yIn0sIG9SZXNwb25zZSREYXRheyJJbnB1dE5yIn0sIG9QYXlsb2FkJERhdGF7IklucHV0TnIifSkgewoKICAgICAgICAgICAgLy8gY2hlY2sgaWYgZHluYW1pYyB3aWR0aCBpcyBlbmFibGVkCiAgICAgICAgICAgIGlmICggIU51bWJlcignJENvbmZpZ3siSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OlVzZXJTZWFyY2hBdXRvQ29tcGxldGU6OkR5bmFtaWNXaWR0aCJ9JykgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZmluZCB0aGUgbG9uZ2VzdCByZXN1bHQgc3RyaW5nCiAgICAgICAgICAgIHZhciBNYXhTdHJpbmckRGF0YXsiSW5wdXROciJ9ID0gJyc7CiAgICAgICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IG9SZXNwb25zZSREYXRheyJJbnB1dE5yIn0ucmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKICAgICAgICAgICAgICAgIHZhciBSZXN1bHQkRGF0YXsiSW5wdXROciJ9ID0gb1Jlc3BvbnNlJERhdGF7IklucHV0TnIifS5yZXN1bHRzW2ldOwogICAgICAgICAgICAgICAgdmFyIFN0cmluZyREYXRheyJJbnB1dE5yIn0gPSBSZXN1bHQkRGF0YXsiSW5wdXROciJ9WyJVc2VyVmFsdWVQbGFpbiJdICsgUmVzdWx0JERhdGF7IklucHV0TnIifVsiVXNlcktleSJdOwogICAgICAgICAgICAgICAgaWYgKCBTdHJpbmckRGF0YXsiSW5wdXROciJ9Lmxlbmd0aCA+IE1heFN0cmluZyREYXRheyJJbnB1dE5yIn0ubGVuZ3RoICkgewogICAgICAgICAgICAgICAgICAgIE1heFN0cmluZyREYXRheyJJbnB1dE5yIn0gPSBTdHJpbmckRGF0YXsiSW5wdXROciJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBidWlsZCBvcHRpb24gZWxlbWVudCB3aXRoIHRoZSBsb25nZXN0IHJlc3VsdCBzdHJpbmcKICAgICAgICAgICAgdmFyIER1bW15T3B0aW9uJERhdGF7IklucHV0TnIifSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOwogICAgICAgICAgICBEdW1teU9wdGlvbiREYXRheyJJbnB1dE5yIn0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoTWF4U3RyaW5nJERhdGF7IklucHV0TnIifSkpOwoKICAgICAgICAgICAgLy8gYnVpbGQgaW52aXNpYmxlIGR1bW15IHNlbGVjdCBmaWVsZCB0byBmaW5kIHRoZSB3aWR0aAogICAgICAgICAgICB2YXIgRHVtbXlTZWxlY3QkRGF0YXsiSW5wdXROciJ9ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CiAgICAgICAgICAgIER1bW15U2VsZWN0JERhdGF7IklucHV0TnIifS5zZXRBdHRyaWJ1dGUoICdpZCcsICdEdW1teVNlbGVjdElEJERhdGF7IklucHV0TnIifScgKTsKICAgICAgICAgICAgRHVtbXlTZWxlY3QkRGF0YXsiSW5wdXROciJ9LnNldEF0dHJpYnV0ZSggJ3N0eWxlJywgJ3Zpc2liaWxpdHk6aGlkZGVuJyApOwogICAgICAgICAgICBEdW1teVNlbGVjdCREYXRheyJJbnB1dE5yIn0uYXBwZW5kQ2hpbGQoRHVtbXlPcHRpb24kRGF0YXsiSW5wdXROciJ9KTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXS5hcHBlbmRDaGlsZChEdW1teVNlbGVjdCREYXRheyJJbnB1dE5yIn0pOwoKICAgICAgICAgICAgLy8gZ2V0IG5ldyB3aWR0aAogICAgICAgICAgICB2YXIgTmV3V2lkdGgkRGF0YXsiSW5wdXROciJ9ID0gRHVtbXlTZWxlY3QkRGF0YXsiSW5wdXROciJ9Lm9mZnNldFdpZHRoOwoKICAgICAgICAgICAgLy8gcmVtb3ZlIGhpZGRlbiBzZWxlY3QgZmllbGQKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXS5yZW1vdmVDaGlsZChEdW1teVNlbGVjdCREYXRheyJJbnB1dE5yIn0pOwoKICAgICAgICAgICAgLy8gZ2V0IGNvbnRhaW5lcgogICAgICAgICAgICB2YXIgQ29udGFpbmVyJERhdGF7IklucHV0TnIifSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteUF1dG9Db21wbGV0ZUNvbnRhaW5lciREYXRheyJJbnB1dE5yIn0nKTsKCiAgICAgICAgICAgIC8vIGFwcGx5IG5ldyB3aWR0aCB0byBjb250YWluZXIKICAgICAgICAgICAgQ29udGFpbmVyJERhdGF7IklucHV0TnIifS5zdHlsZS53aWR0aCA9IE5ld1dpZHRoJERhdGF7IklucHV0TnIifSArICdweCc7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CjwhLS0gZHRsOmJsb2NrOlVzZXJTZWFyY2hBdXRvQ29tcGxldGVDb2RlIC0tPgoKICAgICAgICByZXR1cm4gewo8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlUmV0dXJuRWxlbWVudHMgLS0+CiAgICAgICAgICAgIG15RGF0YVNvdXJjZSREYXRheyJJbnB1dE5yIn06IG15RGF0YVNvdXJjZSREYXRheyJJbnB1dE5yIn0sCiAgICAgICAgICAgIG15QXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9ICA6IG15QXV0b0NvbXAkRGF0YXsiSW5wdXROciJ9LAo8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlUmV0dXJuRWxlbWVudHMgLS0+CiAgICAgICAgICAgIGR1bW15OiAxICAgIC8vIHdvcmthcm91bmQgZm9yIGF2b2lkaW5nIGEgdHJhaWxpbmcgY29tbWEKICAgICAgICB9OwogICAgfSk7Cn0pKCk7Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6VXNlclNlYXJjaEF1dG9Db21wbGV0ZSAtLT4K
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlckFkZC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTVdvcmtPcmRlckFkZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyQWRkLmR0bCx2IDEuNTMgMjAxMC8wNi8yOSAxMzo1MTo0NSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkphdmFTY3JpcHRQYXRoIn1pdHNtLWNoYW5nZW1hbmFnZW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KCmZ1bmN0aW9uIHN1Ym1pdF90ZW1wbGF0ZSgpIHsKCiAgICAvLyBjaGVjayB0aGUgcGxhbm5lZCB0aW1lCiAgICBpZiAoIGRvY3VtZW50LnRlbXBsYXRlLk1vdmVUaW1lVXNlZC5jaGVja2VkICYmICFDaGVja1RpbWUoICdNb3ZlVGltZScgKSApIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGhlIHBsYW5uZWQgdGltZSBpcyBpbnZhbGlkISJ9Jyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CgogICAgLy8gY2hlY2sgdGhlIHRpdGxlLCBhbGwgd2hpdGVzcGFjZSBjb3VudHMgYXMgZW1wdHkKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLldvcmtPcmRlclRpdGxlLnZhbHVlLm1hdGNoKC9eXHMqJC8pKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgd29ya29yZGVyIG11c3QgaGF2ZSBhIHRpdGxlISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Xb3JrT3JkZXJUaXRsZS5mb2N1cygpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gY2hlY2sgdGhlIHBsYW5uZWQgc3RhcnQgdGltZQogICAgaWYgKCAhQ2hlY2tUaW1lKCAnUGxhbm5lZFN0YXJ0VGltZScgKSApIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGhlIHBsYW5uZWQgc3RhcnQgdGltZSBpcyBpbnZhbGlkISJ9Jyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBjaGVjayB0aGUgcGxhbm5lZCBlbmQgdGltZQogICAgaWYgKCAhQ2hlY2tUaW1lKCAnUGxhbm5lZEVuZFRpbWUnICkgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRoZSBwbGFubmVkIGVuZCB0aW1lIGlzIGludmFsaWQhIn0nKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHBsYW5uZWQgc3RhcnQgdGltZSBpcyBiZWZvcmUgdGhlIHBsYW5uZWQgZW5kIHRpbWUKICAgIHZhciBTdGFydEFmdGVyRW5kTXNnID0gJyRKU1RleHR7IlRoZSBwbGFubmVkIHN0YXJ0IHRpbWUgbXVzdCBiZSBiZWZvcmUgdGhlIHBsYW5uZWQgZW5kIHRpbWUhIn0nOwogICAgaWYgKCAhQ2hlY2tTdGFydEJlZm9yZUVuZCggJ1BsYW5uZWRTdGFydFRpbWUnLCAnUGxhbm5lZEVuZFRpbWUnLCBTdGFydEFmdGVyRW5kTXNnICkgKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRDaGVja0pzIC0tPgogICAgLy8gY2hlY2sgdGhlIHJlcXVpcmVkIGZyZWV0ZXh0IGZpZWxkcwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQifS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICcgKyBkb2N1bWVudC5jb21wb3NlLiREYXRheyJXb3JrT3JkZXJGcmVlS2V5RmllbGQifS52YWx1ZSArICchJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiV29ya09yZGVyRnJlZVRleHRGaWVsZCJ9LmZvY3VzKCk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRDaGVja0pzIC0tPgoKICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiQWRkIFdvcmtvcmRlciB0byJ9ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJDaGFuZ2VUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiQWRkIFdvcmtvcmRlciB0byJ9ICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJDaGFuZ2VUaXRsZSIsIjcwIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RDaGFuZ2VWaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+Cgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJUZW1wbGF0ZSAtLT4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJ0ZW1wbGF0ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDcmVhdGVGcm9tVGVtcGxhdGUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiICB2YWx1ZT0iJFFEYXRheyJDaGFuZ2VJRCJ9Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU2VsZWN0IFdvcmtvcmRlciBUZW1wbGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiVGVtcGxhdGUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHRpdGxlPSIkVGV4dHsiUmVxdWlyZWQifSI+KjwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRlbXBsYXRlU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTW92ZVRpbWVUeXBlU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZE1vdmVUaW1lVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRNb3ZlVGltZVR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5ldyB0aW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik1vdmVUaW1lU2VsZWN0aW9uU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZE1vdmVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZE1vdmVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRUZW1wbGF0ZSIgYWNjZXNza2V5PSJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdFRlbXBsYXRlIiB2YWx1ZT0iJFRleHR7IkNyZWF0ZSJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X3RlbXBsYXRlKCk7Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJUZW1wbGF0ZSAtLT4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNhdmUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hhbmdlSUQiICB2YWx1ZT0iJFFEYXRheyJDaGFuZ2VJRCJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgICAgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJXb3Jrb3JkZXIifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlRpdGxlIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiB0aXRsZT0iJFRleHR7IlJlcXVpcmVkIn0iPio8L2ZvbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJXb3JrT3JkZXJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiV29ya09yZGVyVGl0bGUifSIgc2l6ZT0iNzAiIG1heGxlbmd0aD0iMjUwIj4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRpdGxlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ikluc3RydWN0aW9uIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgokSW5jbHVkZXsiUmljaFRleHRFZGl0b3JJVFNNIn0KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dDEiIG5hbWU9Ikluc3RydWN0aW9uIiByb3dzPSIxNSIgY29scz0iJENvbmZpZ3siSVRTTTo6RnJvbnRlbmQ6OlRleHRBcmVhIn0iIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iPiREYXRheyJJbnN0cnVjdGlvbiJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJXb3JrT3JkZXJUeXBlIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUeXBlU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlclR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiV29ya09yZGVyRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQifQo8IS0tIGR0bDpibG9jazpJbnZhbGlkV29ya09yZGVyRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkV29ya09yZGVyRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0U3BhY2VyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRTcGFjZXIgLS0+CiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGV4YW1wbGUgZm9yIGN1c3RvbWl6YXRpb24gb2Ygc2luZ2xlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiM8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJXb3JrT3JkZXJGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQxIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRXb3JrT3JkZXJGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZFdvcmtPcmRlckZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQxIC0tPgojCiMKIzwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IldvcmtPcmRlckZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQyIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRXb3JrT3JkZXJGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZFdvcmtPcmRlckZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQyIC0tPgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUGxhbm5lZFN0YXJ0VGltZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUGxhbm5lZFN0YXJ0VGltZVN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRQbGFubmVkU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFBsYW5uZWRTdGFydFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUGxhbm5lZEVuZFRpbWUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlBsYW5uZWRFbmRUaW1lU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFBsYW5uZWRFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFBsYW5uZWRFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNob3dQbGFubmVkRWZmb3J0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGxhbm5lZEVmZm9ydCJ9OjwvdGQ+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJQbGFubmVkRWZmb3J0IiB2YWx1ZT0iJFFEYXRheyJQbGFubmVkRWZmb3J0In0iIHNpemU9IjExIiBtYXhsZW5ndGg9IjExIj4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFBsYW5uZWRFZmZvcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRQbGFubmVkRWZmb3J0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2hvd1BsYW5uZWRFZmZvcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJBdHRhY2htZW50In06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE2Ij48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZUlEPSRMUURhdGF7IkZpbGVJRCJ9O0Zvcm1JRD0kUURhdGF7IkZvcm1JRCJ9O0NoYW5nZUlEPSRMUURhdGF7IkNoYW5nZUlEIn0iPjxpbWcgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kaXNrLXMucG5nIiBib3JkZXI9IjAiIGFsdD0iRG93bmxvYWQiIHRpdGxlPSJEb3dubG9hZCIvPjwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkRlbGV0ZUF0dGFjaG1lbnQkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iQXR0YWNobWVudE5ldyI+CjwhLS0gZHRsOmJsb2NrOkZpbGVBbHJlYWR5VXBsb2FkZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpGaWxlQWxyZWFkeVVwbG9hZGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidXR0b24iIG5hbWU9IlNhdmVBdHRhY2htZW50IiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ij48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGlkPSJzdWJtaXRXb3JrT3JkZXJBZGQiIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiBuYW1lPSJXb3JrT3JkZXJBZGQiIHZhbHVlPSIkVGV4dHsiU2F2ZSJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnI+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlckFnZW50LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNV29ya09yZGVyQWdlbnQKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckFnZW50LmR0bCx2IDEuMjUgMjAxMC8wNC8yNyAyMDo0NTowNCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFKQVgifQoKJEluY2x1ZGV7IkFnZW50SVRTTVVzZXJTZWFyY2gifQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLm15QXV0b0NvbXBsZXRlIHsKICAgIHdpZHRoOjMyZW07IC8qIHNldCB3aWR0aCBoZXJlIG9yIGVsc2Ugd2lkZ2V0IHdpbGwgZXhwYW5kIHRvIGZpdCBpdHMgY29udGFpbmVyICovCiAgICBwYWRkaW5nLWJvdHRvbTowLjVlbTsKfQo8L3N0eWxlPgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjbGVhcl9maWVsZCgpIHsKICAgIGRvY3VtZW50LmNvbXBvc2UuQWdlbnQudmFsdWUgPSAiIjsKICAgIGRvY3VtZW50LmNvbXBvc2UuQWdlbnQuZm9jdXMoKTsKfQoKLy8gZG8gaW5pdGlhbGl6YXRpb24gd2hlbiB0aGUgRE9NIGlzIGZ1bGx5IGxvYWRlZApkb2N1bWVudC5vYnNlcnZlKCAiZG9tOmxvYWRlZCIsIGZ1bmN0aW9uKCkgewoKICAgIC8vIGNsZWFyIHRoZSBVc2VyIGlucHV0IGZpZWxkLCB3aGVuIGl0IGdhaW5zIGZvY3VzCiAgICAkKCdteUF1dG9Db21wbGV0ZUlucHV0Jykub2JzZXJ2ZSgKICAgICAgICAnZm9jdXMnLAogICAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLnNldFZhbHVlKCcnKTsKICAgICAgICB9CiAgICApOwoKfSApOwoKCi8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiRWRpdCJ9ICRUZXh0eyJXb3JrT3JkZXJBZ2VudCJ9ICRUZXh0eyJvZiJ9ICRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IldvcmtPcmRlclRpdGxlIn0iPgogICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJFZGl0In0gJFRleHR7IldvcmtPcmRlckFnZW50In0gJFRleHR7Im9mIn0gJENvbmZpZ3siSVRTTVdvcmtPcmRlcjo6SG9vayJ9OiAkUURhdGF7IkNoYW5nZU51bWJlciJ9LSRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiV29ya09yZGVyVGl0bGUiLCI3MCJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0V29ya09yZGVyVmlldyJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgoKICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2F2ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJXb3JrT3JkZXJJRCIgdmFsdWU9IiRRRGF0YXsiV29ya09yZGVySUQifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZFVzZXIiIHZhbHVlPSIkUURhdGF7IlVzZXJJRCJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJTZWFyY2hHcm91cHMiIHZhbHVlPSJpdHNtLWNoYW5nZSI+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IldvcmtPcmRlckFnZW50In08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJXb3JrT3JkZXJBZ2VudCJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlVzZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZTdGFydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im15QXV0b0NvbXBsZXRlIiBjbGFzcz0ibXlBdXRvQ29tcGxldGUiPgo8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlRGl2U3RhcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJteUF1dG9Db21wbGV0ZUlucHV0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJVc2VyIiB2YWx1ZT0iJFFEYXRheyJVc2VyIn0iIHNpemU9IjcwIi8+CjwhLS0gZHRsOmJsb2NrOlVzZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZFbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibXlBdXRvQ29tcGxldGVDb250YWluZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlVzZXJTZWFyY2hBdXRvQ29tcGxldGVEaXZFbmQgLS0+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRVc2VyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFVzZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlVzZXJTdHJnIn0KPCEtLSBkdGw6YmxvY2s6VGFrZVVzZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPjxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkV4cGFuZFVzZXJOYW1lMiIgdmFsdWU9IiRUZXh0eyJUYWtlIHRoaXMgVXNlciJ9Ii8+CjwhLS0gZHRsOmJsb2NrOlRha2VVc2VyIC0tPgo8IS0tIGR0bDpibG9jazpTZWFyY2hVc2VyQnV0dG9uIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iRXhwYW5kVXNlck5hbWUxIiB2YWx1ZT0iJFRleHR7IlNlYXJjaCBVc2VyIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkNsZWFyVXNlciIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9ICRUZXh0eyJVc2VyIn0iIG9uY2xpY2s9ImphdmFzY3JpcHQ6Y2xlYXJfZmllbGQoKTsgcmV0dXJuIGZhbHNlOyIvPgo8IS0tIGR0bDpibG9jazpTZWFyY2hVc2VyQnV0dG9uIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTVdvcmtPcmRlckRlbGV0ZQojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyRGVsZXRlLmR0bCx2IDEuMjEgMjAxMC8wMi8wOCAxNDo1MToyMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiRGVsZXRlIn0gJENvbmZpZ3siSVRTTVdvcmtPcmRlcjo6SG9vayJ9OiAkUURhdGF7IkNoYW5nZU51bWJlciJ9LSRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiV29ya09yZGVyVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IkRlbGV0ZSJ9ICRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IldvcmtPcmRlclRpdGxlIiwiNzAifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFdvcmtPcmRlclZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjU1MCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRGVsZXRlIn0gJENvbmZpZ3siSVRTTVdvcmtPcmRlcjo6SG9vayJ9ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpOb1dvcmtPcmRlckluQ29uZGl0aW9uIC0tPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjEzMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IldvcmtPcmRlclRpdGxlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIHdvcmtvcmRlcj8ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2w+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iQWdlbnRJVFNNV29ya09yZGVyWm9vbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJXb3JrT3JkZXJJRCIgdmFsdWU9IiRRRGF0YXsiV29ya09yZGVySUQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTm8ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IldvcmtPcmRlckRlbGV0ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iV29ya09yZGVySUQiIHZhbHVlPSIkUURhdGF7IldvcmtPcmRlcklEIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiWWVzIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpOb1dvcmtPcmRlckluQ29uZGl0aW9uIC0tPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJJbkNvbmRpdGlvbiAtLT4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMzAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2w+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IllvdSBjYW4gbm90IGRlbGV0ZSB0aGlzIFdvcmtvcmRlci4gSXQgaXMgdXNlZCBpbiBhdCBsZWFzdCBvbmUgQ29uZGl0aW9uISJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlRoaXMgV29ya29yZGVyIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBDb25kaXRpb24ocykifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVySW5Db25kaXRpb25Sb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSZhbXA7QWN0aW9uPUFnZW50SVRTTUNoYW5nZUNvbmRpdGlvbkVkaXQ7Q2hhbmdlSUQ9JExRRGF0YXsiQ2hhbmdlSUQifTtDb25kaXRpb25JRD0kTFFEYXRheyJDb25kaXRpb25JRCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJOYW1lIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJJbkNvbmRpdGlvblJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJJbkNvbmRpdGlvbiAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlckVkaXQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Xb3JrT3JkZXJFZGl0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJFZGl0LmR0bCx2IDEuNDggMjAxMC8wNi8yOSAxMzo1MDo1MyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkphdmFTY3JpcHRQYXRoIn1pdHNtLWNoYW5nZW1hbmFnZW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKCiAgICAvLyBjaGVjayB0aGUgdGl0bGUsIGFsbCB3aGl0ZXNwYWNlIGNvdW50cyBhcyBlbXB0eQogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuV29ya09yZGVyVGl0bGUudmFsdWUubWF0Y2goL15ccyokLykpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSB3b3Jrb3JkZXIgbXVzdCBoYXZlIGEgdGl0bGUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLldvcmtPcmRlclRpdGxlLmZvY3VzKCk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBjaGVjayB0aGUgcGxhbm5lZCBzdGFydCB0aW1lCiAgICBpZiAoICFDaGVja1RpbWUoICdQbGFubmVkU3RhcnRUaW1lJyApICkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaGUgcGxhbm5lZCBzdGFydCB0aW1lIGlzIGludmFsaWQhIn0nKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGNoZWNrIHRoZSBwbGFubmVkIGVuZCB0aW1lCiAgICBpZiAoICFDaGVja1RpbWUoICdQbGFubmVkRW5kVGltZScgKSApIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGhlIHBsYW5uZWQgZW5kIHRpbWUgaXMgaW52YWxpZCEifScpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gY2hlY2sgd2hldGhlciB0aGUgcGxhbm5lZCBzdGFydCB0aW1lIGlzIGJlZm9yZSB0aGUgcGxhbm5lZCBlbmQgdGltZQogICAgdmFyIFN0YXJ0QWZ0ZXJFbmRNc2cgPSAnJEpTVGV4dHsiVGhlIHBsYW5uZWQgc3RhcnQgdGltZSBtdXN0IGJlIGJlZm9yZSB0aGUgcGxhbm5lZCBlbmQgdGltZSEifSc7CiAgICBpZiAoICFDaGVja1N0YXJ0QmVmb3JlRW5kKCAnUGxhbm5lZFN0YXJ0VGltZScsICdQbGFubmVkRW5kVGltZScsIFN0YXJ0QWZ0ZXJFbmRNc2cgKSApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dENoZWNrSnMgLS0+CiAgICAvLyBjaGVjayB0aGUgcmVxdWlyZWQgZnJlZXRleHQgZmllbGRzCiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiV29ya09yZGVyRnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IldvcmtPcmRlckZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJXb3JrT3JkZXJGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dENoZWNrSnMgLS0+CgogICAgcmV0dXJuIHRydWU7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJEVudnsiQm94MCJ9ICRUZXh0eyJFZGl0In0gJENvbmZpZ3siSVRTTVdvcmtPcmRlcjo6SG9vayJ9OiAkUURhdGF7IkNoYW5nZU51bWJlciJ9LSRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiV29ya09yZGVyVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IkVkaXQifSAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJXb3JrT3JkZXJUaXRsZSIsIjcwIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RXb3JrT3JkZXJWaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTYXZlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IldvcmtPcmRlcklEIiB2YWx1ZT0iJFFEYXRheyJXb3JrT3JkZXJJRCJ9Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiV29ya29yZGVyIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxNDAiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJUaXRsZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IioiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IldvcmtPcmRlclRpdGxlIiB2YWx1ZT0iJFFEYXRheyJXb3JrT3JkZXJUaXRsZSJ9IiBzaXplPSI3MCIgbWF4bGVuZ3RoPSIyNTAiPgo8IS0tIGR0bDpibG9jazpJbnZhbGlkVGl0bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkVGl0bGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiSW5zdHJ1Y3Rpb24ifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvcklUU00ifQo8IS0tIGR0bDpibG9jazpSaWNoVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0MSIgbmFtZT0iSW5zdHJ1Y3Rpb24iIHJvd3M9IjE1IiBjb2xzPSIkQ29uZmlneyJJVFNNOjpGcm9udGVuZDo6VGV4dEFyZWEifSIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JERhdGF7Ikluc3RydWN0aW9uIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IldvcmtPcmRlclR5cGUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJXb3JrT3JkZXJUeXBlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJXb3JrT3JkZXJGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiV29ya09yZGVyRnJlZVRleHRGaWVsZCJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRXb3JrT3JkZXJGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRXb3JrT3JkZXJGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dCAtLT4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRTcGFjZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dFNwYWNlciAtLT4KIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZXhhbXBsZSBmb3IgY3VzdG9taXphdGlvbiBvZiBzaW5nbGUgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIzwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IldvcmtPcmRlckZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiV29ya09yZGVyRnJlZVRleHRGaWVsZDEifQojPCEtLSBkdGw6YmxvY2s6SW52YWxpZFdvcmtPcmRlckZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CiM8IS0tIGR0bDpibG9jazpJbnZhbGlkV29ya09yZGVyRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dDEgLS0+CiMKIwojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiV29ya09yZGVyRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiV29ya09yZGVyRnJlZVRleHRGaWVsZDIifQojPCEtLSBkdGw6YmxvY2s6SW52YWxpZFdvcmtPcmRlckZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CiM8IS0tIGR0bDpibG9jazpJbnZhbGlkV29ya09yZGVyRnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dDIgLS0+CiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJQbGFubmVkU3RhcnRUaW1lIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJQbGFubmVkU3RhcnRUaW1lU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFBsYW5uZWRTdGFydFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkUGxhbm5lZFN0YXJ0VGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJQbGFubmVkRW5kVGltZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUGxhbm5lZEVuZFRpbWVTdHJpbmcifQo8IS0tIGR0bDpibG9jazpJbnZhbGlkUGxhbm5lZEVuZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkUGxhbm5lZEVuZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2hvd1BsYW5uZWRFZmZvcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQbGFubmVkRWZmb3J0In06PC90ZD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlBsYW5uZWRFZmZvcnQiIHZhbHVlPSIkUURhdGF7IlBsYW5uZWRFZmZvcnQifSIgc2l6ZT0iMTEiIG1heGxlbmd0aD0iMTEiPgo8IS0tIGR0bDpibG9jazpJbnZhbGlkUGxhbm5lZEVmZm9ydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFBsYW5uZWRFZmZvcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTaG93UGxhbm5lZEVmZm9ydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTYiPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPURvd25sb2FkQXR0YWNobWVudDtGaWxlSUQ9JFFEYXRheyJGaWxlSUQifTtXb3JrT3JkZXJJRD0kUURhdGF7IldvcmtPcmRlcklEIn0iPjxpbWcgc3JjPSIkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn1kaXNrLXMucG5nIiBib3JkZXI9IjAiIGFsdD0iRG93bmxvYWQiIHRpdGxlPSJEb3dubG9hZCIvPjwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAlIj48aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEZWxldGVBdHRhY2htZW50JFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9IkF0dGFjaG1lbnROZXciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidXR0b24iIG5hbWU9IlNhdmVBdHRhY2htZW50IiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ij48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpbGVBbHJlYWR5VXBsb2FkZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGaWxlQWxyZWFkeVVwbG9hZGVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBpZD0ic3VibWl0V29ya09yZGVyRWRpdCIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIG5hbWU9IldvcmtPcmRlckVkaXQiIHZhbHVlPSIkVGV4dHsiU2F2ZSJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8YnI+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlckhpc3RvcnkuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJIaXN0b3J5LmR0bCx2IDEuMTIgMjAxMC8wMi8wNCAxMjoyODoyNCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7Ikhpc3Rvcnkgb2YifSAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJXb3JrT3JkZXJUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiSGlzdG9yeSBvZiJ9ICRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IldvcmtPcmRlclRpdGxlIiwiNzAifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFdvcmtPcmRlclZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjYwIiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSI2MCIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkFjdGlvbiJ9OgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ29tbWVudCJ9OgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGV0YWlscyJ9OgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiV29ya29yZGVyIn06CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJVc2VyIn06CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDcmVhdGV0aW1lIn06CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJjc3MifSI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkUXVvdGV7IiREYXRheyJIaXN0b3J5VHlwZSJ9In0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDb250ZW50In0iPiRRRGF0YXsiQ29udGVudCIsIjEwMCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+CjwhLS0gZHRsOmJsb2NrOkhpc3Rvcnlab29tRGFzaCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgLQo8IS0tIGR0bDpibG9jazpIaXN0b3J5Wm9vbURhc2ggLS0+CjwhLS0gZHRsOmJsb2NrOkhpc3Rvcnlab29tIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tJkhpc3RvcnlFbnRyeUlEPSREYXRheyJIaXN0b3J5RW50cnlJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiTW9yZSBJbmZvIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij54PC9hPgo8IS0tIGR0bDpibG9jazpIaXN0b3J5Wm9vbSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KPCEtLSBkdGw6YmxvY2s6RGFzaCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgLQo8IS0tIGR0bDpibG9jazpEYXNoIC0tPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJab29tIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb20mV29ya09yZGVySUQ9JERhdGF7IldvcmtPcmRlcklEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJab29tIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij54PC9hPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJab29tIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUXVvdGV7IiREYXRheyJVc2VyTG9naW4ifSAoJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0pIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFF1b3RleyIkRGF0YXsiVXNlckxvZ2luIn0ifSAoJFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjIwIn0pCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNV29ya09yZGVySGlzdG9yeVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlckhpc3Rvcnlab29tLmR0bCx2IDEuMTUgMjAxMC8wMi8wNCAxMjoyODoyNCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAubm93cmFwIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQoKICAgIC5maWVsZHZhbHVlcyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgIH0KPC9zdHlsZT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7Ikhpc3Rvcnkgb2YifSAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJXb3JrT3JkZXJUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiSGlzdG9yeSBvZiJ9ICRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IldvcmtPcmRlclRpdGxlIiwiNzAifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbkhpc3RvcnkifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPGJyPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRGV0YWlsZWQgaGlzdG9yeSBpbmZvcm1hdGlvbiBvZiJ9IFdvcmtvcmRlciB1cGRhdGUKICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkgbm93cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik1vZGlmaWVkIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRmllbGRuYW1lIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkgbm93cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7Ik9sZCBWYWx1ZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHZhbHVlcyI+JERhdGF7IkNvbnRlbnRPbGQifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSBub3dyYXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiTmV3IFZhbHVlIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkdmFsdWVzIj4kRGF0YXsiQ29udGVudE5ldyJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IG5vd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2VkIn06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IG5vd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2VkIGJ5In06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJERhdGF7IlVzZXJMb2dpbiJ9ICgkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSkifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUXVvdGV7IiREYXRheyJVc2VyTG9naW4ifSJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMjAifSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlclByaW50LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNV29ya09yZGVyUHJpbnQKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlclByaW50LmR0bCx2IDEuMSAyMDA5LzEwLzExIDIzOjE4OjQ5IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCg==
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlclJlcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTVdvcmtPcmRlclJlcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNV29ya09yZGVyUmVwb3J0LmR0bCx2IDEuMzIgMjAxMC8wNi8yOSAxMzo1MjowNiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkphdmFTY3JpcHRQYXRoIn1pdHNtLWNoYW5nZW1hbmFnZW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKCjwhLS0gZHRsOmJsb2NrOkFjdHVhbFRpbWVTcGFuSlMgLS0+CgogICAgLy8gY2hlY2sgdGhlIGFjdHVhbCBzdGFydCB0aW1lCiAgICBpZiAoIGRvY3VtZW50LmNvbXBvc2UuQWN0dWFsU3RhcnRUaW1lVXNlZC5jaGVja2VkICYmICFDaGVja1RpbWUoICdBY3R1YWxTdGFydFRpbWUnICkgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRoZSBhY3R1YWwgc3RhcnQgdGltZSBpcyBpbnZhbGlkISJ9Jyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBjaGVjayB0aGUgYWN0dWFsIGVuZCB0aW1lCiAgICBpZiAoIGRvY3VtZW50LmNvbXBvc2UuQWN0dWFsRW5kVGltZVVzZWQuY2hlY2tlZCAmJiAhQ2hlY2tUaW1lKCAnQWN0dWFsRW5kVGltZScgKSApIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGhlIGFjdHVhbCBlbmQgdGltZSBpcyBpbnZhbGlkISJ9Jyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoIGRvY3VtZW50LmNvbXBvc2UuQWN0dWFsRW5kVGltZVVzZWQuY2hlY2tlZCAmJiAhZG9jdW1lbnQuY29tcG9zZS5BY3R1YWxTdGFydFRpbWVVc2VkLmNoZWNrZWQgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRoZSBhY3R1YWwgc3RhcnQgdGltZSBtdXN0IGJlIHNldCwgd2hlbiB0aGUgYWN0dWFsIGVuZCB0aW1lIGlzIHNldCEifScpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gY2hlY2sgd2hldGhlciB0aGUgcGxhbm5lZCBzdGFydCB0aW1lIGlzIGJlZm9yZSB0aGUgcGxhbm5lZCBlbmQgdGltZQogICAgaWYgKCBkb2N1bWVudC5jb21wb3NlLkFjdHVhbEVuZFRpbWVVc2VkLmNoZWNrZWQgJiYgZG9jdW1lbnQuY29tcG9zZS5BY3R1YWxFbmRUaW1lVXNlZC5jaGVja2VkICkgewogICAgICAgIHZhciBTdGFydEFmdGVyRW5kTXNnID0gJyRKU1RleHR7IlRoZSBhY3R1YWwgc3RhcnQgdGltZSBtdXN0IGJlIGJlZm9yZSB0aGUgYWN0dWFsIGVuZCB0aW1lISJ9JzsKICAgICAgICBpZiAoICFDaGVja1N0YXJ0QmVmb3JlRW5kKCAnQWN0dWFsU3RhcnRUaW1lJywgJ0FjdHVhbEVuZFRpbWUnLCBTdGFydEFmdGVyRW5kTXNnICkgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9Cgo8IS0tIGR0bDpibG9jazpBY3R1YWxUaW1lU3BhbkpTIC0tPgoKPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRDaGVja0pzIC0tPgogICAgLy8gY2hlY2sgdGhlIHJlcXVpcmVkIGZyZWV0ZXh0IGZpZWxkcwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQifS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICcgKyBkb2N1bWVudC5jb21wb3NlLiREYXRheyJXb3JrT3JkZXJGcmVlS2V5RmllbGQifS52YWx1ZSArICchJyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiV29ya09yZGVyRnJlZVRleHRGaWVsZCJ9LmZvY3VzKCk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRDaGVja0pzIC0tPgoKICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiRWRpdCJ9ICRUZXh0eyJSZXBvcnQifSAkVGV4dHsib2YifSAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJXb3JrT3JkZXJUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiRWRpdCJ9ICRUZXh0eyJSZXBvcnQifSAkVGV4dHsib2YifSAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJXb3JrT3JkZXJUaXRsZSIsIjcwIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RXb3JrT3JkZXJWaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTYXZlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IldvcmtPcmRlcklEIiB2YWx1ZT0iJFFEYXRheyJXb3JrT3JkZXJJRCJ9Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiUmVwb3J0In08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVwb3J0In06PC90ZD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgokSW5jbHVkZXsiUmljaFRleHRFZGl0b3JJVFNNIn0KPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dDEiIG5hbWU9IlJlcG9ydCIgcm93cz0iMTUiIGNvbHM9IiRDb25maWd7IklUU006OkZyb250ZW5kOjpUZXh0QXJlYSJ9IiB3cmFwPSIkRW52eyJCcm93c2VyV3JhcCJ9Ij4kRGF0YXsiUmVwb3J0In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjI1JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTZWxlY3QifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0U3BhY2VyVG9wIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRTcGFjZXJUb3AgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiV29ya09yZGVyRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQifQo8IS0tIGR0bDpibG9jazpJbnZhbGlkV29ya09yZGVyRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkV29ya09yZGVyRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0U3BhY2VyQm90dG9tIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRTcGFjZXJCb3R0b20gLS0+CiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGV4YW1wbGUgZm9yIGN1c3RvbWl6YXRpb24gb2Ygc2luZ2xlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiM8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJXb3JrT3JkZXJGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQxIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRXb3JrT3JkZXJGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZFdvcmtPcmRlckZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQxIC0tPgojCiMKIzwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IldvcmtPcmRlckZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IldvcmtPcmRlckZyZWVUZXh0RmllbGQyIn0KIzwhLS0gZHRsOmJsb2NrOkludmFsaWRXb3JrT3JkZXJGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250PgojPCEtLSBkdGw6YmxvY2s6SW52YWxpZFdvcmtPcmRlckZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQyIC0tPgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKPCEtLSBkdGw6YmxvY2s6QWN0dWFsU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJBY3R1YWxTdGFydFRpbWUifToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkFjdHVhbFN0YXJ0VGltZVNlbGVjdGlvblN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRBY3R1YWxTdGFydFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiSW5wdXQgaW52YWxpZCJ9PC9mb250Pgo8IS0tIGR0bDpibG9jazpJbnZhbGlkQWN0dWFsU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFjdHVhbFN0YXJ0VGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6QWN0dWFsRW5kVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWN0dWFsRW5kVGltZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQWN0dWFsRW5kVGltZVNlbGVjdGlvblN0cmluZyJ9CjwhLS0gZHRsOmJsb2NrOkludmFsaWRBY3R1YWxFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZEFjdHVhbEVuZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QWN0dWFsRW5kVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2hvd0FjY291bnRlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBY2NvdW50ZWRUaW1lIn06PC90ZD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkFjY291bnRlZFRpbWUiIHZhbHVlPSIkUURhdGF7IkFjY291bnRlZFRpbWUifSIgc2l6ZT0iMTEiIG1heGxlbmd0aD0iMTEiPgo8IS0tIGR0bDpibG9jazpJbnZhbGlkQWNjb3VudGVkVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IklucHV0IGludmFsaWQifTwvZm9udD4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZEFjY291bnRlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTaG93QWNjb3VudGVkVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgaWQ9InN1Ym1pdFdvcmtPcmRlclJlcG9ydCIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIG5hbWU9IldvcmtPcmRlclJlcG9ydCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPGJyPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlclRha2UuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Xb3JrT3JkZXJUYWtlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJUYWtlLmR0bCx2IDEuNyAyMDEwLzA1LzE4IDE1OjAyOjQ0IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJEVudnsiQm94MCJ9ICRUZXh0eyJUYWtlIFdvcmtvcmRlciJ9IDogJENvbmZpZ3siSVRTTVdvcmtPcmRlcjo6SG9vayJ9OiAkUURhdGF7IkNoYW5nZU51bWJlciJ9LSRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiV29ya09yZGVyVGl0bGUifSI+CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn0gJFRleHR7IlRha2UgV29ya29yZGVyIn0gOiAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJXb3JrT3JkZXJUaXRsZSIsIjcwIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RXb3JrT3JkZXJWaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI0MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlRha2UgV29ya29yZGVyIn0gOiAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgd2lkdGg9IjEzMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IldvcmtPcmRlclRpdGxlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXJyZW50IEFnZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJXb3JrT3JkZXJBZ2VudCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkRvIHlvdSByZWFsbHkgd2FudCB0byB0YWtlIHRoaXMgd29ya29yZGVyPyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSJBZ2VudElUU01Xb3JrT3JkZXJab29tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IldvcmtPcmRlcklEIiB2YWx1ZT0iJFFEYXRheyJXb3JrT3JkZXJJRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJObyJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iV29ya09yZGVyVGFrZSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iV29ya09yZGVySUQiIHZhbHVlPSIkUURhdGF7IldvcmtPcmRlcklEIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiWWVzIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNV29ya09yZGVyVGVtcGxhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVdvcmtPcmRlclRlbXBsYXRlLmR0bCx2IDEuMTMgMjAxMC8wNi8yOSAxMzo0NToxNyBzYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCgpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKCiAgICAvLyBjaGVjayB0aGUgdGVtcGxhdGUgbmFtZSwgYWxsIHdoaXRlc3BhY2UgY291bnRzIGFzIGVtcHR5CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UZW1wbGF0ZU5hbWUudmFsdWUubWF0Y2goL15ccyokLykpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSB0ZW1wbGF0ZSBtdXN0IGhhdmUgYSBuYW1lISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UZW1wbGF0ZU5hbWUuZm9jdXMoKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9CgovLy0tPgo8L3NjcmlwdD4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkRW52eyJCb3gwIn0gJFRleHR7IlNhdmUgV29ya29yZGVyIGFzIHRlbXBsYXRlIn0gOiAkQ29uZmlneyJJVFNNV29ya09yZGVyOjpIb29rIn06ICRRRGF0YXsiQ2hhbmdlTnVtYmVyIn0tJFFEYXRheyJXb3JrT3JkZXJOdW1iZXIifSAkRW52eyJCb3gxIn0gJFFEYXRheyJXb3JrT3JkZXJUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifSAkVGV4dHsiU2F2ZSBXb3Jrb3JkZXIgYXMgdGVtcGxhdGUifSA6ICRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IldvcmtPcmRlclRpdGxlIiwiNzAifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFdvcmtPcmRlclZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KICAgICAgICA8L3RkPgogICAgPC90cj4KCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgICAgdmFsdWU9IkFkZFRlbXBsYXRlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IldvcmtPcmRlcklEIiAgdmFsdWU9IiRRRGF0YXsiV29ya09yZGVySUQifSI+CiAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlNhdmUgV29ya29yZGVyIGFzIHRlbXBsYXRlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTMwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiVGVtcGxhdGUgTmFtZSJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgdGl0bGU9IiRUZXh0eyJSZXF1aXJlZCJ9Ij4qPC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGVtcGxhdGVOYW1lIiB2YWx1ZT0iJFFEYXRheyJUZW1wbGF0ZU5hbWUifSIgc2l6ZT0iNzAiIG1heGxlbmd0aD0iMjUwIj4KPCEtLSBkdGw6YmxvY2s6SW52YWxpZFRlbXBsYXRlTmFtZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyJJbnB1dCBpbnZhbGlkIn08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkludmFsaWRUZW1wbGF0ZU5hbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQ29tbWVudCJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI3MCIgbWF4bGVuZ3RoPSIyNTAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlJlc2V0IFN0YXRlcyJ9OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlN0YXRlUmVzZXQiIHZhbHVlPSIxIiAkUURhdGF7IlN0YXRlUmVzZXQifS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRTZWxlY3Rpb25TdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgaWQ9InN1Ym1pdEFkZFRlbXBsYXRlIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgbmFtZT0iQWRkVGVtcGxhdGUiIHZhbHVlPSIkVGV4dHsiQWRkIn0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxicj4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEFnZW50SVRTTVdvcmtPcmRlclpvb20uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01Xb3JrT3JkZXJab29tCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Xb3JrT3JkZXJab29tLmR0bCx2IDEuNDMgMjAxMC8wNi8yOSAxMzo1NToyMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRFbnZ7IkJveDAifSAkVGV4dHsiWm9vbSJ9ICRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifTogJFFEYXRheyJDaGFuZ2VOdW1iZXIifS0kUURhdGF7IldvcmtPcmRlck51bWJlciJ9ICRFbnZ7IkJveDEifSAkUURhdGF7IldvcmtPcmRlclRpdGxlIn0iPgogICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9ICRUZXh0eyJab29tIn0gJENvbmZpZ3siSVRTTVdvcmtPcmRlcjo6SG9vayJ9OiAkUURhdGF7IkNoYW5nZU51bWJlciJ9LSRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn0gJEVudnsiQm94MSJ9ICRRRGF0YXsiV29ya09yZGVyVGl0bGUiLCI3MCJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDx0cj4KICAgICAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgogICAgICAgICAgICAtCjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSIgJERhdGF7IkxpbmtQYXJhbSJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7Ik5hbWUifSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIiB0aXRsZT0iJFRleHR7IiREYXRheyJEZXNjcmlwdGlvbiJ9In0iPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPjwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgIDxjb2xncm91cD4KICAgICAgICA8Y29sIHdpZHRoPSI3NSUiPgogICAgICAgIDxjb2wgd2lkdGg9IjI1JSI+CiAgICA8L2NvbGdyb3VwPgogICAgPHRyPgogICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMzAiPgogICAgICAgICAgICAgICAgICAgIDxjb2w+CiAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJDaGFuZ2VTdGF0ZVNpZ25hbCJ9LnBuZyIgdGl0bGU9IiRUZXh0eyIkRGF0YXsiQ2hhbmdlU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkRGF0YXsiQ2hhbmdlU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWd7IklUU01DaGFuZ2U6Okhvb2sifSAkUURhdGF7IkNoYW5nZU51bWJlciJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSZhbXA7QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb20mYW1wO0NoYW5nZUlEPSRMUURhdGF7IkNoYW5nZUlEIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVGl0bGUiLCI3MCJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiV29ya09yZGVyU3RhdGVTaWduYWwifS1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsiJERhdGF7IldvcmtPcmRlclN0YXRlIn0ifSIgYWx0PSIkVGV4dHsiJERhdGF7IldvcmtPcmRlclN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyBmb250LXNpemU6MTBweDsgZm9udC1zdHlsZTppdGFsaWM7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWd7IklUU01Xb3JrT3JkZXI6Okhvb2sifSAkUURhdGF7IkNoYW5nZU51bWJlciJ9LSRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjojNTU3Nzk5OyI+JFFEYXRheyJXb3JrT3JkZXJUaXRsZSIsIjcwIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGhyIHNpemU9IjIiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICAgICAgICAgIDxjb2xncm91cD4KICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMzAiPgogICAgICAgICAgICAgICAgICAgIDxjb2w+CiAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJJbnN0cnVjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJJbnN0cnVjdGlvbiJ9OiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Ikluc3RydWN0aW9uIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj48dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD48L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJSZXBvcnQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiUmVwb3J0In06Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUmVwb3J0In0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj48dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD48L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiQXR0YWNobWVudCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJBdHRhY2htZW50In06Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMjUwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMTAwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZUlEPSRRRGF0YXsiRmlsZUlEIn07V29ya09yZGVySUQ9JFFEYXRheyJXb3JrT3JkZXJJRCJ9Ij48aW1nIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9ZGlzay1zLnBuZyIgYm9yZGVyPSIwIiBhbHQ9IkRvd25sb2FkIiB0aXRsZT0iRG93bmxvYWQiLz48L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JERhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvdyAtLT4KPCEtLSBlbXB0eSByb3csIGZvciBoYXZpbmcgYSB2YWxpZCBIVE1MIHRhYmxlIGluIHRoZSBhYnNlbmNlIG9mIGF0dGFjaG1lbnRzIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIzIj48L3RkPjwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+PC90cj4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgICAgICAgPGhyIHNpemU9IjIiPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iOTglIiBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgICA8L3RkPgogICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZXRhIC0tPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IldvcmtPcmRlclN0YXRlIn06IDwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyIkRGF0YXsiV29ya09yZGVyU3RhdGUifSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiJERhdGF7IldvcmtPcmRlclN0YXRlIn0ifSZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRDb25maWd7IkZyb250ZW5kOjpJbWFnZVBhdGgifSRRRGF0YXsiV29ya09yZGVyU3RhdGVTaWduYWwifS5wbmciIHRpdGxlPSIkVGV4dHsiJERhdGF7IldvcmtPcmRlclN0YXRlIn0ifSIgYWx0PSIkVGV4dHsiJERhdGF7IldvcmtPcmRlclN0YXRlIn0ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJXb3JrT3JkZXJUeXBlIn06IDwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6RW1wdHlXb3JrT3JkZXJUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVtcHR5V29ya09yZGVyVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJUeXBlIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJXb3JrT3JkZXJUeXBlIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlclR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUGxhbm5lZFN0YXJ0VGltZSJ9OiA8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkVtcHR5UGxhbm5lZFN0YXJ0VGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eVBsYW5uZWRTdGFydFRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlBsYW5uZWRTdGFydFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiUGxhbm5lZFN0YXJ0VGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IlBsYW5uZWRTdGFydFRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpQbGFubmVkU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUGxhbm5lZEVuZFRpbWUifTogPC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpFbXB0eVBsYW5uZWRFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVtcHR5UGxhbm5lZEVuZFRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlBsYW5uZWRFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlBsYW5uZWRFbmRUaW1lIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVMb25neyIkRGF0YXsiUGxhbm5lZEVuZFRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpQbGFubmVkRW5kVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkFjdHVhbFN0YXJ0VGltZSJ9OiA8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkVtcHR5QWN0dWFsU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVtcHR5QWN0dWFsU3RhcnRUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpBY3R1YWxTdGFydFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQWN0dWFsU3RhcnRUaW1lIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVMb25neyIkRGF0YXsiQWN0dWFsU3RhcnRUaW1lIn0ifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QWN0dWFsU3RhcnRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQWN0dWFsRW5kVGltZSJ9OiA8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkVtcHR5QWN0dWFsRW5kVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eUFjdHVhbEVuZFRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOkFjdHVhbEVuZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQWN0dWFsRW5kVGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkFjdHVhbEVuZFRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpBY3R1YWxFbmRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2hvd1BsYW5uZWRFZmZvcnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJQbGFubmVkRWZmb3J0In06IDwvYj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6RW1wdHlQbGFubmVkRWZmb3J0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVtcHR5UGxhbm5lZEVmZm9ydCAtLT4KPCEtLSBkdGw6YmxvY2s6UGxhbm5lZEVmZm9ydCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJQbGFubmVkRWZmb3J0In0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJQbGFubmVkRWZmb3J0In0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlBsYW5uZWRFZmZvcnQgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNob3dQbGFubmVkRWZmb3J0IC0tPgo8IS0tIGR0bDpibG9jazpTaG93QWNjb3VudGVkVGltZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkFjY291bnRlZFRpbWUifTogPC9iPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpFbXB0eUFjY291bnRlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6RW1wdHlBY2NvdW50ZWRUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpBY2NvdW50ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkFjY291bnRlZFRpbWUifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkFjY291bnRlZFRpbWUifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QWNjb3VudGVkVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2hvd0FjY291bnRlZFRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgoKIyBzaG93IFdvcmtPcmRlckZyZWVLZXkgYW5kIFdvcmtPcmRlckZyZWVUZXh0IGZpZWxkcwo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kUURhdGF7IldvcmtPcmRlckZyZWVLZXkiLCIyNSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dFBsYWluIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IldvcmtPcmRlckZyZWVUZXh0In0iPiRRRGF0YXsiV29ya09yZGVyRnJlZVRleHQiLCIyNSJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0UGxhaW4gLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0TGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dCJ9Ij48YSBocmVmPSIkRGF0YXsiV29ya09yZGVyRnJlZVRleHRMaW5rIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IldvcmtPcmRlckZyZWVUZXh0IiwiMjUifTwvYT48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dCAtLT4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRTcGFjZXIgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dFNwYWNlciAtLT4KCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGV4YW1wbGUgZm9yIGN1c3RvbWl6YXRpb24gb2Ygc2luZ2xlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiM8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFFEYXRheyJXb3JrT3JkZXJGcmVlS2V5MSIsIjI1In06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4KIzwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0UGxhaW4xIC0tPgojICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MSJ9Ij4kUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MSIsIjI1In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0UGxhaW4xIC0tPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRMaW5rMSAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDEifSI+PGEgaHJlZj0iJENvbmZpZ3siV29ya09yZGVyRnJlZVRleHRMaW5rMSJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDEiLCIyNSJ9PC9hPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRMaW5rMSAtLT4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQxIC0tPgojCiM8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFFEYXRheyJXb3JrT3JkZXJGcmVlS2V5MiIsIjI1In06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4KIzwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0UGxhaW4yIC0tPgojICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MiJ9Ij4kUURhdGF7IldvcmtPcmRlckZyZWVUZXh0MiIsIjI1In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckZyZWVUZXh0UGxhaW4yIC0tPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRMaW5rMiAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDIifSI+PGEgaHJlZj0iJENvbmZpZ3siV29ya09yZGVyRnJlZVRleHRMaW5rMiJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJXb3JrT3JkZXJGcmVlVGV4dDIiLCIyNSJ9PC9hPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHRMaW5rMiAtLT4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyRnJlZVRleHQyIC0tPgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ2hhbmdlIEJ1aWxkZXIifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkVtcHR5Q2hhbmdlQnVpbGRlciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iLSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbXB0eUNoYW5nZUJ1aWxkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUJ1aWxkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VCdWlsZGVyVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VCdWlsZGVyVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VCdWlsZGVyVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlQnVpbGRlclVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkNoYW5nZUJ1aWxkZXIgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiV29ya09yZGVyQWdlbnQifTo8L2I+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkVtcHR5V29ya09yZGVyQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6RW1wdHlXb3JrT3JkZXJBZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVyQWdlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiV29ya09yZGVyQWdlbnRVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiV29ya09yZGVyQWdlbnRVc2VyRmlyc3RuYW1lIn0gJERhdGF7IldvcmtPcmRlckFnZW50VXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJXb3JrT3JkZXJBZ2VudFVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IldvcmtPcmRlckFnZW50VXNlckZpcnN0bmFtZSJ9ICREYXRheyJXb3JrT3JkZXJBZ2VudFVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ3JlYXRlVGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDcmVhdGVVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlVGltZSJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCBieSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVTaW1wbGUgLS0+CiAgICAgICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIElUU01DaGFuZ2UuZHRsIC0gcHJvdmlkZXMgSFRNTCBlbGVtZW50cyBmb3Igd29yayBvcmRlciBncmFwaAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNoYW5nZS5kdGwsdiAxLjMwIDIwMTAvMDYvMjkgMTM6MTE6NDUgc2IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckdyYXBoIC0tPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgogICAgaW1nLndvX3N0YXR1cyAgICAgIHsgbWFyZ2luLXRvcDoycHg7IH0KICAgIGltZy5jaGFuZ2VfdGl0bGUgICB7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyB9CgogICAgZGl2LndvcmtvcmRlcmdyYXBoX21haW4gewogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICAgIHBhZGRpbmc6IDFweDsKICAgIH0KICAgIGRpdi53b3Jrb3JkZXJncmFwaCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMSU7IC8qIGhhc0xheW91dCBmaXggKi8KICAgIH0KICAgIGRpdi5saW5lc19tYWluIHsKICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICB9CiAgICBkaXYubGluZXNfc2NhbGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAkUURhdGF7IkxhYmVsTWFyZ2luIn1weDsKICAgICAgICBwYWRkaW5nLWxlZnQ6ICRRRGF0YXsiTGFiZWxNYXJnaW4ifXB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CiAgICBkaXYuc2NhbGVfaG9yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgZm9udC1zaXplOiAxcHQ7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDE7CiAgICB9CgovKiA8IS0tIGR0bDpibG9jazpDU1NXb3JrT3JkZXJUeXBlIC0tPiAqLwogICAgc3Bhbi4kUURhdGF7IldvcmtPcmRlclR5cGVOYW1lIn0geyBiYWNrZ3JvdW5kLWNvbG9yOiAkUURhdGF7IldvcmtPcmRlclR5cGVDb2xvciJ9OyB9Ci8qIDwhLS0gZHRsOmJsb2NrOkNTU1dvcmtPcmRlclR5cGUgLS0+ICovCgovKiA8IS0tIGR0bDpibG9jazpDU1NUaW1lTGluZSAtLT4gKi8KICAgIGRpdi50aW1lbGluZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJFFEYXRheyJUaW1lTGluZUNvbG9yIn07CiAgICAgICAgbGVmdDogICAgICAgICAgICAgJFFEYXRheyJUaW1lTGluZUxlZnQifSU7CiAgICAgICAgaGVpZ2h0OiAgICAgICAgICAgMTAwJTsKICAgICAgICB3aWR0aDogICAgICAgICAgICAkUURhdGF7IlRpbWVMaW5lV2lkdGgifXB4OwogICAgICAgIGZvbnQtc2l6ZTogICAgICAgIDFwdDsKICAgICAgICBwb3NpdGlvbjogICAgICAgICBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiAgICAgICAgICAyOwogICAgfQoKLyogPCEtLSBkdGw6YmxvY2s6Q1NTVGltZUxpbmUgLS0+ICovCgogICAgZGl2LmxhYmVsIHsKICAgICAgICB3aWR0aDogJFFEYXRheyJMYWJlbFdpZHRoIn1weDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICBkaXYud29ya29yZGVyIHsKICAgICAgICBtYXJnaW4tbGVmdDogJFFEYXRheyJMYWJlbE1hcmdpbiJ9cHg7CiAgICB9CgogICAgZGl2LndvcmtvcmRlciBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgIH0KCiAgICBkaXYud29ya29yZGVyIGEgc3BhbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA1cHg7CiAgICAgICAgbWFyZ2luOiAxcHggYXV0byAycHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQoKICAgIGRpdi53b3Jrb3JkZXIgYSBzcGFuIHNwYW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogNXB4OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBmb250LXNpemU6IDNwdDsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KCiAgICBkaXYud29ya29yZGVyX2luZm9ybWF0aW9uX2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAzcHg7CiAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogNDsKICAgIH0KCiAgICBkaXYud29ya29yZGVyX2luZm9ybWF0aW9uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAycHg7CiAgICAgICAgbGVmdDogMnB4OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNTsKICAgIH0KCiAgICBkaXYud29ya29yZGVyX2luZm9ybWF0aW9uIHRhYmxlIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwogICAgICAgIG1hcmdpbjoycHg7CiAgICAgICAgcGFkZGluZzo0cHg7CiAgICB9CgogICAgZGl2I3dvcmtvcmRlcmdyYXBoIGRpdiBhOmhvdmVyICsgZGl2IGRpdiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICB9CgogICAgc3Bhbi5pbmFjdGl2ZSB7CiAgICAgICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5ID0gNTApOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgIH0KCiAgICBkaXYuc2NhbGUgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBsaWdodGdyZXk7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CiAgICBkaXYuc2NhbGVfZW50cnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDNweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA4cHQ7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgIH0KICAgIGRpdi5zY2FsZV9lbnRyeV90YWlsIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgfQogICAgZGl2LnNjYWxlX2VudHJ5X3RyYWlsIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIH0KCiAgICAuY2xlYXIgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgfQoKICAgIGRpdi5zY2FsZV8wIHsKICAgICAgICBsZWZ0OiAwJTsKICAgIH0KICAgIGRpdi5zY2FsZV8xNSB7CiAgICAgICAgbGVmdDogMTUlOwogICAgfQogICAgZGl2LnNjYWxlXzIwIHsKICAgICAgICBsZWZ0OiAyMCU7CiAgICB9CiAgICBkaXYuc2NhbGVfMzUgewogICAgICAgIGxlZnQ6IDM1JTsKICAgIH0KICAgIGRpdi5zY2FsZV80MCB7CiAgICAgICAgbGVmdDogNDAlOwogICAgfQogICAgZGl2LnNjYWxlXzU1IHsKICAgICAgICBsZWZ0OiA1NSU7CiAgICB9CiAgICBkaXYuc2NhbGVfNjAgewogICAgICAgIGxlZnQ6IDYwJTsKICAgIH0KICAgIGRpdi5zY2FsZV83NSB7CiAgICAgICAgbGVmdDogNzUlOwogICAgfQogICAgZGl2LnNjYWxlXzgwIHsKICAgICAgICBsZWZ0OiA4MCU7CiAgICB9CiAgICBkaXYuc2NhbGVfOTAgewogICAgICAgIGxlZnQ6IDkwJTsKICAgIH0KICAgIGRpdi5zY2FsZV8xMDAgewogICAgICAgIGxlZnQ6IDk5LjklOwogICAgfQoKPC9zdHlsZT4KCjwhLS1baWYgSUVdPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICBkaXYubGluZXNfbWFpbiB7CiAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICB0b3A6IDBweDsKICAgICAgICAgICAgbGVmdDogMHB4OwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIH0KICAgICAgICBkaXYubGluZXNfc2NhbGUgewogICAgICAgICAgICBtYXJnaW4tbGVmdDogNjJweDsKICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIH0KICAgICAgICBzcGFuLmluYWN0aXZlIHsKICAgICAgICAgICAgZmlsdGVyOiBhbHBoYShvcGFjaXR5ID0gNTApOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwhW2VuZGlmXS0tPgo8IS0tW2lmIElFIDZdPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICAvKiBjbGVhciBmaWx0ZXIgcHJvcGVydHkgKi8KICAgICAgICBzcGFuLmluYWN0aXZlIHsKICAgICAgICAgICAgZmlsdGVyOgogICAgICAgIH0KICAgIDwvc3R5bGU+CjwhW2VuZGlmXS0tPgoKPGRpdiBjbGFzcz0id29ya29yZGVyZ3JhcGhfbWFpbiI+CgogICAgPGRpdiBjbGFzcz0id29ya29yZGVyZ3JhcGgiIGlkPSJ3b3Jrb3JkZXJncmFwaCI+CgogICAgICAgIDxkaXYgY2xhc3M9ImxpbmVzX21haW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lc19zY2FsZSI+CjwhLS0gZHRsOmJsb2NrOlRpbWVMaW5lIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZWxpbmUiPiZuYnNwOzwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaW1lTGluZSAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNjYWxlX2hvciBzY2FsZV8wIj4mbmJzcDs8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNjYWxlX2hvciBzY2FsZV8yMCI+Jm5ic3A7PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZV9ob3Igc2NhbGVfNDAiPiZuYnNwOzwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2NhbGVfaG9yIHNjYWxlXzYwIj4mbmJzcDs8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNjYWxlX2hvciBzY2FsZV84MCI+Jm5ic3A7PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZV9ob3Igc2NhbGVfMTAwIj4mbmJzcDs8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+Cgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJJdGVtIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIiB0aXRsZT0iJFFEYXRheyJXb3JrT3JkZXJMYWJlbCJ9Ij4KICAgICAgICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJENvbmZpZ3siRnJvbnRlbmQ6OkltYWdlUGF0aCJ9JFFEYXRheyJXb3JrT3JkZXJTdGF0ZVNpZ25hbCJ9LXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyIkRGF0YXsiV29ya09yZGVyU3RhdGUifSJ9IiBhbHQ9IiRUZXh0eyIkRGF0YXsiV29ya09yZGVyU3RhdGUifSJ9Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn07QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb207V29ya09yZGVySUQ9JExRRGF0YXsiV29ya09yZGVySUQifSI+CiAgICAgICAgICAgICAgICB8LS0+ICRRRGF0YXsiV29ya09yZGVyTnVtYmVyIn0uCjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckl0ZW1TdGF0ZSAtLT4KICAgICAgICAgICAgICAgIC0gJFRleHR7IiREYXRheyJXb3JrT3JkZXJTdGF0ZSJ9In0KPCEtLSBkdGw6YmxvY2s6V29ya09yZGVySXRlbVN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJJdGVtVGl0bGUgLS0+CiAgICAgICAgICAgICAgICAtICRRRGF0YXsiV29ya09yZGVyVGl0bGUiLCIyMCJ9CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckl0ZW1UaXRsZSAtLT4KICAgICAgICAgICAgPC9hPgogICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJJdGVtR3JhcGggLS0+CiAgICAgICAgPGRpdiBjbGFzcz0id29ya29yZGVyIj4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn07QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb207V29ya09yZGVySUQ9JExRRGF0YXsiV29ya09yZGVySUQifSIgY2xhc3M9IndvZGV0YWlsIj4KICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIkUURhdGF7IldvcmtPcmRlclR5cGUifV9wbGFubmVkICREYXRheyJXb3JrT3JkZXJPcGFjaXR5In0iIHN0eWxlPSJsZWZ0OiAkUURhdGF7IlBsYW5uZWRQYWRkaW5nIn0lOyB3aWR0aDogJFFEYXRheyJQbGFubmVkVGlja3MifSUiPiZuYnNwOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJtYXJnaW4tOyBtYXJnaW4tcmlnaHQ6ICRRRGF0YXsiQWN0dWFsVHJhaWxpbmcifSU7Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iJFFEYXRheyJXb3JrT3JkZXJUeXBlIn1fYWN0dWFsICREYXRheyJXb3JrT3JkZXJPcGFjaXR5In0iIHN0eWxlPSJsZWZ0OiAkUURhdGF7IkFjdHVhbFBhZGRpbmcifSU7IHdpZHRoOiAkUURhdGF7IkFjdHVhbFRpY2tzIn0lIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id29ya29yZGVyX2luZm9ybWF0aW9uX2NvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3b3Jrb3JkZXJfaW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iNDAwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHdpZHRoPSIxMzAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCB3aWR0aD0iMjcwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+JFRleHR7IldvcmtvcmRlciBJbmZvcm1hdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJzZWFyY2hhY3RpdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiV29ya09yZGVyVGl0bGUiLCI0MCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJzZWFyY2hwYXNzaXZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IldvcmtPcmRlclN0YXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0ic2VhcmNoYWN0aXZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiV29ya09yZGVyVHlwZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9InNlYXJjaHBhc3NpdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiV29ya09yZGVyQWdlbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpFbXB0eVdvcmtPcmRlckFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVtcHR5V29ya09yZGVyQWdlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckFnZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiV29ya09yZGVyQWdlbnRVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiV29ya09yZGVyQWdlbnRVc2VyRmlyc3RuYW1lIn0gJERhdGF7IldvcmtPcmRlckFnZW50VXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IldvcmtPcmRlckFnZW50VXNlckxvZ2luIiwiMjAifSAoJFF1b3RleyIkRGF0YXsiV29ya09yZGVyQWdlbnRVc2VyRmlyc3RuYW1lIn0gJERhdGF7IldvcmtPcmRlckFnZW50VXNlckxhc3RuYW1lIn0iLCIyMCJ9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpXb3JrT3JkZXJBZ2VudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0ic2VhcmNoYWN0aXZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBsYW5uZWRTdGFydFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lTG9uZ3siJFFEYXRheyJQbGFubmVkU3RhcnRUaW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0ic2VhcmNocGFzc2l2ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQbGFubmVkRW5kVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkUURhdGF7IlBsYW5uZWRFbmRUaW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0ic2VhcmNoYWN0aXZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFjdHVhbFN0YXJ0VGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkUURhdGF7IkFjdHVhbFN0YXJ0VGltZSJ9In0kUURhdGF7IkVtcHR5QWN0dWFsU3RhcnRUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9InNlYXJjaHBhc3NpdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWN0dWFsRW5kVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkUURhdGF7IkFjdHVhbEVuZFRpbWUifSJ9JFFEYXRheyJFbXB0eUFjdHVhbEVuZFRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckl0ZW1HcmFwaCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckl0ZW0gLS0+CiAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OiA1cHg7Ij4mbmJzcDs8L2Rpdj4KICAgIDwvZGl2PgoKPCEtLSBkdGw6YmxvY2s6U2NhbGUgLS0+CiAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nLWxlZnQ6ICRRRGF0YXsiTGFiZWxNYXJnaW4ifXB4OyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2NhbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZV9lbnRyeSBzY2FsZV8wIHNjYWxlX2VudHJ5X3RhaWwiPiRUaW1lTG9uZ3siJERhdGF7IlN0YXJ0VGltZSJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U2NhbGVMYWJlbCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2NhbGVfZW50cnkgJERhdGF7IlNjYWxlQ2xhc3MifSI+JFRpbWVMb25neyIkRGF0YXsiU2NhbGVMYWJlbCJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U2NhbGVMYWJlbCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2NhbGVfZW50cnkgc2NhbGVfOTAgc2NhbGVfZW50cnlfdHJhaWwiPiRUaW1lTG9uZ3siJERhdGF7IkVuZFRpbWUifSJ9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMzBweDsiPiZuYnNwOzwvZGl2Pgo8IS0tIGR0bDpibG9jazpTY2FsZSAtLT4KPC9kaXY+CjwhLS0gZHRsOmJsb2NrOldvcmtPcmRlckdyYXBoIC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS5wbSAtIGFsbCBjaGFuZ2UgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlLnBtLHYgMS4yNTkgMjAxMC8wNy8wMyAwMDozNzo1NiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWNoZTsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIpOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI1OSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UgLSBjaGFuZ2UgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMgZm9yIGNoYW5nZXMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDaGFuZ2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICApOwoKICAgICMgbG9hZCBjaGFuZ2UgbnVtYmVyIGdlbmVyYXRvcgogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpOdW1iZXJHZW5lcmF0b3InKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6TnVtYmVyOjpEYXRlQ2hlY2tzdW0nOwogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJhdG9yTW9kdWxlKSApIHsKICAgICAgICBkaWUgIkNhbid0IGxvYWQgY2hhbmdlIG51bWJlciBnZW5lcmF0b3IgYmFja2VuZCBtb2R1bGUgJEdlbmVyYXRvck1vZHVsZSEgJEAiOwogICAgfQogICAgcHVzaCBASVNBLCAkR2VuZXJhdG9yTW9kdWxlOwoKICAgICMgZ2V0IHRoZSBjYWNoZSBUVEwgKGluIHNlY29uZHMpCiAgICAkU2VsZi0+e0NhY2hlVFRMfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpDYWNoZVRUTCcpICogNjA7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyAgICAgPT4gJ0lUU01DaGFuZ2U6OkV2ZW50TW9kdWxlJywKICAgICAgICBCYXNlT2JqZWN0ID0+ICdDaGFuZ2VPYmplY3QnLAogICAgICAgIE9iamVjdHMgICAgPT4gewogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENoYW5nZUFkZCgpCgpBZGQgYSBuZXcgY2hhbmdlLiBUaGUgVXNlcklkIGlzIHRoZSBvbmx5IHJlcXVpcmVkIHBhcmFtZXRlci4KSW50ZXJuYWxseSBmaXJzdCBhIG1pbmltYWwgY2hhbmdlIGlzIGNyZWF0ZWQsIHRoZW4gQ2hhbmdlVXBkYXRlKCkgaXMgY2FsbGVkLgoKICAgIG15ICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpvcgoKICAgIG15ICRDaGFuZ2VJRCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUFkZCgKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1JlcGxhY2VtZW50IG9mIG1haWwgc2VydmVyJywgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdOZXcgbWFpbCBzZXJ2ZXIgaXMgZmFzdGVyJywgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnT2xkIG1haWwgc2VydmVyIHRvbyBzbG93JywgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgPT4gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIENoYW5nZVN0YXRlID0+ICdhY2NlcHRlZCcKICAgICAgICBDaGFuZ2VTdGF0ZSAgICAgPT4gJ2FjY2VwdGVkJywgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIENoYW5nZVN0YXRlSUQgPT4gNAogICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+IDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBDYXRlZ29yeSA9PiAnMyBub3JtYWwnCiAgICAgICAgQ2F0ZWdvcnkgICAgICAgID0+ICczIG5vcm1hbCcsICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBDYXRlZ29yeUlEID0+IDQKICAgICAgICBJbXBhY3RJRCAgICAgICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIEltcGFjdCA9PiAnNCBoaWdoJwogICAgICAgIEltcGFjdCAgICAgICAgICA9PiAnNCBoaWdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgSW1wYWN0SUQgPT4gNQogICAgICAgIFByaW9yaXR5SUQgICAgICA9PiA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgUHJpb3JpdHkgPT4gJzUgdmVyeSBoaWdoJwogICAgICAgIFByaW9yaXR5ICAgICAgICA9PiAnNSB2ZXJ5IGhpZ2gnLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgUHJpb3JpdHlJRCA9PiA2CiAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFsgMSwgMiwgNCBdLCAgICAgIyBVc2VySURzICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENBQkN1c3RvbWVycyAgICA9PiBbICd0dCcsICdtbScgXSwgICMgQ3VzdG9tZXJVc2VySURzICAjIChvcHRpb25hbCkKICAgICAgICBSZXF1ZXN0ZWRUaW1lICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlRnJlZUtleTEgID0+ICdTdW4nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBjaGFuZ2UgZnJlZWtleSBmaWVsZHMgZnJvbSAxIHRvIElUU01DaGFuZ2U6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBDaGFuZ2VGcmVlVGV4dDEgPT4gJ0VhcnRoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgZnJvbSAxIHRvIElUU01DaGFuZ2U6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhIHBsYWluIHRleHQgdmVyc2lvbiBvZiBhcmd1bWVudHMgd2hpY2ggbWlnaHQgY29udGFpbiBIVE1MIG1hcmt1cAogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhEZXNjcmlwdGlvbiBKdXN0aWZpY2F0aW9uKSkgewoKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICRQYXJhbXsiJHtBcmd1bWVudH1QbGFpbiJ9ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBwYXJhbWV0ZXJzCiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tDaGFuZ2VQYXJhbXMoJVBhcmFtKTsKCiAgICAjIHRyaWdnZXIgQ2hhbmdlQWRkUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VBZGRQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBhIG5ldyBjaGFuZ2UgbnVtYmVyCiAgICBteSAkQ2hhbmdlTnVtYmVyID0gJFNlbGYtPkNoYW5nZU51bWJlckNyZWF0ZSgpOwoKICAgICMgZ2V0IGluaXRpYWwgY2hhbmdlIHN0YXRlIGlkCiAgICBteSAkQ2hhbmdlU3RhdGVJRCA9IGRlbGV0ZSAkUGFyYW17Q2hhbmdlU3RhdGVJRH07CiAgICBpZiAoICEkQ2hhbmdlU3RhdGVJRCApIHsKICAgICAgICBteSAkTmV4dFN0YXRlSURzID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25HZXQoCiAgICAgICAgICAgIFN0YXRlSUQgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgKTsKICAgICAgICAkQ2hhbmdlU3RhdGVJRCA9ICROZXh0U3RhdGVJRHMtPlswXTsKICAgIH0KCiAgICAjIGdldCBkZWZhdWx0IENhdGVnb3J5IGlmIG5vdCBkZWZpbmVkCiAgICBteSAkQ2F0ZWdvcnlJRCA9IGRlbGV0ZSAkUGFyYW17Q2F0ZWdvcnlJRH07CiAgICBpZiAoICEkQ2F0ZWdvcnlJRCApIHsKICAgICAgICBteSAkRGVmYXVsdENhdGVnb3J5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkNhdGVnb3J5OjpEZWZhdWx0Jyk7CiAgICAgICAgJENhdGVnb3J5SUQgPSAkU2VsZi0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICBDSVAgID0+ICREZWZhdWx0Q2F0ZWdvcnksCiAgICAgICAgICAgIFR5cGUgPT4gJ0NhdGVnb3J5JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGRlZmF1bHQgSW1wYWN0IGlmIG5vdCBkZWZpbmVkCiAgICBteSAkSW1wYWN0SUQgPSBkZWxldGUgJFBhcmFte0ltcGFjdElEfTsKICAgIGlmICggISRJbXBhY3RJRCApIHsKICAgICAgICBteSAkRGVmYXVsdEltcGFjdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpJbXBhY3Q6OkRlZmF1bHQnKTsKICAgICAgICAkSW1wYWN0SUQgPSAkU2VsZi0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICBDSVAgID0+ICREZWZhdWx0SW1wYWN0LAogICAgICAgICAgICBUeXBlID0+ICdJbXBhY3QnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZGVmYXVsdCBQcmlvcml0eSBpZiBub3QgZGVmaW5lZAogICAgbXkgJFByaW9yaXR5SUQgPSBkZWxldGUgJFBhcmFte1ByaW9yaXR5SUR9OwogICAgaWYgKCAhJFByaW9yaXR5SUQgKSB7CiAgICAgICAgJFByaW9yaXR5SUQgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICBJbXBhY3RJRCAgID0+ICRJbXBhY3RJRCwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgbm8gY2hhbmdlIGJ1aWxkZXIgaWQgd2FzIGdpdmVuLCB0YWtlIHRoZSB1c2VyIGlkCiAgICBteSAkQ2hhbmdlQnVpbGRlcklEID0gJFBhcmFte0NoYW5nZUJ1aWxkZXJJRH0gfHwgJFBhcmFte1VzZXJJRH07CgogICAgIyBhZGQgY2hhbmdlIHRvIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9pdGVtICcKICAgICAgICAgICAgLiAnKGNoYW5nZV9udW1iZXIsIGNoYW5nZV9zdGF0ZV9pZCwgY2hhbmdlX2J1aWxkZXJfaWQsICcKICAgICAgICAgICAgLiAnY2F0ZWdvcnlfaWQsIGltcGFjdF9pZCwgcHJpb3JpdHlfaWQsICcKICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJENoYW5nZU51bWJlciwgXCRDaGFuZ2VTdGF0ZUlELCBcJENoYW5nZUJ1aWxkZXJJRCwKICAgICAgICAgICAgXCRDYXRlZ29yeUlELCAgIFwkSW1wYWN0SUQsICAgICAgXCRQcmlvcml0eUlELAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBjaGFuZ2UgaWQKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT5DaGFuZ2VMb29rdXAoCiAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICRDaGFuZ2VOdW1iZXIsCiAgICApOwoKICAgIHJldHVybiBpZiAhJENoYW5nZUlEOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgJ0NoYW5nZUdldDo6SUQ6OicgLiAkQ2hhbmdlSUQsCiAgICAgICAgJ0NoYW5nZUxpc3QnLAogICAgICAgICdDaGFuZ2VMb29rdXA6OkNoYW5nZUlEOjonIC4gJENoYW5nZUlELAogICAgICAgICdDaGFuZ2VMb29rdXA6OkNoYW5nZU51bWJlcjo6JyAuICRDaGFuZ2VOdW1iZXIsCiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBDaGFuZ2VBZGRQb3N0LUV2ZW50CiAgICAjICh5ZXMsIHdlIHdhbnQgZG8gZG8gdGhpcyBiZWZvcmUgdGhlIENoYW5nZVVwZGF0ZSEpCiAgICAjIG92ZXJyaWRlIHRoZSBhY3R1YWxseSBwYXNzZWQgY2hhbmdlIHN0YXRlIHdpdGggdGhlIGluaXRpYWwgY2hhbmdlIHN0YXRlCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VBZGRQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIENhdGVnb3J5SUQgICAgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgIEltcGFjdElEICAgICAgPT4gJEltcGFjdElELAogICAgICAgICAgICBQcmlvcml0eUlEICAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZUlELAogICAgICAgICAgICBDaGFuZ2VOdW1iZXIgID0+ICRDaGFuZ2VOdW1iZXIsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdXBkYXRlIGNoYW5nZSB3aXRoIHJlbWFpbmluZyBwYXJhbWV0ZXJzCiAgICAjIHRoZSBhbHJlYWR5IGhhbmRsZXMgcGFyYW1zIGhhdmUgYmVlbiBkZWxldGVkIGZyb20gJVBhcmFtCiAgICBteSAkVXBkYXRlU3VjY2VzcyA9ICRTZWxmLT5DaGFuZ2VVcGRhdGUoCiAgICAgICAgJVBhcmFtLAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICk7CgogICAgIyBjaGVjayB1cGRhdGUgZXJyb3IKICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewoKICAgICAgICAjIGRlbGV0ZSBjaGFuZ2UgaWYgaXQgY291bGQgbm90IGJlIHVwZGF0ZWQKICAgICAgICAkU2VsZi0+Q2hhbmdlRGVsZXRlKAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJENoYW5nZUlEOwp9Cgo9aXRlbSBDaGFuZ2VVcGRhdGUoKQoKVXBkYXRlIGEgY2hhbmdlLgpMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJlbW92ZWQgZnJvbSBDPENoYW5nZVRpdGxlPi4KUGFzc2luZyB1bmRlZmluZWQgdmFsdWVzIGlzIGdlbmVyYWxseSBub3QgYWxsb3dlZC4KQW4gZXhjZXB0aW9uIGlzIHRoZSBwYXJhbWV0ZXIgQzxSZXF1ZXN0ZWRUaW1lPiwgd2hlcmUgdGhlIHVuZGVmaW5lZCB2YWx1ZQppbmRpY2F0ZXMgdGhhdCByZXF1ZXN0ZWQgdGltZSBvZiB0aGUgY2hhbmdlIHNob3VsZCBiZSBjbGVhcmVkLgoKICAgIG15ICRTdWNjZXNzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlVXBkYXRlKAogICAgICAgIENoYW5nZUlEICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgID0+ICdSZXBsYWNlbWVudCBvZiBzbG93IG1haWwgc2VydmVyJywgICMgKG9wdGlvbmFsKQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnTmV3IG1haWwgc2VydmVyIGlzIGZhc3RlcicsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBKdXN0aWZpY2F0aW9uICAgICAgPT4gJ09sZCBtYWlsIHNlcnZlciB0b28gc2xvdycsICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlU3RhdGVJRCAgICAgID0+IDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBDaGFuZ2VTdGF0ZSA9PiAnYWNjZXB0ZWQnCiAgICAgICAgQ2hhbmdlU3RhdGUgICAgICAgID0+ICdhY2NlcHRlZCcsICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBDaGFuZ2VTdGF0ZUlEID0+IDQKICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgICAgPT4gNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlQnVpbGRlcklEICAgID0+IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENhdGVnb3J5SUQgICAgICAgICA9PiA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgQ2F0ZWdvcnkgPT4gJzMgbm9ybWFsJwogICAgICAgIENhdGVnb3J5ICAgICAgICAgICA9PiAnMyBub3JtYWwnLCAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgQ2F0ZWdvcnlJRCA9PiA0CiAgICAgICAgSW1wYWN0SUQgICAgICAgICAgID0+IDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBJbXBhY3QgPT4gJzQgaGlnaCcKICAgICAgICBJbXBhY3QgICAgICAgICAgICAgPT4gJzQgaGlnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIEltcGFjdElEID0+IDUKICAgICAgICBQcmlvcml0eUlEICAgICAgICAgPT4gOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIFByaW9yaXR5ID0+ICc1IHZlcnkgaGlnaCcKICAgICAgICBQcmlvcml0eSAgICAgICAgICAgPT4gJzUgdmVyeSBoaWdoJywgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIFByaW9yaXR5SUQgPT4gNgogICAgICAgIENBQkFnZW50cyAgICAgICAgICA9PiBbIDEsIDIsIDQgXSwgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVXNlcklEcwogICAgICAgIENBQkN1c3RvbWVycyAgICAgICA9PiBbICd0dCcsICdtbScgXSwgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgQ3VzdG9tZXJVc2VySURzCiAgICAgICAgUmVxdWVzdGVkVGltZSAgICAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciAndW5kZWYnLCB3aGljaCBjbGVhcnMgdGhlIHRpbWUKICAgICAgICBDaGFuZ2VGcmVlS2V5MSAgICAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGNoYW5nZSBmcmVla2V5IGZpZWxkcyBmcm9tIDEgdG8gSVRTTUNoYW5nZTo6RnJlZVRleHQ6Ok1heE51bWJlcgogICAgICAgIENoYW5nZUZyZWVUZXh0MSAgICA9PiAnRWFydGgnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIDEgdG8gSVRTTUNoYW5nZTo6RnJlZVRleHQ6Ok1heE51bWJlcgogICAgICAgIEJ5cGFzc1N0YXRlTWFjaGluZSA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwLCBpZiAxIHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgYmUgYnlwYXNzZWQKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENoYW5nZUlEIFVzZXJJRCApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBDaGFuZ2VTdGF0ZSBhbmQgQ2hhbmdlU3RhdGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte0NoYW5nZVN0YXRlfSAmJiAkUGFyYW17Q2hhbmdlU3RhdGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBDaGFuZ2VTdGF0ZSBPUiBDaGFuZ2VTdGF0ZUlEIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdoZW4gdGhlIFN0YXRlIGlzIGdpdmVuLCB0aGVuIGxvb2sgdXAgdGhlIElECiAgICBpZiAoICRQYXJhbXtDaGFuZ2VTdGF0ZX0gKSB7CiAgICAgICAgJFBhcmFte0NoYW5nZVN0YXRlSUR9ID0gJFNlbGYtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkUGFyYW17Q2hhbmdlU3RhdGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyB3aGVuIENJUCBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgZm9yIG15ICRUeXBlIChxdyhDYXRlZ29yeSBJbXBhY3QgUHJpb3JpdHkpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JFR5cGV9ICkgewogICAgICAgICAgICAkUGFyYW17IiR7VHlwZX1JRCJ9ID0gJFNlbGYtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgICAgIENJUCAgPT4gJFBhcmFteyRUeXBlfSwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgbm9ybWFsaXplIHRoZSBUaXRsZSwgd2hlbiBpdCBpcyBnaXZlbgogICAgaWYgKCAkUGFyYW17Q2hhbmdlVGl0bGV9ICYmICFyZWYgJFBhcmFte0NoYW5nZVRpdGxlfSApIHsKCiAgICAgICAgIyByZW1vdmUgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgICAgJFBhcmFte0NoYW5nZVRpdGxlfSA9fiBzeyBcQSBccysgfXt9eG1zOwoKICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgICAgJFBhcmFte0NoYW5nZVRpdGxlfSA9fiBzeyBccysgXHogfXt9eG1zOwogICAgfQoKICAgICMgZ2V0IGEgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGFyZ3VtZW50cyB3aGljaCBtaWdodCBjb250YWluIEhUTUwgbWFya3VwCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24pKSB7CgogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgJFBhcmFteyIke0FyZ3VtZW50fVBsYWluIn0gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgdGhlIGdpdmVuIHBhcmFtZXRlcnMKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja0NoYW5nZVBhcmFtcyglUGFyYW0pOwoKICAgICMgY2hlY2sgc2FuaXR5IG9mIHRoZSBuZXcgc3RhdGUgd2l0aCB0aGUgc3RhdGUgbWFjaGluZQogICAgaWYgKCAkUGFyYW17Q2hhbmdlU3RhdGVJRH0gKSB7CgogICAgICAgICMgZ2V0IGNoYW5nZSBpZAogICAgICAgIG15ICRDaGFuZ2VJRCA9ICRQYXJhbXtDaGFuZ2VJRH07CgogICAgICAgICMgZG8gbm90IGdpdmUgQ2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoKSB0aGUgQ2hhbmdlSUQKICAgICAgICAjIGlmIHRoZSBzdGF0ZW1hY2hpbmUgc2hvdWxkIGJlIGJ5cGFzc2VkLgogICAgICAgICMgQ2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoKSB3aWxsIHRoZW4gcmV0dXJuIGFsbCBjaGFuZ2Ugc3RhdGVzLgogICAgICAgIGlmICggJFBhcmFte0J5cGFzc1N0YXRlTWFjaGluZX0gKSB7CiAgICAgICAgICAgICRDaGFuZ2VJRCA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgcG9zc2libGUgbmV4dCBzdGF0ZXMKICAgICAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhZ3JlcCB7ICRfLT57S2V5fSA9PSAkUGFyYW17Q2hhbmdlU3RhdGVJRH0gfSBAeyRTdGF0ZUxpc3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHN0YXRlICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSBpcyBub3QgYSBwb3NzaWJsZSBuZXh0IHN0YXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmlnZ2VyIENoYW5nZVVwZGF0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlVXBkYXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgb2xkIGRhdGEgdG8gYmUgZ2l2ZW4gdG8gcG9zdCBldmVudCBoYW5kbGVyCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB1cGRhdGUgQ0FCCiAgICBpZiAoIGV4aXN0cyAkUGFyYW17Q0FCQWdlbnRzfSB8fCBleGlzdHMgJFBhcmFte0NBQkN1c3RvbWVyc30gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+Q2hhbmdlQ0FCVXBkYXRlKCVQYXJhbSk7CiAgICB9CgogICAgIyB1cGRhdGUgY2hhbmdlIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IGZpZWxkcwogICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoYW5nZUZyZWVUZXh0VXBkYXRlKCVQYXJhbSk7CgogICAgIyBtYXAgdXBkYXRlIGF0dHJpYnV0ZXMgdG8gY29sdW1uIG5hbWVzCiAgICBteSAlQXR0cmlidXRlID0gKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgICA9PiAndGl0bGUnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnZGVzY3JpcHRpb24nLAogICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnanVzdGlmaWNhdGlvbicsCiAgICAgICAgQ2hhbmdlU3RhdGVJRCAgICAgID0+ICdjaGFuZ2Vfc3RhdGVfaWQnLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCAgICA9PiAnY2hhbmdlX21hbmFnZXJfaWQnLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCAgICA9PiAnY2hhbmdlX2J1aWxkZXJfaWQnLAogICAgICAgIENhdGVnb3J5SUQgICAgICAgICA9PiAnY2F0ZWdvcnlfaWQnLAogICAgICAgIEltcGFjdElEICAgICAgICAgICA9PiAnaW1wYWN0X2lkJywKICAgICAgICBQcmlvcml0eUlEICAgICAgICAgPT4gJ3ByaW9yaXR5X2lkJywKICAgICAgICBSZXF1ZXN0ZWRUaW1lICAgICAgPT4gJ3JlcXVlc3RlZF90aW1lJywKICAgICAgICBEZXNjcmlwdGlvblBsYWluICAgPT4gJ2Rlc2NyaXB0aW9uX3BsYWluJywKICAgICAgICBKdXN0aWZpY2F0aW9uUGxhaW4gPT4gJ2p1c3RpZmljYXRpb25fcGxhaW4nLAogICAgKTsKCiAgICAjIGJ1aWxkIFNRTCB0byB1cGRhdGUgY2hhbmdlCiAgICBteSAkU1FMID0gJ1VQREFURSBjaGFuZ2VfaXRlbSBTRVQgJzsKICAgIG15IEBCaW5kOwoKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAlQXR0cmlidXRlICkgewoKICAgICAgICAjIHByZXNlcnZlIHRoZSBvbGQgdmFsdWUsIHdoZW4gdGhlIGNvbHVtbiBpc24ndCBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIWV4aXN0cyAkUGFyYW17JEF0dHJpYnV0ZX07CgogICAgICAgICMgcGFyYW0gY2hlY2tpbmcgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBzbyB0aGlzIGlzIHNhZmUKICAgICAgICAkU1FMIC49ICIkQXR0cmlidXRleyRBdHRyaWJ1dGV9ID0gPywgIjsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFteyRBdHRyaWJ1dGV9OwogICAgfQoKICAgICRTUUwgLj0gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VXNlcklEfTsKICAgICRTUUwgLj0gJ1dIRVJFIGlkID0gPyc7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NoYW5nZUlEfTsKCiAgICAjIHVwZGF0ZSBjaGFuZ2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnQ2hhbmdlR2V0OjpJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgJ0NoYW5nZUxpc3QnLAogICAgICAgICdDaGFuZ2VMb29rdXA6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAnQ2hhbmdlTG9va3VwOjpDaGFuZ2VOdW1iZXI6OicgLiAkQ2hhbmdlRGF0YS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBDaGFuZ2VVcGRhdGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VVcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIE9sZENoYW5nZURhdGEgPT4gJENoYW5nZURhdGEsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENoYW5nZUdldCgpCgpSZXR1cm4gYSBjaGFuZ2UgYXMgYSBoYXNoIHJlZmVyZW5jZS4KV2hlbiB0aGUgd29ya29yZGVyIGRvZXMgbm90IGV4aXN0LCBhIGZhbHNlIHZhbHVlIGlzIHJldHVybmVkLgpUaGUgb3B0aW9uYWwgb3B0aW9uIEM8TG9nTm8+IHR1cm5zIG9mZiBsb2dnaW5nIHdoZW4gdGhlIGNoYW5nZSBkb2VzIG5vdCBleGlzdC4KCiAgICBteSAkQ2hhbmdlID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIExvZ05vICAgID0+IDEsICAgICAgIyBvcHRpb25hbCwgdHVybnMgb2ZmIGxvZ2dpbmcgd2hlbiB0aGUgY2hhbmdlIGRvZXMgbm90IGV4aXN0CiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CgogICAgJENoYW5nZXtDaGFuZ2VJRH0KICAgICRDaGFuZ2V7Q2hhbmdlTnVtYmVyfQogICAgJENoYW5nZXtDaGFuZ2VTdGF0ZUlEfQogICAgJENoYW5nZXtDaGFuZ2VTdGF0ZX0gICAgICAgICAgICAjIGZldGNoZWQgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nCiAgICAkQ2hhbmdle0NoYW5nZVN0YXRlU2lnbmFsfSAgICAgICMgZmV0Y2hlZCBmcm9tIFN5c0NvbmZpZwogICAgJENoYW5nZXtDaGFuZ2VUaXRsZX0KICAgICRDaGFuZ2V7RGVzY3JpcHRpb259CiAgICAkQ2hhbmdle0Rlc2NyaXB0aW9uUGxhaW59CiAgICAkQ2hhbmdle0p1c3RpZmljYXRpb259CiAgICAkQ2hhbmdle0p1c3RpZmljYXRpb25QbGFpbn0KICAgICRDaGFuZ2V7Q2hhbmdlTWFuYWdlcklEfQogICAgJENoYW5nZXtDaGFuZ2VCdWlsZGVySUR9CiAgICAkQ2hhbmdle0NhdGVnb3J5SUR9CiAgICAkQ2hhbmdle0NhdGVnb3J5fQogICAgJENoYW5nZXtJbXBhY3RJRH0KICAgICRDaGFuZ2V7SW1wYWN0fQogICAgJENoYW5nZXtQcmlvcml0eUlEfQogICAgJENoYW5nZXtQcmlvcml0eX0KICAgICRDaGFuZ2V7V29ya09yZGVySURzfSAgICAgICAgICAgIyBhcnJheSByZWZlcmVuY2Ugd2l0aCBXb3JrT3JkZXJJRHMsIHNvcnRlZCBieSBXb3JrT3JkZXJOdW1iZXIKICAgICRDaGFuZ2V7V29ya09yZGVyQ291bnR9ICAgICAgICAgIyBudW1iZXIgb2Ygd29ya29yZGVycwogICAgJENoYW5nZXtDQUJBZ2VudHN9ICAgICAgICAgICAgICAjIGFycmF5IHJlZmVyZW5jZSB3aXRoIENBQiBBZ2VudCBVc2VySURzCiAgICAkQ2hhbmdle0NBQkN1c3RvbWVyc30gICAgICAgICAgICMgYXJyYXkgcmVmZXJlbmNlIHdpdGggQ0FCIEN1c3RvbWVyVXNlcklEcwogICAgJENoYW5nZXtQbGFubmVkU3RhcnRUaW1lfSAgICAgICAjIGRldGVybWluZWQgZnJvbSB0aGUgd29ya29yZGVycwogICAgJENoYW5nZXtQbGFubmVkRW5kVGltZX0gICAgICAgICAjIGRldGVybWluZWQgZnJvbSB0aGUgd29ya29yZGVycwogICAgJENoYW5nZXtBY3R1YWxTdGFydFRpbWV9ICAgICAgICAjIGRldGVybWluZWQgZnJvbSB0aGUgd29ya29yZGVycwogICAgJENoYW5nZXtBY3R1YWxFbmRUaW1lfSAgICAgICAgICAjIGRldGVybWluZWQgZnJvbSB0aGUgd29ya29yZGVycwogICAgJENoYW5nZXtQbGFubmVkRWZmb3J0fSAgICAgICAgICAjIGRldGVybWluZWQgZnJvbSB0aGUgd29ya29yZGVycwogICAgJENoYW5nZXtBY2NvdW50ZWRUaW1lfSAgICAgICAgICAjIGRldGVybWluZWQgZnJvbSB0aGUgd29ya29yZGVycwogICAgJENoYW5nZXtSZXF1ZXN0ZWRUaW1lfQogICAgJENoYW5nZXtDaGFuZ2VGcmVlS2V5MX0gICAgICAgICAjIGNoYW5nZSBmcmVla2V5IGZpZWxkcyBmcm9tIDEgdG8gSVRTTUNoYW5nZTo6RnJlZVRleHQ6Ok1heE51bWJlcgogICAgJENoYW5nZXtDaGFuZ2VGcmVlVGV4dDF9ICAgICAgICAjIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgZnJvbSAxIHRvIElUU01DaGFuZ2U6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICRDaGFuZ2V7Q3JlYXRlVGltZX0KICAgICRDaGFuZ2V7Q3JlYXRlQnl9CiAgICAkQ2hhbmdle0NoYW5nZVRpbWV9CiAgICAkQ2hhbmdle0NoYW5nZUJ5fQoKPWN1dAoKc3ViIENoYW5nZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdDaGFuZ2VHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfTsKICAgIG15ICRDYWNoZSAgICA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBteSAlQ2hhbmdlRGF0YTsKCiAgICBpZiAoJENhY2hlKSB7CiAgICAgICAgJUNoYW5nZURhdGEgPSAleyRDYWNoZX07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGRhdGFiYXNlCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNoYW5nZV9udW1iZXIsIHRpdGxlLCAnCiAgICAgICAgICAgICAgICAuICdkZXNjcmlwdGlvbiwgZGVzY3JpcHRpb25fcGxhaW4sICcKICAgICAgICAgICAgICAgIC4gJ2p1c3RpZmljYXRpb24sIGp1c3RpZmljYXRpb25fcGxhaW4sICcKICAgICAgICAgICAgICAgIC4gJ2NoYW5nZV9zdGF0ZV9pZCwgY2hhbmdlX21hbmFnZXJfaWQsIGNoYW5nZV9idWlsZGVyX2lkLCAnCiAgICAgICAgICAgICAgICAuICdjYXRlZ29yeV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCwgJwogICAgICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgJwogICAgICAgICAgICAgICAgLiAncmVxdWVzdGVkX3RpbWUgJwogICAgICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2VfaXRlbSAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8gJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe0NoYW5nZUlEfSAgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDaGFuZ2VOdW1iZXJ9ICAgICAgID0gJFJvd1sxXTsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlVGl0bGV9ICAgICAgICA9IGRlZmluZWQoICRSb3dbMl0gKSA/ICRSb3dbMl0gOiAnJzsKICAgICAgICAgICAgJENoYW5nZURhdGF7RGVzY3JpcHRpb259ICAgICAgICA9IGRlZmluZWQoICRSb3dbM10gKSA/ICRSb3dbM10gOiAnJzsKICAgICAgICAgICAgJENoYW5nZURhdGF7RGVzY3JpcHRpb25QbGFpbn0gICA9IGRlZmluZWQoICRSb3dbNF0gKSA/ICRSb3dbNF0gOiAnJzsKICAgICAgICAgICAgJENoYW5nZURhdGF7SnVzdGlmaWNhdGlvbn0gICAgICA9IGRlZmluZWQoICRSb3dbNV0gKSA/ICRSb3dbNV0gOiAnJzsKICAgICAgICAgICAgJENoYW5nZURhdGF7SnVzdGlmaWNhdGlvblBsYWlufSA9IGRlZmluZWQoICRSb3dbNl0gKSA/ICRSb3dbNl0gOiAnJzsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlU3RhdGVJRH0gICAgICA9ICRSb3dbN107CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe0NoYW5nZU1hbmFnZXJJRH0gICAgPSAkUm93WzhdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDaGFuZ2VCdWlsZGVySUR9ICAgID0gJFJvd1s5XTsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q2F0ZWdvcnlJRH0gICAgICAgICA9ICRSb3dbMTBdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtJbXBhY3RJRH0gICAgICAgICAgID0gJFJvd1sxMV07CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe1ByaW9yaXR5SUR9ICAgICAgICAgPSAkUm93WzEyXTsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q3JlYXRlVGltZX0gICAgICAgICA9ICRSb3dbMTNdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtDcmVhdGVCeX0gICAgICAgICAgID0gJFJvd1sxNF07CiAgICAgICAgICAgICRDaGFuZ2VEYXRhe0NoYW5nZVRpbWV9ICAgICAgICAgPSAkUm93WzE1XTsKICAgICAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlQnl9ICAgICAgICAgICA9ICRSb3dbMTZdOwogICAgICAgICAgICAkQ2hhbmdlRGF0YXtSZXF1ZXN0ZWRUaW1lfSAgICAgID0gJFJvd1sxN107CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgaWYgKCAhJUNoYW5nZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXtMb2dOb30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDaGFuZ2Ugd2l0aCBJRCAkUGFyYW17Q2hhbmdlSUR9IGRvZXMgbm90IGV4aXN0LiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2xlYW51cCB0aW1lIHN0YW1wcyAoc29tZSBkYXRhYmFzZXMgYXJlIHVzaW5nIGUuIGcuIDIwMDgtMDItMjUgMjI6MDM6MDAuMDAwMDAwKQogICAgICAgIFRJTUVGSUVMRDoKICAgICAgICBmb3IgbXkgJFRpbWVmaWVsZCAoICdDcmVhdGVUaW1lJywgJ0NoYW5nZVRpbWUnLCAnUmVxdWVzdGVkVGltZScgKSB7CiAgICAgICAgICAgIG5leHQgVElNRUZJRUxEIGlmICEkQ2hhbmdlRGF0YXskVGltZWZpZWxkfTsKICAgICAgICAgICAgJENoYW5nZURhdGF7JFRpbWVmaWVsZH0KICAgICAgICAgICAgICAgID1+IHN7IFxBICggXGRcZFxkXGQgLSBcZFxkIC0gXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCApIFwuIC4rPyBceiB9eyQxfXhtczsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNoYW5nZSBmcmVla2V5IGFuZCBmcmVldGV4dCBkYXRhCiAgICAgICAgbXkgJENoYW5nZUZyZWVUZXh0ID0gJFNlbGYtPl9DaGFuZ2VGcmVlVGV4dEdldCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcmVzdWx0IHRvIGNoYW5nZSBkYXRhCiAgICAgICAgJUNoYW5nZURhdGEgPSAoICVDaGFuZ2VEYXRhLCAleyRDaGFuZ2VGcmVlVGV4dH0gKTsKCiAgICAgICAgIyBzZXQgY2FjaGUgKGNoYW5nZSBkYXRhIGV4aXN0cyBhdCB0aGlzIHBvaW50LCBpdCB3YXMgY2hlY2tlZCBiZWZvcmUpCiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcJUNoYW5nZURhdGEsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmFtZSBvZiBjaGFuZ2Ugc3RhdGUKICAgIGlmICggJENoYW5nZURhdGF7Q2hhbmdlU3RhdGVJRH0gKSB7CiAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlU3RhdGV9ID0gJFNlbGYtPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VEYXRhe0NoYW5nZVN0YXRlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmFtZXMgZm9yIENJUAogICAgZm9yIG15ICRUeXBlIChxdyhDYXRlZ29yeSBJbXBhY3QgUHJpb3JpdHkpKSB7CiAgICAgICAgaWYgKCAkQ2hhbmdlRGF0YXsiJHtUeXBlfUlEIn0gKSB7CiAgICAgICAgICAgICRDaGFuZ2VEYXRheyRUeXBlfSA9ICRTZWxmLT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgICAgICAgICBJRCAgID0+ICRDaGFuZ2VEYXRheyIke1R5cGV9SUQifSwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHRoZSBjaGFuZ2Ugc3RhdGUgc2lnbmFsCiAgICBpZiAoICRDaGFuZ2VEYXRhe0NoYW5nZVN0YXRlfSApIHsKCiAgICAgICAgIyBnZXQgYWxsIGNoYW5nZSBzdGF0ZSBzaWduYWxzCiAgICAgICAgbXkgJFN0YXRlU2lnbmFsID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OlN0YXRlOjpTaWduYWwnKTsKCiAgICAgICAgJENoYW5nZURhdGF7Q2hhbmdlU3RhdGVTaWduYWx9ID0gJFN0YXRlU2lnbmFsLT57ICRDaGFuZ2VEYXRhe0NoYW5nZVN0YXRlfSB9OwogICAgfQoKICAgICMgZ2V0IENBQiBkYXRhCiAgICBteSAkQ0FCID0gJFNlbGYtPkNoYW5nZUNBQkdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKSB8fCB7fTsKCiAgICAjIGFkZCByZXN1bHQgdG8gY2hhbmdlIGRhdGEKICAgICVDaGFuZ2VEYXRhID0gKCAlQ2hhbmdlRGF0YSwgJXskQ0FCfSApOwoKICAgICMgZ2V0IGFsbCB3b3Jrb3JkZXIgaWRzIGZvciB0aGlzIGNoYW5nZQogICAgbXkgJFdvcmtPcmRlcklEc1JlZiA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGFkZCByZXN1bHQgdG8gY2hhbmdlIGRhdGEKICAgICRDaGFuZ2VEYXRhe1dvcmtPcmRlcklEc30gPSAkV29ya09yZGVySURzUmVmIHx8IFtdOwogICAgJENoYW5nZURhdGF7V29ya09yZGVyQ291bnR9ID0gc2NhbGFyIEB7ICRDaGFuZ2VEYXRhe1dvcmtPcmRlcklEc30gfTsKCiAgICAjIGdldCBwbGFubmVkIGVmZm9ydCBhbmQgYWNjb3VudGVkIHRpbWUgZm9yIHRoZSBjaGFuZ2UKICAgIG15ICRDaGFuZ2VFZmZvcnRzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgbWVyZ2UgZWZmb3J0IGhhc2ggd2l0aCBjaGFuZ2UgaGFzaAogICAgaWYgKAogICAgICAgICRDaGFuZ2VFZmZvcnRzCiAgICAgICAgJiYgcmVmICRDaGFuZ2VFZmZvcnRzIGVxICdIQVNIJwogICAgICAgICYmICV7JENoYW5nZUVmZm9ydHN9CiAgICAgICAgKQogICAgewogICAgICAgICVDaGFuZ2VEYXRhID0gKCAlQ2hhbmdlRGF0YSwgJXskQ2hhbmdlRWZmb3J0c30gKTsKICAgIH0KCiAgICAjIGdldCB0aW1lc3RhbXBzIGZvciB0aGUgY2hhbmdlCiAgICBteSAkQ2hhbmdlVGltZSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQ2hhbmdlVGltZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIG1lcmdlIHRpbWUgaGFzaCB3aXRoIGNoYW5nZSBoYXNoCiAgICBpZiAoCiAgICAgICAgJENoYW5nZVRpbWUKICAgICAgICAmJiByZWYgJENoYW5nZVRpbWUgZXEgJ0hBU0gnCiAgICAgICAgJiYgJXskQ2hhbmdlVGltZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUNoYW5nZURhdGEgPSAoICVDaGFuZ2VEYXRhLCAleyRDaGFuZ2VUaW1lfSApOwogICAgfQoKICAgIHJldHVybiBcJUNoYW5nZURhdGE7Cn0KCj1pdGVtIENoYW5nZUNBQlVwZGF0ZSgpCgpBZGQgb3IgdXBkYXRlIHRoZSBDQUIgb2YgYSBjaGFuZ2UuCk9uZSBvciBib3RoIG9mIENBQkFnZW50cyBhbmQgQ0FCQ3VzdG9tZXJzIG11c3QgYmUgcGFzc2VkLgpQYXNzaW5nIGEgcmVmZXJlbmNlIHRvIGFuIGVtcHR5IGFycmF5IGRlbGV0ZXMgdGhlIHBhcnQgb2YgdGhlIENBQiAoQ0FCQWdlbnRzIG9yIENBQkN1c3RvbWVycykKV2hlbiBhZ2VudHMgb3IgY3VzdG9tZXJzIGFyZSBwYXNzZWQgbXVsdGlwbGUgdGltZXMsIHRoZXkgd2lsbCBiZSBpbnNlcnRlZCBvbmx5IG9uY2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDQUJVcGRhdGUoCiAgICAgICAgQ2hhbmdlSUQgICAgID0+IDEyMywKICAgICAgICBDQUJBZ2VudHMgICAgPT4gWyAxLCAyLCA0IF0sICAgICAjIFVzZXJJRHMgICAgICAgICAgKG9wdGlvbmFsKQogICAgICAgIENBQkN1c3RvbWVycyA9PiBbICd0dCcsICdtbScgXSwgICMgQ3VzdG9tZXJVc2VySURzICAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZUNBQlVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZWl0aGVyIENBQkFnZW50cyBvZiBDQUJDdXN0b21lcnMgb3IgYm90aCBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte0NBQkFnZW50c30gJiYgISRQYXJhbXtDQUJDdXN0b21lcnN9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBwYXJhbWV0ZXIgQ0FCQWdlbnRzIG9yIENBQkN1c3RvbWVycyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ0FCQWdlbnRzIGFuZCBDQUJDdXN0b21lcnMgbXVzdCBiZSBhcnJheSByZWZlcmVuY2VzCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ0FCQWdlbnRzIENBQkN1c3RvbWVycykpIHsKICAgICAgICBpZiAoICRQYXJhbXskQXR0cmlidXRlfSAmJiByZWYgJFBhcmFteyRBdHRyaWJ1dGV9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICRBdHRyaWJ1dGUgaXMgbm90IGFuIGFycnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIENBQkFnZW50cyBhbmQgQ0FCQ3VzdG9tZXJzIGV4aXN0IGluIHRoZSBhZ2VudHMgYW5kIGN1c3RvbWVyIGRhdGFiYXNlcwogICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrQ2hhbmdlUGFyYW1zKCVQYXJhbSk7CgogICAgIyB0cmlnZ2VyIENoYW5nZUNBQlVwZGF0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlQ0FCVXBkYXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgb2xkIENBQiBkYXRhIHRvIGJlIGdpdmVuIHRvIHBvc3QgZXZlbnQgaGFuZGxlcgogICAgbXkgJENoYW5nZUNBQkRhdGEgPSAkU2VsZi0+Q2hhbmdlQ0FCR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZW50ZXIgdGhlIENBQiBBZ2VudHMKICAgIGlmICggJFBhcmFte0NBQkFnZW50c30gKSB7CgogICAgICAgICMgcmVtb3ZlIGFsbCBjdXJyZW50IHVzZXJzIGZyb20gY2FiIHRhYmxlCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY2hhbmdlX2NhYiAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjaGFuZ2VfaWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ0FORCB1c2VyX2lkIElTIE5PVCBOVUxMJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmaWx0ZXIgb3V0IHVuaXF1ZSB1c2VycwogICAgICAgIG15ICVVbmlxdWVVc2VycyA9IG1hcCB7ICRfID0+IDEgfSBAeyAkUGFyYW17Q0FCQWdlbnRzfSB9OwoKICAgICAgICAjIGFkZCB1c2VyIHRvIGNhYiB0YWJsZQogICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlVW5pcXVlVXNlcnMgKSB7CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2VfY2FiICggY2hhbmdlX2lkLCB1c2VyX2lkICkgVkFMVUVTICggPywgPyApJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSwgXCRVc2VySUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBlbnRlciB0aGUgQ0FCIEN1c3RvbWVycwogICAgaWYgKCAkUGFyYW17Q0FCQ3VzdG9tZXJzfSApIHsKCiAgICAgICAgIyByZW1vdmUgYWxsIGN1cnJlbnQgY3VzdG9tZXIgdXNlcnMgZnJvbSBjYWIgdGFibGUKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjaGFuZ2VfY2FiICcKICAgICAgICAgICAgICAgIC4gJ1dIRVJFIGNoYW5nZV9pZCA9ID8gJwogICAgICAgICAgICAgICAgLiAnQU5EIGN1c3RvbWVyX3VzZXJfaWQgSVMgTk9UIE5VTEwnLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICAgICApOwoKICAgICAgICAjIGZpbHRlciBvdXQgdW5pcXVlIGN1c3RvbWVyIHVzZXJzCiAgICAgICAgbXkgJVVuaXF1ZUN1c3RvbWVyVXNlcnMgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJFBhcmFte0NBQkN1c3RvbWVyc30gfTsKCiAgICAgICAgIyBhZGQgdXNlciB0byBjYWIgdGFibGUKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICgga2V5cyAlVW5pcXVlQ3VzdG9tZXJVc2VycyApIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9jYWIgKCBjaGFuZ2VfaWQsIGN1c3RvbWVyX3VzZXJfaWQgKSBWQUxVRVMgKCA/LCA/ICknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9LCBcJEN1c3RvbWVyVXNlcklEIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICBLZXkgID0+ICdDaGFuZ2VDQUJHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICk7CgogICAgIyB0cmlnZ2VyIENoYW5nZUNBQlVwZGF0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZUNBQlVwZGF0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgT2xkQ2hhbmdlQ0FCRGF0YSA9PiAkQ2hhbmdlQ0FCRGF0YSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ2hhbmdlQ0FCR2V0KCkKClJldHVybiB0aGUgQ0FCIG9mIGEgY2hhbmdlIGFzIGEgaGFzaHJlZiwgd2hlcmUgdGhlIHZhbHVlcyBhcmUgYXJyYXlyZWZzLgpUaGUgcmV0dXJuZWQgYXJyYXkgcmVmZXJlbmNlcyBhcmUgc29ydGVkLgoKICAgIG15ICRDaGFuZ2VDQUIgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDQUJHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKUmV0dXJuczoKCiAgICAkQ2hhbmdlQ0FCID0gewogICAgICAgIENBQkFnZW50cyAgICA9PiBbIDEsIDIsIDQgXSwKICAgICAgICBDQUJDdXN0b21lcnMgPT4gWyAnYWEnLCAnYmInIF0sCiAgICB9Cgo9Y3V0CgpzdWIgQ2hhbmdlQ0FCR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWIgZGF0YQogICAgbXkgJUNBQiA9ICgKICAgICAgICBDQUJBZ2VudHMgICAgPT4gW10sCiAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFtdLAogICAgKTsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnQ2hhbmdlQ0FCR2V0OjpJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCRDYWNoZSkgewoKICAgICAgICAjIGdldCBkYXRhIGZyb20gY2FjaGUKICAgICAgICAlQ0FCID0gJXskQ2FjaGV9OwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBkYXRhCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNoYW5nZV9pZCwgdXNlcl9pZCwgY3VzdG9tZXJfdXNlcl9pZCAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9jYWIgV0hFUkUgY2hhbmdlX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICk7CgogICAgICAgIG15ICRFcnJvckNBQklEOwoKICAgICAgICBST1c6CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgbXkgJENBQklEICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAgICAgbXkgJENoYW5nZUlEICAgICAgID0gJFJvd1sxXTsKICAgICAgICAgICAgbXkgJFVzZXJJRCAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFJvd1szXTsKCiAgICAgICAgICAgICMgZXJyb3IgY2hlY2sgaWYgYm90aCBjb2x1bW5zIGFyZSBmaWxsZWQKICAgICAgICAgICAgaWYgKCAkVXNlcklEICYmICRDdXN0b21lclVzZXJJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvckNBQklEID0gJENBQklEOwogICAgICAgICAgICAgICAgbmV4dCBST1c7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIGRhdGEgdG8gQ0FCCiAgICAgICAgICAgIGlmICgkVXNlcklEKSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRDQUJ7Q0FCQWdlbnRzfSB9LCAkVXNlcklEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQ3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgICAgIHB1c2ggQHsgJENBQntDQUJDdXN0b21lcnN9IH0sICRDdXN0b21lclVzZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBlcnJvciBjaGVjayBpZiBib3RoIGNvbHVtbnMgYXJlIGZpbGxlZAogICAgICAgIGlmICgkRXJyb3JDQUJJRCkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJDQUIgdGFibGUgZW50cnkgd2l0aCBJRCAkRXJyb3JDQUJJRCBjb250YWlucyBVc2VySUQgYW5kIEN1c3RvbWVyVXNlcklEISAiCiAgICAgICAgICAgICAgICAgICAgLiAnT25seSBvbmUgYXQgYSB0aW1lIGlzIGFsbG93ZWQhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBzb3J0IHRoZSByZXN1bHRzCiAgICAgICAgQHsgJENBQntDQUJBZ2VudHN9IH0gICAgPSBzb3J0IEB7ICRDQUJ7Q0FCQWdlbnRzfSB9OwogICAgICAgIEB7ICRDQUJ7Q0FCQ3VzdG9tZXJzfSB9ID0gc29ydCBAeyAkQ0FCe0NBQkN1c3RvbWVyc30gfTsKCiAgICAgICAgaWYgKCBAeyAkQ0FCe0NBQkFnZW50c30gfSB8fCBAeyAkQ0FCe0NBQkN1c3RvbWVyc30gfSApIHsKCiAgICAgICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXCVDQUIsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVDQUI7Cn0KCj1pdGVtIENoYW5nZUNBQkRlbGV0ZSgpCgpEZWxldGUgdGhlIENBQiBvZiBhIGNoYW5nZS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNBQkRlbGV0ZSgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlQ0FCRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmlnZ2VyIENoYW5nZUNBQkRlbGV0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlQ0FCRGVsZXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgb2xkIENBQiBkYXRhIHRvIGJlIGdpdmVuIHRvIHBvc3QgZXZlbnQgaGFuZGxlcgogICAgbXkgJENoYW5nZUNBQkRhdGEgPSAkU2VsZi0+Q2hhbmdlQ0FCR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIENBQgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX2NhYiBXSEVSRSBjaGFuZ2VfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgIEtleSAgPT4gJ0NoYW5nZUNBQkdldDo6SUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKCiAgICAjIHRyaWdnZXIgQ2hhbmdlQ0FCRGVsZXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlQ0FCRGVsZXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBPbGRDaGFuZ2VDQUJEYXRhID0+ICRDaGFuZ2VDQUJEYXRhLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDaGFuZ2VMb29rdXAoKQoKUmV0dXJuIHRoZSBjaGFuZ2UgaWQgd2hlbiB0aGUgY2hhbmdlIG51bWJlciBpcyBwYXNzZWQuClJldHVybiB0aGUgY2hhbmdlIG51bWJlciB3aGVuIHRoZSBjaGFuZ2UgaWQgaXMgcGFzc2VkLgpXaGVuIG5vIGNoYW5nZSBpZCBvciBjaGFuZ2UgbnVtYmVyIGlzIGZvdW5kLCB0aGVuIHRoZSB1bmRlZmluZWQgdmFsdWUgaXMgcmV0dXJuZWQuCgogICAgbXkgJENoYW5nZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlTG9va3VwKAogICAgICAgIENoYW5nZU51bWJlciA9PiAnMjAwOTA5MTc0MjAwMDQ2NScsCiAgICApOwoKICAgIG15ICRDaGFuZ2VOdW1iZXIgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VMb29rdXAoCiAgICAgICAgQ2hhbmdlSUQgPT4gNDIsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdGhlIGNoYW5nZSBpZCBvciB0aGUgY2hhbmdlIG51bWJlciBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte0NoYW5nZUlEfSAmJiAhJFBhcmFte0NoYW5nZU51bWJlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIHRoZSBDaGFuZ2VJRCBvciB0aGUgQ2hhbmdlTnVtYmVyIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBvbmx5IG9uZSBvZiBjaGFuZ2UgaWQgYW5kIGNoYW5nZSBudW1iZXIgY2FuIGJlIHBhc3NlZAogICAgaWYgKCAkUGFyYW17Q2hhbmdlSUR9ICYmICRQYXJhbXtDaGFuZ2VOdW1iZXJ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgdGhlIENoYW5nZUlEIG9yIHRoZSBDaGFuZ2VOdW1iZXIsIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGlkCiAgICBpZiAoICRQYXJhbXtDaGFuZ2VOdW1iZXJ9ICkgewoKICAgICAgICBteSAkQ2hhbmdlSUQ7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnQ2hhbmdlTG9va3VwOjpDaGFuZ2VOdW1iZXI6OicgLiAkUGFyYW17Q2hhbmdlTnVtYmVyfTsKICAgICAgICBteSAkQ2FjaGUgICAgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CgogICAgICAgIGlmICgkQ2FjaGUpIHsKCiAgICAgICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjYWNoZQogICAgICAgICAgICAkQ2hhbmdlSUQgPSAkQ2FjaGU7CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfaXRlbSBXSEVSRSBjaGFuZ2VfbnVtYmVyID0gPycsCiAgICAgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2hhbmdlTnVtYmVyfSBdLAogICAgICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAkQ2hhbmdlSUQgPSAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBjYWNoZSBvbmx5IGlmIGNoYW5nZSBpZCBleGlzdHMKICAgICAgICAgICAgaWYgKCRDaGFuZ2VJRCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkQ2hhbmdlSUQ7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIG51bWJlcgogICAgZWxzaWYgKCAkUGFyYW17Q2hhbmdlSUR9ICkgewoKICAgICAgICBteSAkQ2hhbmdlTnVtYmVyOwoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NoYW5nZUxvb2t1cDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9OwogICAgICAgIG15ICRDYWNoZSAgICA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRDYWNoZSkgewoKICAgICAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGNhY2hlCiAgICAgICAgICAgICRDaGFuZ2VOdW1iZXIgPSAkQ2FjaGU7CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgY2hhbmdlX251bWJlciBGUk9NIGNoYW5nZV9pdGVtIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICRDaGFuZ2VOdW1iZXIgPSAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBjYWNoZSBvbmx5IGlmIGNoYW5nZSBudW1iZXIgZXhpc3RzCiAgICAgICAgICAgIGlmICgkQ2hhbmdlTnVtYmVyKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJENoYW5nZU51bWJlciwKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkQ2hhbmdlTnVtYmVyOwogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gQ2hhbmdlTGlzdCgpCgpSZXR1cm4gYSBjaGFuZ2UgaWQgbGlzdCBvZiBhbGwgY2hhbmdlcyBhcyBhbiBhcnJheSByZWZlcmVuY2UuCgogICAgbXkgJENoYW5nZUlEc1JlZiA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgQENoYW5nZUlEczsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnQ2hhbmdlTGlzdCc7CiAgICBteSAkQ2FjaGUgICAgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCRDYWNoZSkgewoKICAgICAgICAjIGdldCBjaG5nZSBpcyBmcm9tIGNhY2hlCiAgICAgICAgQENoYW5nZUlEcyA9IEB7JENhY2hlfTsKICAgIH0KCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGlkcwogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX2l0ZW0nLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQENoYW5nZUlEcywgJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQENoYW5nZUlEcywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXEBDaGFuZ2VJRHM7Cn0KCj1pdGVtIENoYW5nZVNlYXJjaCgpCgpSZXR1cm5zIGVpdGhlciBhIGxpc3QsIGFzIGFuIGFycmF5cmVmLCBvciBhIGNvdW50IG9mIGZvdW5kIGNoYW5nZSBpZHMuClRoZSBjb3VudCBvZiByZXN1bHRzIGlzIHJldHVybmVkIHdoZW4gdGhlIHBhcmFtZXRlciBDPFJlc3VsdCA9ICdDT1VOVCc+IGlzIHBhc3NlZC4KClRoZSBzZWFyY2ggY3JpdGVyaWEgYXJlIGxvZ2ljYWxseSBBTkQgY29ubmVjdGVkLgpXaGVuIGEgbGlzdCBpcyBwYXNzZWQgYXMgY3JpdGVyaXVtLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaXVtCmlzIGlnbm9yZWQuCgogICAgbXkgJENoYW5nZUlEc1JlZiA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgPT4gJzIwMDkxMDAxMTIzNDU3NzgnLCAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIENoYW5nZVRpdGxlICAgICAgICA9PiAnUmVwbGFjZW1lbnQgb2Ygc2xvdyBtYWlsIHNlcnZlcicsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJ05ldyBtYWlsIHNlcnZlciBpcyBmYXN0ZXInLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSnVzdGlmaWNhdGlvbiAgICAgID0+ICdPbGQgbWFpbCBzZXJ2ZXIgdG9vIHNsb3cnLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGFycmF5IHBhcmFtZXRlcnMgYXJlIHVzZWQgd2l0aCBsb2dpY2FsIE9SIG9wZXJhdG9yCiAgICAgICAgQ2hhbmdlU3RhdGVJRHMgICAgID0+IFsgMTEsIDEyLCAxMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZVN0YXRlcyAgICAgICA9PiBbICdyZXF1ZXN0ZWQnLCAnZmFpbGVkJyBdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VNYW5hZ2VySURzICAgPT4gWyAxLCAyLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2hhbmdlQnVpbGRlcklEcyAgID0+IFsgNSwgNywgNCBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICA9PiBbIDUsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgPT4gWyAzLCAyLCAxIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyQWdlbnRJRHMgID0+IFsgNiwgMiBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENBQkFnZW50cyAgICAgICAgICA9PiBbIDksIDEzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDQUJDdXN0b21lcnMgICAgICAgPT4gWyAndHQnLCAneHgnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2F0ZWdvcmllcyAgICAgICAgID0+IFsgJzEgdmVyeSBsb3cnLCAnMiBsb3cnIF0sICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENhdGVnb3J5SURzICAgICAgICA9PiBbIDEzNSwgMTczIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbXBhY3RzICAgICAgICAgICAgPT4gWyAnMSB2ZXJ5IGxvdycsICcyIGxvdycgXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW1wYWN0SURzICAgICAgICAgID0+IFsgMTM2LCAxNzQgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFByaW9yaXRpZXMgICAgICAgICA9PiBbICcxIHZlcnkgbG93JywgJzIgbG93JyBdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQcmlvcml0eUlEcyAgICAgICAgPT4gWyAxMzcsIDE3NSBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgc2VhcmNoIGluIGNoYW5nZSBmcmVldGV4dCBhbmQgZnJlZWtleSBmaWVsZHMKICAgICAgICBDaGFuZ2VGcmVlS2V5MSAgICAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGNoYW5nZSBmcmVla2V5IGZpZWxkcyBmcm9tIDEgdG8gSVRTTUNoYW5nZTo6RnJlZVRleHQ6Ok1heE51bWJlcgogICAgICAgIENoYW5nZUZyZWVUZXh0MSAgICA9PiAnRWFydGgnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIDEgdG8gSVRTTUNoYW5nZTo6RnJlZVRleHQ6Ok1heE51bWJlcgoKICAgICAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgZnJlZXRleHQgYW5kIGZyZWVrZXkgZmllbGRzCiAgICAgICAgV29ya09yZGVyRnJlZUtleTEgID0+ICdNb29uJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB3b3Jrb3JkZXIgZnJlZWtleSBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDEgPT4gJ01hcnMnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKCiAgICAgICAgIyBzZWFyY2ggaW4gdGV4dCBmaWVsZHMgb2Ygd29ya29yZGVyIG9iamVjdAogICAgICAgIFdvcmtPcmRlclRpdGxlICAgICAgICAgICAgPT4gJ0Jvb3QgTWFpbHNlcnZlcicsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlckluc3RydWN0aW9uICAgICAgPT4gJ1ByZXNzIHRoZSBidXR0b24uJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlclJlcG9ydCAgICAgICAgICAgPT4gJ01haWxzZXJ2ZXIgaGFzIGJvb3RlZC4nLCAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgKGFycmF5IHBhcmFtcykKICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgICA9PiBbICdhY2NlcHRlZCcsICdyZWFkeScgXSwgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEcyA9PiBbIDEsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggcGxhbm5lZCBzdGFydCB0aW1lIGFmdGVyIC4uLgogICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgY2hhbmdlcyB3aXRoIHBsYW5uZWQgc3RhcnQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY2hhbmdlcyB3aXRoIHBsYW5uZWQgZW5kIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggcGxhbm5lZCBlbmQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY2hhbmdlcyB3aXRoIGFjdHVhbCBzdGFydCB0aW1lIGFmdGVyIC4uLgogICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgY2hhbmdlcyB3aXRoIGFjdHVhbCBzdGFydCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggYWN0dWFsIGVuZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgICAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgY2hhbmdlcyB3aXRoIGFjdHVhbCBlbmQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSAgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgY2hhbmdlcyB3aXRoIGNyZWF0ZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDcmVhdGVUaW1lTmV3ZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGNoYW5nZXMgd2l0aCBjcmVhdGVkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENyZWF0ZVRpbWVPbGRlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGNoYW5nZXMgd2l0aCBjaGFuZ2VkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ2hhbmdlVGltZU5ld2VyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggY2hhbmdlZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBDaGFuZ2VUaW1lT2xkZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggcmVxdWVzdGVkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgUmVxdWVzdGVkVGltZU5ld2VyRGF0ZSAgICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBjaGFuZ2VzIHdpdGggcmVxdWVzdGVkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIFJlcXVlc3RlZFRpbWVPbGRlckRhdGUgICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ0NoYW5nZUlEJywgJ0NoYW5nZU1hbmFnZXJJRCcgXSwgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgZGVmYXVsdDogWyAnQ2hhbmdlSUQnIF0KICAgICAgICAjIChDaGFuZ2VJRCwgQ2hhbmdlTnVtYmVyLCBDaGFuZ2VUaXRsZSwgQ2hhbmdlU3RhdGVJRCwKICAgICAgICAjIENoYW5nZU1hbmFnZXJJRCwgQ2hhbmdlQnVpbGRlcklELAogICAgICAgICMgQ2F0ZWdvcnlJRCwgSW1wYWN0SUQsIFByaW9yaXR5SUQKICAgICAgICAjIFBsYW5uZWRTdGFydFRpbWUsIFBsYW5uZWRFbmRUaW1lLAogICAgICAgICMgQWN0dWFsU3RhcnRUaW1lLCBBY3R1YWxFbmRUaW1lLCBSZXF1ZXN0ZWRUaW1lLAogICAgICAgICMgQ3JlYXRlVGltZSwgQ3JlYXRlQnksIENoYW5nZVRpbWUsIENoYW5nZUJ5KQoKICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgIyBUaGUgT3JkZXJCeURpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIE9yZGVyQnkgYXR0cmlidXRlLgogICAgICAgICMgVGhlIHBhaXJpbmcgaXMgbWFkZSBieSB0aGUgYXJyYXkgaW5kaWNlcy4KCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ0Rvd24nIF0KICAgICAgICAjIChEb3duIHwgVXApCgogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgKDAgfCAxKSBkZWZhdWx0IDEKCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScgfHwgJ0NPVU5UJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBBUlJBWSwgcmV0dXJucyBhbiBhcnJheSBvZiBjaGFuZ2UgaWRzCiAgICAgICAgIyBDT1VOVCByZXR1cm5zIGEgc2NhbGFyIHdpdGggdGhlIG51bWJlciBvZiBmb3VuZCBjaGFuZ2VzCgogICAgICAgIExpbWl0ID0+IDEwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCgogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoCiAgICAgICAgcXcoCiAgICAgICAgT3JkZXJCeQogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24KICAgICAgICBDaGFuZ2VTdGF0ZUlEcwogICAgICAgIENoYW5nZVN0YXRlcwogICAgICAgIENoYW5nZU1hbmFnZXJJRHMKICAgICAgICBDaGFuZ2VCdWlsZGVySURzCiAgICAgICAgQ0FCQWdlbnRzCiAgICAgICAgQ0FCQ3VzdG9tZXJzCiAgICAgICAgV29ya09yZGVyQWdlbnRJRHMKICAgICAgICBXb3JrT3JkZXJTdGF0ZXMKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEcwogICAgICAgIENyZWF0ZUJ5CiAgICAgICAgQ2hhbmdlQnkKICAgICAgICBDYXRlZ29yaWVzCiAgICAgICAgQ2F0ZWdvcnlJRHMKICAgICAgICBJbXBhY3RzCiAgICAgICAgSW1wYWN0SURzCiAgICAgICAgUHJpb3JpdGllcwogICAgICAgIFByaW9yaXR5SURzCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRBcmd1bWVudH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRBcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVmaW5lIG9yZGVyIHRhYmxlCiAgICBteSAlT3JkZXJCeVRhYmxlID0gKAogICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJ2MuaWQnLAogICAgICAgIENoYW5nZU51bWJlciAgICAgPT4gJ2MuY2hhbmdlX251bWJlcicsCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnYy50aXRsZScsCiAgICAgICAgQ2hhbmdlU3RhdGVJRCAgICA9PiAnYy5jaGFuZ2Vfc3RhdGVfaWQnLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCAgPT4gJ2MuY2hhbmdlX21hbmFnZXJfaWQnLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCAgPT4gJ2MuY2hhbmdlX2J1aWxkZXJfaWQnLAogICAgICAgIENhdGVnb3J5SUQgICAgICAgPT4gJ2MuY2F0ZWdvcnlfaWQnLAogICAgICAgIEltcGFjdElEICAgICAgICAgPT4gJ2MuaW1wYWN0X2lkJywKICAgICAgICBQcmlvcml0eUlEICAgICAgID0+ICdjLnByaW9yaXR5X2lkJywKICAgICAgICBDcmVhdGVUaW1lICAgICAgID0+ICdjLmNyZWF0ZV90aW1lJywKICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICdjLmNyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICA9PiAnYy5jaGFuZ2VfdGltZScsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAnYy5jaGFuZ2VfYnknLAogICAgICAgIFJlcXVlc3RlZFRpbWUgICAgPT4gJ2MucmVxdWVzdGVkX3RpbWUnLAogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJ01JTih3bzEucGxhbm5lZF9zdGFydF90aW1lKScsCiAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnTUFYKHdvMS5wbGFubmVkX2VuZF90aW1lKScsCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnTUlOKHdvMS5hY3R1YWxfc3RhcnRfdGltZSknLAogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJ01BWCh3bzEuYWN0dWFsX2VuZF90aW1lKScsCiAgICApOwoKICAgICMgY2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMKICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoICEkT3JkZXJCeSB8fCAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknICIKICAgICAgICAgICAgICAgICAgICAuICdvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicKICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgb25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAjIGZvdW5kIGFuIGVycm9yCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICAjIGNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZSBnaXZlbiBDaGFuZ2VTdGF0ZUlEcyBhcmUgdmFsaWQKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja0NoYW5nZVN0YXRlSURzKCBDaGFuZ2VTdGF0ZUlEcyA9PiAkUGFyYW17Q2hhbmdlU3RhdGVJRHN9ICk7CgogICAgIyBjaGVjayB3aGV0aGVyIGFsbCBvZiB0aGUgZ2l2ZW4gQ2F0ZWdvcnlJRHMsIEltcGFjdElEcyBhbmQgUHJpb3JpdHlJRHMgYXJlIHZhbGlkCiAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5IEltcGFjdCBQcmlvcml0eSkpIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tDaGFuZ2VDSVBJRHMoCiAgICAgICAgICAgIElEcyAgPT4gJFBhcmFteyIke1R5cGV9SURzIn0sCiAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb2sgdXAgYW5kIHRodXMgY2hlY2sgdGhlIFN0YXRlcwogICAgZm9yIG15ICRDaGFuZ2VTdGF0ZSAoIEB7ICRQYXJhbXtDaGFuZ2VTdGF0ZXN9IH0gKSB7CgogICAgICAgICMgbG9vayB1cCB0aGUgSUQgZm9yIHRoZSBuYW1lCiAgICAgICAgbXkgJENoYW5nZVN0YXRlSUQgPSAkU2VsZi0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICRDaGFuZ2VTdGF0ZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIElEIHdhcyBmb3VuZCwgd2hldGhlciB0aGUgbmFtZSBleGlzdHMKICAgICAgICBpZiAoICEkQ2hhbmdlU3RhdGVJRCApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBjaGFuZ2Ugc3RhdGUgJENoYW5nZVN0YXRlIGlzIG5vdCBrbm93biEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17Q2hhbmdlU3RhdGVJRHN9IH0sICRDaGFuZ2VTdGF0ZUlEOwogICAgfQoKICAgICMgbG9vayB1cCBhbmQgdGh1cyBjaGVjayB0aGUgQ0lQcwogICAgbXkgJUNJUFNpbmd1bGFyMlBsdXJhbCA9ICgKICAgICAgICBDYXRlZ29yeSA9PiAnQ2F0ZWdvcmllcycsCiAgICAgICAgSW1wYWN0ICAgPT4gJ0ltcGFjdHMnLAogICAgICAgIFByaW9yaXR5ID0+ICdQcmlvcml0aWVzJywKICAgICk7CgogICAgZm9yIG15ICRDSVBTaW5ndWxhciAoIGtleXMgJUNJUFNpbmd1bGFyMlBsdXJhbCApIHsKICAgICAgICBmb3IgbXkgJENJUCAoIEB7ICRQYXJhbXsgJENJUFNpbmd1bGFyMlBsdXJhbHskQ0lQU2luZ3VsYXJ9IH0gfSApIHsKCiAgICAgICAgICAgICMgbG9vayB1cCB0aGUgSUQgZm9yIHRoZSBuYW1lCiAgICAgICAgICAgIG15ICRDSVBJRCA9ICRTZWxmLT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgICAgICAgICBDSVAgID0+ICRDSVAsCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDSVBTaW5ndWxhciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgSUQgd2FzIGZvdW5kLCB3aGV0aGVyIHRoZSBuYW1lIGV4aXN0cwogICAgICAgICAgICBpZiAoICEkQ0lQSUQgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgJENJUFNpbmd1bGFyICRDSVAgaXMgbm90IGtub3duISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17IiR7Q0lQU2luZ3VsYXJ9SURzIn0gfSwgJENJUElEOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHdvcmtvcmRlciBzdGF0ZXMgLSBpZiBnaXZlbgogICAgcmV0dXJuIGlmICEkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclN0YXRlSURzQ2hlY2soCiAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gJFBhcmFte1dvcmtPcmRlclN0YXRlSURzfSwKICAgICk7CgogICAgIyBsb29rIHVwIGFuZCB0aHVzIGNoZWNrIHRoZSB3b3Jrb3JkZXIgc3RhdGVzCiAgICBmb3IgbXkgJFdvcmtPcmRlclN0YXRlICggQHsgJFBhcmFte1dvcmtPcmRlclN0YXRlc30gfSApIHsKCiAgICAgICAgIyBsb29rIHVwIHRoZSBJRCBmb3IgdGhlIG5hbWUKICAgICAgICBteSAkV29ya09yZGVyU3RhdGVJRCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICRXb3JrT3JkZXJTdGF0ZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIElEIHdhcyBmb3VuZCwgd2hldGhlciB0aGUgbmFtZSBleGlzdHMKICAgICAgICBpZiAoICEkV29ya09yZGVyU3RhdGVJRCApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSB3b3Jrb3JkZXIgc3RhdGUgJFdvcmtPcmRlclN0YXRlIGlzIG5vdCBrbm93biEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9IH0sICRXb3JrT3JkZXJTdGF0ZUlEOwogICAgfQoKICAgIG15IEBTUUxXaGVyZTsgICAgICAgICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSBAU1FMSGF2aW5nOyAgICAgICAgICAjIGFzc2VtYmxlIHRoZSBjb25kaXRpb25zIHVzZWQgaW4gdGhlIEhBVklORyBjbGF1c2UKICAgIG15IEBJbm5lckpvaW5UYWJsZXM7ICAgICMga2VlcCB0cmFjayBvZiB0aGUgdGFibGVzIHRoYXQgbmVlZCB0byBiZSBpbm5lciBqb2luZWQKICAgIG15IEBPdXRlckpvaW5UYWJsZXM7ICAgICMga2VlcCB0cmFjayBvZiB0aGUgdGFibGVzIHRoYXQgbmVlZCB0byBiZSBvdXRlciBqb2luZWQKCiAgICAjIGtlZXAgdHJhY2sgb2YgdGhlIHRhYmxlcyB0aGF0IG5lZWQgdG8gYmUgaW5uZXIgam9pbmVkIGZvciBjaGFuZ2UgZnJlZXRleHQgZmllbGRzCiAgICBteSBASW5uZXJKb2luVGFibGVzQ2hhbmdlRnJlZVRleHQ7CgogICAgIyBrZWVwIHRyYWNrIG9mIHRoZSB0YWJsZXMgdGhhdCBuZWVkIHRvIGJlIGlubmVyIGpvaW5lZCBmb3Igd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgbXkgQElubmVySm9pblRhYmxlc1dvcmtPcmRlckZyZWVUZXh0OwoKICAgICMgYWRkIHN0cmluZyBwYXJhbXMgdG8gdGhlIFdIRVJFIGNsYXVzZQogICAgbXkgJVN0cmluZ1BhcmFtcyA9ICgKCiAgICAgICAgIyBzdHJpbmdzIGluIGNoYW5nZV9pdGVtCiAgICAgICAgQ2hhbmdlTnVtYmVyICA9PiAnYy5jaGFuZ2VfbnVtYmVyJywKICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdjLnRpdGxlJywKICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdjLmRlc2NyaXB0aW9uX3BsYWluJywKICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdjLmp1c3RpZmljYXRpb25fcGxhaW4nLAoKICAgICAgICAjIHN0cmluZ3MgaW4gY2hhbmdlX3dvcmtvcmRlcgogICAgICAgIFdvcmtPcmRlclRpdGxlICAgICAgID0+ICd3bzIudGl0bGUnLAogICAgICAgIFdvcmtPcmRlckluc3RydWN0aW9uID0+ICd3bzIuaW5zdHJ1Y3Rpb25fcGxhaW4nLAogICAgICAgIFdvcmtPcmRlclJlcG9ydCAgICAgID0+ICd3bzIucmVwb3J0X3BsYWluJywKICAgICk7CgogICAgIyBhZGQgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIHRvICVTdHJpbmdQYXJhbXMKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoIHNvcnQga2V5cyAlUGFyYW0gKSB7CgogICAgICAgIG5leHQgQVJHVU1FTlQKICAgICAgICAgICAgaWYgJEFyZ3VtZW50ICF+IG17IFxBICgoIENoYW5nZSB8IFdvcmtPcmRlciApIEZyZWUgKCBUZXh0IHwgS2V5ICkpICggXGQrICkgXHogfXhtczsKCiAgICAgICAgbXkgJFR5cGUgICA9ICQxOwogICAgICAgIG15ICROdW1iZXIgPSAkNDsKCiAgICAgICAgIyBzZXQgdGhlIHRhYmxlIGFsaWFzIGFuZCBjb2x1bW4KICAgICAgICBpZiAoICRUeXBlIGVxICdDaGFuZ2VGcmVlVGV4dCcgKSB7CiAgICAgICAgICAgICRTdHJpbmdQYXJhbXN7JEFyZ3VtZW50fSA9ICdjZnQnIC4gJE51bWJlciAuICcuZmllbGRfdmFsdWUnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdDaGFuZ2VGcmVlS2V5JyApIHsKICAgICAgICAgICAgJFN0cmluZ1BhcmFtc3skQXJndW1lbnR9ID0gJ2NmaycgLiAkTnVtYmVyIC4gJy5maWVsZF92YWx1ZSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlckZyZWVUZXh0JyApIHsKICAgICAgICAgICAgJFN0cmluZ1BhcmFtc3skQXJndW1lbnR9ID0gJ3dmdCcgLiAkTnVtYmVyIC4gJy5maWVsZF92YWx1ZSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlckZyZWVLZXknICkgewogICAgICAgICAgICAkU3RyaW5nUGFyYW1zeyRBcmd1bWVudH0gPSAnd2ZrJyAuICROdW1iZXIgLiAnLmZpZWxkX3ZhbHVlJzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgc3RyaW5nIHBhcmFtcyB0byBzcWwtd2hlcmUtYXJyYXkKICAgIFNUUklOR1BBUkFNOgogICAgZm9yIG15ICRTdHJpbmdQYXJhbSAoIGtleXMgJVN0cmluZ1BhcmFtcyApIHsKCiAgICAgICAgIyBjaGVjayBzdHJpbmcgcGFyYW1zIGZvciB1c2VmdWwgdmFsdWVzLCB0aGUgc3RyaW5nICcwJyBpcyBhbGxvd2VkCiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAhZXhpc3RzICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWRlZmluZWQgJFBhcmFteyRTdHJpbmdQYXJhbX07CiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAkUGFyYW17JFN0cmluZ1BhcmFtfSBlcSAnJzsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFN0cmluZ1BhcmFtfSApOwoKICAgICAgICAjIHdpbGRjYXJkcyBhcmUgdXNlZAogICAgICAgIGlmICggJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKCiAgICAgICAgICAgICMgUXVvdGUKICAgICAgICAgICAgJFBhcmFteyRTdHJpbmdQYXJhbX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskU3RyaW5nUGFyYW19LCAnTGlrZScgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSAqIHdpdGggJQogICAgICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9fiBzeyBcKisgfXslfXhtc2c7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2Ugc3RyaW5nIHBhcmFtcyB3aGljaCBjb250YWluIG9ubHkgJQogICAgICAgICAgICBuZXh0IFNUUklOR1BBUkFNIGlmICRQYXJhbXskU3RyaW5nUGFyYW19ID1+IG17IFxBICUqIFx6IH14bXM7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUigkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0pIExJS0UgTE9XRVIoJyRQYXJhbXskU3RyaW5nUGFyYW19JykiOwogICAgICAgIH0KCiAgICAgICAgIyBubyB3aWxkY2FyZHMgYXJlIHVzZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICAgICAiTE9XRVIoJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19KSA9IExPV0VSKCckUGFyYW17JFN0cmluZ1BhcmFtfScpIjsKICAgICAgICB9CgogICAgICAgIGlmICggJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19ID1+IG17IHdvMiB9eG1zICkgewoKICAgICAgICAgICAgIyB0aGUgY2hhbmdlX3dvcmtvcmRlciB0YWJsZSBuZWVkcyB0byBiZSBqb2luZWQsIHdoZW4gaXQgb2NjdXJzIGluIHRoZSBXSEVSRSBjbGF1c2UKICAgICAgICAgICAgcHVzaCBASW5uZXJKb2luVGFibGVzLCAnd28yJzsKICAgICAgICB9CgogICAgICAgICMgYWRkIGZpZWxkX2lkIHRvIHdoZXJlIGNsYXVzZSBmb3IgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcwogICAgICAgIGlmICggJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19ID1+IG17IFxBICggKCBjZnQgfCBjZmsgKSAoIFxkKyApICkgfXhtcyApIHsKCiAgICAgICAgICAgIG15ICRUYWJsZUFsaWFzID0gJDE7CiAgICAgICAgICAgIG15ICROdW1iZXIgICAgID0gJDM7CgogICAgICAgICAgICAjIGFkZCB0aGUgZmllbGQgaWQgdG8gdGhlIHdoZXJlIGNsYXVzZQogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFRhYmxlQWxpYXMgLiAnLmZpZWxkX2lkID0gJyAuICROdW1iZXI7CgogICAgICAgICAgICAjIHRoZSBjaGFuZ2VfZnJlZXRleHQgYW5kIGNoYW5nZV9mcmVla2V5IHRhYmxlcyBuZWVkIHRvIGJlIGpvaW5lZCwKICAgICAgICAgICAgIyB3aGVuIHRoZXkgb2NjdXIgaW4gdGhlIFdIRVJFIGNsYXVzZQogICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXNDaGFuZ2VGcmVlVGV4dCwgJFRhYmxlQWxpYXM7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBmaWVsZF9pZCB0byB3aGVyZSBjbGF1c2UgZm9yIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgICAgICBlbHNpZiAoICRTdHJpbmdQYXJhbXN7JFN0cmluZ1BhcmFtfSA9fiBteyBcQSAoICggd2Z0IHwgd2ZrICkgKCBcZCsgKSApIH14bXMgKSB7CgogICAgICAgICAgICBteSAkVGFibGVBbGlhcyA9ICQxOwogICAgICAgICAgICBteSAkTnVtYmVyICAgICA9ICQzOwoKICAgICAgICAgICAgIyBhZGQgdGhlIGZpZWxkIGlkIHRvIHRoZSB3aGVyZSBjbGF1c2UKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRUYWJsZUFsaWFzIC4gJy5maWVsZF9pZCA9ICcgLiAkTnVtYmVyOwoKICAgICAgICAgICAgIyB0aGUgY2hhbmdlX3dvX2ZyZWV0ZXh0IGFuZCBjaGFuZ2Vfd29fZnJlZWtleSB0YWJsZXMgbmVlZCB0byBiZSBqb2luZWQsCiAgICAgICAgICAgICMgd2hlbiB0aGV5IG9jY3VyIGluIHRoZSBXSEVSRSBjbGF1c2UKICAgICAgICAgICAgcHVzaCBASW5uZXJKb2luVGFibGVzV29ya09yZGVyRnJlZVRleHQsICRUYWJsZUFsaWFzOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBhcnJheSBwYXJhbXMKICAgIG15ICVBcnJheVBhcmFtcyA9ICgKICAgICAgICBDaGFuZ2VTdGF0ZUlEcyAgID0+ICdjLmNoYW5nZV9zdGF0ZV9pZCcsCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEcyA9PiAnYy5jaGFuZ2VfbWFuYWdlcl9pZCcsCiAgICAgICAgQ2hhbmdlQnVpbGRlcklEcyA9PiAnYy5jaGFuZ2VfYnVpbGRlcl9pZCcsCiAgICAgICAgQ2F0ZWdvcnlJRHMgICAgICA9PiAnYy5jYXRlZ29yeV9pZCcsCiAgICAgICAgSW1wYWN0SURzICAgICAgICA9PiAnYy5pbXBhY3RfaWQnLAogICAgICAgIFByaW9yaXR5SURzICAgICAgPT4gJ2MucHJpb3JpdHlfaWQnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJ2MuY3JlYXRlX2J5JywKICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+ICdjLmNoYW5nZV9ieScsCiAgICApOwoKICAgICMgYWRkIGFycmF5IHBhcmFtcyB0byBzcWwtd2hlcmUtYXJyYXkKICAgIEFSUkFZUEFSQU06CiAgICBmb3IgbXkgJEFycmF5UGFyYW0gKCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgIyBpZ25vcmUgZW1wdHkgbGlzdHMKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkT25lUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiAnLCAnLCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJEFycmF5UGFyYW1zeyRBcnJheVBhcmFtfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBzZXQgdGltZSBwYXJhbXMKICAgIG15ICVUaW1lUGFyYW1zID0gKAoKICAgICAgICAjIHRpbWVzIGluIGNoYW5nZV9pdGVtCiAgICAgICAgQ3JlYXRlVGltZU5ld2VyRGF0ZSAgICA9PiAnYy5jcmVhdGVfdGltZSA+PScsCiAgICAgICAgQ3JlYXRlVGltZU9sZGVyRGF0ZSAgICA9PiAnYy5jcmVhdGVfdGltZSA8PScsCiAgICAgICAgQ2hhbmdlVGltZU5ld2VyRGF0ZSAgICA9PiAnYy5jaGFuZ2VfdGltZSA+PScsCiAgICAgICAgQ2hhbmdlVGltZU9sZGVyRGF0ZSAgICA9PiAnYy5jaGFuZ2VfdGltZSA8PScsCiAgICAgICAgUmVxdWVzdGVkVGltZU5ld2VyRGF0ZSA9PiAnYy5yZXF1ZXN0ZWRfdGltZSA+PScsCiAgICAgICAgUmVxdWVzdGVkVGltZU9sZGVyRGF0ZSA9PiAnYy5yZXF1ZXN0ZWRfdGltZSA8PScsCgogICAgICAgICMgdGltZXMgaW4gY2hhbmdlX3dvcmtvcmRlcgogICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJ21pbih3bzEucGxhbm5lZF9zdGFydF90aW1lKSA+PScsCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnbWluKHdvMS5wbGFubmVkX3N0YXJ0X3RpbWUpIDw9JywKICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSAgID0+ICdtYXgod28xLnBsYW5uZWRfZW5kX3RpbWUpID49JywKICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSAgID0+ICdtYXgod28xLnBsYW5uZWRfZW5kX3RpbWUpIDw9JywKICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgID0+ICdtaW4od28xLmFjdHVhbF9zdGFydF90aW1lKSA+PScsCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlICA9PiAnbWluKHdvMS5hY3R1YWxfc3RhcnRfdGltZSkgPD0nLAogICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgICAgPT4gJ21heCh3bzEuYWN0dWFsX2VuZF90aW1lKSA+PScsCiAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSAgICA9PiAnbWF4KHdvMS5hY3R1YWxfZW5kX3RpbWUpIDw9JywKICAgICk7CgogICAgIyBjaGVjayBhbmQgYWRkIHRpbWUgcGFyYW1zIHRvIFdIRVJFIG9yIEhBVklORyBjbGF1c2UKICAgIFRJTUVQQVJBTToKICAgIGZvciBteSAkVGltZVBhcmFtICgga2V5cyAlVGltZVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBUSU1FUEFSQU0gaWYgISRQYXJhbXskVGltZVBhcmFtfTsKCiAgICAgICAgaWYgKCAkUGFyYW17JFRpbWVQYXJhbX0gIX4gbXsgXEEgXGRcZFxkXGQtXGRcZC1cZFxkIFxzIFxkXGQ6XGRcZDpcZFxkIFx6IH14bXMgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICRUaW1lUGFyYW0gaGFzIGFuIGludmFsaWQgZGF0ZSBmb3JtYXQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRQYXJhbXskVGltZVBhcmFtfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRUaW1lUGFyYW19ICk7CgogICAgICAgIGlmICggJFRpbWVQYXJhbXN7JFRpbWVQYXJhbX0gPX4gbXsgd28xIH14bXMgKSB7CgogICAgICAgICAgICAjIHRoZSBjaGFuZ2Vfd29ya29yZGVyIHRhYmxlIG5lZWRzIHRvIGJlIGpvaW5lZCwgd2hlbiBpdCBvY2N1cnMgaW4gdGhlIEhBVklORyBjbGF1c2UKICAgICAgICAgICAgcHVzaCBAU1FMSGF2aW5nLCAgICAgICAiJFRpbWVQYXJhbXN7JFRpbWVQYXJhbX0gJyRQYXJhbXskVGltZVBhcmFtfSciOwogICAgICAgICAgICBwdXNoIEBPdXRlckpvaW5UYWJsZXMsICd3bzEnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgdGhlIHRpbWUgYXR0cmlidXRlcyBvZiBjaGFuZ2VfaXRlbSBzaG93IHVwIGluIHRoZSBXSEVSRSBjbGF1c2UKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkVGltZVBhcmFtc3skVGltZVBhcmFtfSAnJFBhcmFteyRUaW1lUGFyYW19JyI7CiAgICAgICAgfQogICAgfQoKICAgICMgY29uZGl0aW9ucyBmb3IgQ0FCIHNlYXJjaGVzCiAgICBteSAlQ0FCUGFyYW1zID0gKAogICAgICAgIENBQkFnZW50cyAgICA9PiAnY2FiMS51c2VyX2lkJywKICAgICAgICBDQUJDdXN0b21lcnMgPT4gJ2NhYjIuY3VzdG9tZXJfdXNlcl9pZCcsCiAgICApOwoKICAgICMgYWRkIGNhYiBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBDQUJQQVJBTToKICAgIGZvciBteSAkQ0FCUGFyYW0gKCBrZXlzICVDQUJQYXJhbXMgKSB7CiAgICAgICAgbmV4dCBDQUJQQVJBTSBpZiAhQHsgJFBhcmFteyRDQUJQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JENBQlBhcmFtfSB9ICkgewogICAgICAgICAgICAkT25lUGFyYW0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJE9uZVBhcmFtKTsKICAgICAgICB9CgogICAgICAgIGlmICggJENBQlBhcmFtIGVxICdDQUJBZ2VudHMnICkgewoKICAgICAgICAgICAgIyBDQUJBZ2VudCBpcyBhIGludGVnZXIsIHNvIG5vIHF1b3RlcyBhcmUgbmVlZGVkCiAgICAgICAgICAgIG15ICRJblN0cmluZyA9IGpvaW4gJywgJywgQHsgJFBhcmFteyRDQUJQYXJhbX0gfTsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICAgICAgICAiJENBQlBhcmFtc3skQ0FCUGFyYW19IElOICgkSW5TdHJpbmcpIjsKICAgICAgICAgICAgcHVzaCBASW5uZXJKb2luVGFibGVzLCAnY2FiMSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJENBQlBhcmFtIGVxICdDQUJDdXN0b21lcnMnICkgewoKICAgICAgICAgICAgIyBDQUJDdXN0b21lciBpcyBhIHN0cmluZywgc28gdGhlIHNpbmdsZSBxdW90ZXMgYXJlIG5lZWRlZAogICAgICAgICAgICBteSAkSW5TdHJpbmcgPSBqb2luICcsICcsIG1hcCB7IickXycifSBAeyAkUGFyYW17JENBQlBhcmFtfSB9OwogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgICAgICAgICIkQ0FCUGFyYW1zeyRDQUJQYXJhbX0gSU4gKCRJblN0cmluZykiOwogICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXMsICdjYWIyJzsKICAgICAgICB9CiAgICB9CgogICAgIyB3b3Jrb3JkZXIgYXJyYXkgcGFyYW1zCiAgICBteSAlV29ya09yZGVyQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgV29ya09yZGVyQWdlbnRJRHMgPT4gJ3dvcmtvcmRlcl9hZ2VudF9pZCcsCiAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gJ3dvcmtvcmRlcl9zdGF0ZV9pZCcsCiAgICApOwoKICAgICMgYWRkIHdvcmtvcmRlciBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBXT1JLT1JERVJQQVJBTToKICAgIGZvciBteSAkV29ya09yZGVyUGFyYW0gKCBrZXlzICVXb3JrT3JkZXJBcnJheVBhcmFtcyApIHsKCiAgICAgICAgbmV4dCBXT1JLT1JERVJQQVJBTSBpZiAhQHsgJFBhcmFteyRXb3JrT3JkZXJQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JFdvcmtPcmRlclBhcmFtfSB9ICkgewogICAgICAgICAgICAkT25lUGFyYW0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJE9uZVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHN0cmluZwogICAgICAgIG15ICRJblN0cmluZyA9IGpvaW4gJywgJywgQHsgJFBhcmFteyRXb3JrT3JkZXJQYXJhbX0gfTsKICAgICAgICBteSAkQ29sdW1uTmFtZSA9ICRXb3JrT3JkZXJBcnJheVBhcmFtc3skV29ya09yZGVyUGFyYW19OwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgICAgICAgICJ3bzIuJENvbHVtbk5hbWUgSU4gKCAkSW5TdHJpbmcgKSI7CiAgICAgICAgcHVzaCBASW5uZXJKb2luVGFibGVzLCAnd28yJzsKICAgIH0KCiAgICAjIGRlZmluZSB3aGljaCBwYXJhbWV0ZXIgcmVxdWlyZSBhIGpvaW4gd2l0aCB3b3Jrb3JkZXIgdGFibGUKICAgIG15ICVUYWJsZVJlcXVpcmVzSm9pbiA9ICgKICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+IDEsCiAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAxLAogICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gMSwKICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+IDEsCiAgICApOwoKICAgICMgZGVsZXRlIHRoZSBPcmRlckJ5IHBhcmFtZXRlciB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIGFzc2VtYmxlIHRoZSBPUkRFUiBCWSBjbGF1c2UKICAgIG15IEBTUUxPcmRlckJ5OwogICAgbXkgQFNRTEFsaWFzZXM7ICAgICMgb3JkZXIgYnkgYWxpYXNlcywgYmUgb24gdGhlIHNhdmUgc2lkZSB3aXRoIE15U1FMCiAgICBteSAkQ291bnQgPSAwOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgICMgc2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbgogICAgICAgIG15ICREaXJlY3Rpb24gPSAnREVTQyc7CgogICAgICAgICMgYWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24KICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdBU0MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0RFU0MnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBTUUwKICAgICAgICBpZiAoICRPcmRlckJ5VGFibGV7JE9yZGVyQnl9ID1+IG17IHdvMSB9eG1zICkgewogICAgICAgICAgICBwdXNoIEBTUUxBbGlhc2VzLCAiJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gYXMgYWxpYXNfJE9yZGVyQnkiOwogICAgICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiYWxpYXNfJE9yZGVyQnkgJERpcmVjdGlvbiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gJERpcmVjdGlvbiI7CiAgICAgICAgfQoKICAgICAgICAjIGZvciBzb21lIG9yZGVyIGZpZWxkcywgd2UgbmVlZCB0byBtYWtlIHN1cmUsIHRoYXQgdGhlIHdvMSB0YWJsZSBpcyBqb2luZWQKICAgICAgICBpZiAoICRUYWJsZVJlcXVpcmVzSm9pbnskT3JkZXJCeX0gKSB7CiAgICAgICAgICAgIHB1c2ggQE91dGVySm9pblRhYmxlcywgJ3dvMSc7CiAgICAgICAgfQogICAgfQogICAgY29udGludWUgewogICAgICAgICRDb3VudCsrOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBvcmRlcmluZyBpcyBub3QgZGV0ZXJtaW5lZAogICAgIyB3ZSBhZGQgYW4gZGVzY2VuZGluZyBvcmRlcmluZyBieSBpZAogICAgaWYgKCAhZ3JlcCB7ICRfIGVxICdDaGFuZ2VJRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7Q2hhbmdlSUR9IERFU0MiOwogICAgfQoKICAgICMgYXNzZW1ibGUgdGhlIFNRTCBxdWVyeQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgJyAuIGpvaW4oICcsICcsICggJ2MuaWQnLCBAU1FMQWxpYXNlcyApICkgLiAnIEZST00gY2hhbmdlX2l0ZW0gYyAnOwoKICAgICMgbW9kaWZ5IFNRTCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLCBhbmQgd2hlbiB0aGVyZSBhcmUgbm8gam9pbnMKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICYmICFASW5uZXJKb2luVGFibGVzICYmICFAT3V0ZXJKb2luVGFibGVzICkgewogICAgICAgICRTUUwgICAgICAgID0gJ1NFTEVDVCBDT1VOVChjLmlkKSBGUk9NIGNoYW5nZV9pdGVtIGMgJzsKICAgICAgICBAU1FMT3JkZXJCeSA9ICgpOwogICAgfQoKICAgICMgYWRkIHRoZSBqb2lucwogICAgbXkgJUxvbmdUYWJsZU5hbWUgPSAoCiAgICAgICAgd28xICA9PiAnY2hhbmdlX3dvcmtvcmRlcicsCiAgICAgICAgd28yICA9PiAnY2hhbmdlX3dvcmtvcmRlcicsCiAgICAgICAgY2FiMSA9PiAnY2hhbmdlX2NhYicsCiAgICAgICAgY2FiMiA9PiAnY2hhbmdlX2NhYicsCiAgICApOwogICAgbXkgJVRhYmxlU2VlbjsKCiAgICBJTk5FUl9KT0lOX1RBQkxFOgogICAgZm9yIG15ICRUYWJsZSAoQElubmVySm9pblRhYmxlcykgewoKICAgICAgICAjIGRvIG5vdCBqb2luIGEgdGFibGUgdHdpY2UKICAgICAgICBuZXh0IElOTkVSX0pPSU5fVEFCTEUgaWYgJFRhYmxlU2VlbnskVGFibGV9OwoKICAgICAgICAkVGFibGVTZWVueyRUYWJsZX0gPSAxOwoKICAgICAgICBpZiAoICEkTG9uZ1RhYmxlTmFtZXskVGFibGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5jb3VudGVyZWQgaW52YWxpZCBpbm5lciBqb2luIHRhYmxlICckVGFibGUnISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRTUUwgLj0gIklOTkVSIEpPSU4gJExvbmdUYWJsZU5hbWV7JFRhYmxlfSAkVGFibGUgT04gJFRhYmxlLmNoYW5nZV9pZCA9IGMuaWQgIjsKICAgIH0KCiAgICBJTk5FUl9KT0lOX1RBQkxFX0NIQU5HRV9GUkVFVEVYVDoKICAgIGZvciBteSAkVGFibGUgKEBJbm5lckpvaW5UYWJsZXNDaGFuZ2VGcmVlVGV4dCkgewoKICAgICAgICAjIGNoYW5nZSBmcmVldGV4dAogICAgICAgIGlmICggJFRhYmxlID1+IG17IFxBIGNmdCB9eG1zICkgewogICAgICAgICAgICAkU1FMIC49ICJJTk5FUiBKT0lOIGNoYW5nZV9mcmVldGV4dCAkVGFibGUgT04gJFRhYmxlLmNoYW5nZV9pZCA9IGMuaWQgIjsKICAgICAgICB9CgogICAgICAgICMgY2hhbmdlIGZyZWVrZXkKICAgICAgICBlbHNpZiAoICRUYWJsZSA9fiBteyBcQSBjZmsgfXhtcyApIHsKICAgICAgICAgICAgJFNRTCAuPSAiSU5ORVIgSk9JTiBjaGFuZ2VfZnJlZWtleSAkVGFibGUgT04gJFRhYmxlLmNoYW5nZV9pZCA9IGMuaWQgIjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiB3ZSBuZWVkIGhhdmUgdG8gam9pbiB3b3Jrb3JkZXIgZnJlZXRleHQgdGFibGVzCiAgICBpZiAoQElubmVySm9pblRhYmxlc1dvcmtPcmRlckZyZWVUZXh0KSB7CgogICAgICAgICMgd2UgYWxzbyBuZWVkIHRvIGpvaW4gdGhlIHdvcmtvcmRlciB0YWJsZQogICAgICAgICRTUUwgLj0gJ0lOTkVSIEpPSU4gY2hhbmdlX3dvcmtvcmRlciBPTiBjaGFuZ2Vfd29ya29yZGVyLmNoYW5nZV9pZCA9IGMuaWQgJzsKCiAgICAgICAgSU5ORVJfSk9JTl9UQUJMRV9XT1JLT1JERVJfRlJFRVRFWFQ6CiAgICAgICAgZm9yIG15ICRUYWJsZSAoQElubmVySm9pblRhYmxlc1dvcmtPcmRlckZyZWVUZXh0KSB7CgogICAgICAgICAgICAjIHdvcmtvcmRlciBmcmVldGV4dAogICAgICAgICAgICBpZiAoICRUYWJsZSA9fiBteyBcQSB3ZnQgfXhtcyApIHsKICAgICAgICAgICAgICAgICRTUUwgLj0gIklOTkVSIEpPSU4gY2hhbmdlX3dvX2ZyZWV0ZXh0ICRUYWJsZSAiCiAgICAgICAgICAgICAgICAgICAgLiAiT04gJFRhYmxlLndvcmtvcmRlcl9pZCA9IGNoYW5nZV93b3Jrb3JkZXIuaWQgIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB3b3Jrb3JkZXIgZnJlZWtleQogICAgICAgICAgICBlbHNpZiAoICRUYWJsZSA9fiBteyBcQSB3ZmsgfXhtcyApIHsKICAgICAgICAgICAgICAgICRTUUwgLj0gIklOTkVSIEpPSU4gY2hhbmdlX3dvX2ZyZWVrZXkgJFRhYmxlIE9OICIKICAgICAgICAgICAgICAgICAgICAuICIkVGFibGUud29ya29yZGVyX2lkID0gY2hhbmdlX3dvcmtvcmRlci5pZCAiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIE9VVEVSX0pPSU5fVEFCTEU6CiAgICBmb3IgbXkgJFRhYmxlIChAT3V0ZXJKb2luVGFibGVzKSB7CgogICAgICAgICMgZG8gbm90IGpvaW4gYSB0YWJsZSB0d2ljZSwgd2hlbiBhIHRhYmxlIGhhcyBiZWVuIGlubmVyIGpvaW5lZCwgbm8gb3V0ZXIgam9pbiBpcyBuZWNlc3NhcnkKICAgICAgICBuZXh0IE9VVEVSX0pPSU5fVEFCTEUgaWYgJFRhYmxlU2VlbnskVGFibGV9OwoKICAgICAgICAjIHJlbWVtYmVyIHRoYXQgdGhpcyB0YWJsZSBpcyBqb2luZWQgYWxyZWFkeQogICAgICAgICRUYWJsZVNlZW57JFRhYmxlfSA9IDE7CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICEkTG9uZ1RhYmxlTmFtZXskVGFibGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5jb3VudGVyZWQgaW52YWxpZCBvdXRlciBqb2luIHRhYmxlICckVGFibGUnISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRTUUwgLj0gIkxFRlQgT1VURVIgSk9JTiAkTG9uZ1RhYmxlTmFtZXskVGFibGV9ICRUYWJsZSBPTiAkVGFibGUuY2hhbmdlX2lkID0gYy5pZCAiOwogICAgfQoKICAgICMgYWRkIHRoZSBXSEVSRSBjbGF1c2UKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICAkU1FMIC49ICdXSEVSRSAnOwogICAgICAgICRTUUwgLj0gam9pbiAnIEFORCAnLCBtYXAgeyIoICRfICkifSBAU1FMV2hlcmU7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyB3ZSBuZWVkIHRvIGdyb3VwIHdoZW5ldmVyIHRoZXJlIGlzIGEgam9pbgogICAgaWYgKAogICAgICAgIHNjYWxhciBASW5uZXJKb2luVGFibGVzCiAgICAgICAgfHwgc2NhbGFyIEBJbm5lckpvaW5UYWJsZXNDaGFuZ2VGcmVlVGV4dAogICAgICAgIHx8IHNjYWxhciBASW5uZXJKb2luVGFibGVzV29ya09yZGVyRnJlZVRleHQKICAgICAgICB8fCBzY2FsYXIgQE91dGVySm9pblRhYmxlcwogICAgICAgICkKICAgIHsKICAgICAgICAkU1FMIC49ICdHUk9VUCBCWSBjLmlkICc7CiAgICB9CgogICAgIyBhZGQgdGhlIEhBVklORyBjbGF1c2UKICAgIGlmIChAU1FMSGF2aW5nKSB7CiAgICAgICAgJFNRTCAuPSAnSEFWSU5HICc7CiAgICAgICAgJFNRTCAuPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxIYXZpbmc7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBhZGQgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgJFNRTCAuPSAnT1JERVIgQlkgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBpZ25vcmUgdGhlIHBhcmFtZXRlciAnTGltaXQnIHdoZW4gcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgZGVsZXRlICRQYXJhbXtMaW1pdH07CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICBpZiAoCiAgICAgICAgJFJlc3VsdCBlcSAnQ09VTlQnCiAgICAgICAgJiYgIUBJbm5lckpvaW5UYWJsZXMKICAgICAgICAmJiAhQElubmVySm9pblRhYmxlc0NoYW5nZUZyZWVUZXh0CiAgICAgICAgJiYgIUBJbm5lckpvaW5UYWJsZXNXb3JrT3JkZXJGcmVlVGV4dAogICAgICAgICYmICFAT3V0ZXJKb2luVGFibGVzCiAgICAgICAgKQogICAgewoKICAgICAgICAjIHJldHVybiB0aGUgQ09VTlQoYy5pZCkgYXR0cmlidXRlCiAgICAgICAgcmV0dXJuICRJRHNbMF07CiAgICB9CiAgICBlbHNpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgIyByZXR1cm4gdGhlIGNvdW50IGFzIHRoZSBudW1iZXIgb2YgSURzCiAgICAgICAgcmV0dXJuIHNjYWxhciBASURzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9Cgo9aXRlbSBDaGFuZ2VEZWxldGUoKQoKRGVsZXRlIGEgY2hhbmdlLgoKVGhpcyBmdW5jdGlvbiBmaXJzdCByZW1vdmVzIGFsbCBsaW5rcyBhbmQgYXR0YWNobWVudHMgdG8gdGhlIGdpdmVuIGNoYW5nZS4KVGhlbiBpdCBnZXRzIGEgbGlzdCBvZiBhbGwgd29ya29yZGVycyBvZiB0aGUgY2hhbmdlIGFuZApjYWxscyBDPFdvcmtvcmRlckRlbGV0ZSgpPiBmb3IgZWFjaCB3b3Jrb3JkZXIsIHdoaWNoIHdpbGwgZGVsZXRlCmFsbCBsaW5rcyBhbmQgYWxsIGF0dGFjaG1lbnRzIHRvIHRoZSB3b3Jrb3JkZXJzLgpUaGVuIGl0IGRlbGV0ZXMgdGhlIENBQi4KQWZ0ZXIgdGhhdCB0aGUgY2hhbmdlIGlzIHJlbW92ZWQuClRoZSBoaXN0b3J5IG9mIHRoaXMgY2hhbmdlIHdpbGwgYmUgZGVsZXRlZCBkdXJpbmcgdGhlIGhhbmRsaW5nIG9mIHRoZQp0cmlnZ2VyZWQgQ2hhbmdlRGVsZXRlUG9zdC1ldmVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZURlbGV0ZSgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmlnZ2VyIENoYW5nZURlbGV0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlRGVsZXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB0aGUgY2hhbmdlIGRvZXMgbm90IGV4aXN0LCB3aGVuIGl0IGNhbid0IGJlIGxvb2tlZCB1cAogICAgcmV0dXJuIGlmICEkU2VsZi0+Q2hhbmdlTG9va3VwKAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBsaW5rcyB0byB0aGlzIGNoYW5nZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlQWxsKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIGF0dGFjaG1lbnRzIGFuZCBkZWxldGUgdGhlbQogICAgbXkgJUF0dGFjaG1lbnRzID0gJFNlbGYtPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICApOwogICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJUF0dGFjaG1lbnRzICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPkNoYW5nZUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgIEZpbGVJRCAgID0+ICRGaWxlSUQsCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIGRhdGEgdG8gZ2V0IHRoZSB3b3Jrb3JkZXIgaWRzCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBjaGFuZ2UgY29udGFpbnMgd29ya29yZGVycwogICAgaWYgKAogICAgICAgICRDaGFuZ2VEYXRhCiAgICAgICAgJiYgcmVmICRDaGFuZ2VEYXRhIGVxICdIQVNIJwogICAgICAgICYmICRDaGFuZ2VEYXRhLT57V29ya09yZGVySURzfQogICAgICAgICYmIHJlZiAkQ2hhbmdlRGF0YS0+e1dvcmtPcmRlcklEc30gZXEgJ0FSUkFZJwogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIHdvcmtvcmRlcnMKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHsgJENoYW5nZURhdGEtPntXb3JrT3JkZXJJRHN9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgdGhlIENBQgogICAgcmV0dXJuIGlmICEkU2VsZi0+Q2hhbmdlQ0FCRGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIHRoZSBjaGFuZ2UgZnJlZXRleHQgZmllbGRzCiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hhbmdlRnJlZVRleHREZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnQ2hhbmdlR2V0OjpJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgJ0NoYW5nZUxpc3QnLAogICAgICAgICdDaGFuZ2VMb29rdXA6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAnQ2hhbmdlTG9va3VwOjpDaGFuZ2VOdW1iZXI6OicgLiAkQ2hhbmdlRGF0YS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBDaGFuZ2VEZWxldGVQb3N0LUV2ZW50CiAgICAjIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBkZWxldGluZyB0aGUgY2hhbmdlIGZyb20gdGhlIGRhdGFiYXNlLAogICAgIyBiZWNhdXNlIG9mIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludCBpbiB0aGUgY2hhbmdlX2hpc3RvcnkgdGFibGUKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZURlbGV0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgY2hhbmdlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjaGFuZ2VfaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ2hhbmdlU3RhdGVMb29rdXAoKQoKVGhpcyBtZXRob2QgZG9lcyBhIGxvb2t1cCBmb3IgYSBjaGFuZ2Ugc3RhdGUuIElmIGEgY2hhbmdlIHN0YXRlIGlkIGlzIGdpdmVuLAppdCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2Ugc3RhdGUuIElmIGEgY2hhbmdlIHN0YXRlIG5hbWUgaXMgZ2l2ZW4sCnRoZSBhcHByb3ByaWF0ZSBpZCBpcyByZXR1cm5lZC4KCiAgICBteSAkQ2hhbmdlU3RhdGUgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+IDEyMzQsCiAgICApOwoKICAgIG15ICRDaGFuZ2VTdGF0ZUlEID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ2FjY2VwdGVkJywKICAgICk7Cgo9Y3V0CgpzdWIgQ2hhbmdlU3RhdGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGVpdGhlciBDaGFuZ2VTdGF0ZUlEIG9yIFN0YXRlIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17Q2hhbmdlU3RhdGVJRH0gJiYgISRQYXJhbXtDaGFuZ2VTdGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoYW5nZVN0YXRlSUQgb3IgQ2hhbmdlU3RhdGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSAmJiAkUGFyYW17Q2hhbmdlU3RhdGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDaGFuZ2VTdGF0ZUlEIE9SIENoYW5nZVN0YXRlIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgY2hhbmdlIHN0YXRlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgIG15ICVTdGF0ZUlEMk5hbWUgPSAlewogICAgICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICAgICApCiAgICAgICAgfTsKCiAgICAjIGNoZWNrIHRoZSBzdGF0ZSBoYXNoCiAgICBpZiAoICElU3RhdGVJRDJOYW1lICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IHJldHJpZXZlIGNoYW5nZSBzdGF0ZXMgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSApIHsKICAgICAgICByZXR1cm4gJFN0YXRlSUQyTmFtZXsgJFBhcmFte0NoYW5nZVN0YXRlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXZlcnNlIGtleSAtIHZhbHVlIHBhaXJzIHRvIGhhdmUgdGhlIG5hbWUgYXMga2V5cwogICAgICAgIG15ICVTdGF0ZU5hbWUySUQgPSByZXZlcnNlICVTdGF0ZUlEMk5hbWU7CgogICAgICAgIHJldHVybiAkU3RhdGVOYW1lMklEeyAkUGFyYW17Q2hhbmdlU3RhdGV9IH07CiAgICB9Cn0KCj1pdGVtIENoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHBvc3NpYmxlIGNoYW5nZSBzdGF0ZXMuCklmIENoYW5nZUlEIGlzIG9taXR0ZWQsIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGNoYW5nZSBzdGF0ZXMgaXMgcmV0dXJuZWQuCklmIENoYW5nZUlEIGlzIGdpdmVuLCB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjaGFuZ2Ugc3RhdGVzIGZvciB0aGlzCmNoYW5nZSBpcyByZXR1cm5lZC4KCiAgICBteSAkQ2hhbmdlU3RhdGVMaXN0ID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKClRoZSByZXR1cm4gdmFsdWUgaXMgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgb2YgaGFzaHJlZnMuIFRoZSBlbGVtZW50ICdLZXknIGlzIHRoZW4KdGhlIENoYW5nZVN0YXRlSUQgYW5kIHRoZSBlbGVtZW50ICdWYWx1ZScgaXMgdGhlIG5hbWUgb2YgdGhlIHN0YXRlLiBUaGUgYXJyYXkgZWxlbWVudHMKYXJlIHNvcnRlZCBieSBzdGF0ZSBpZC4KCiAgICBteSAkQ2hhbmdlU3RhdGVMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gMTU2LAogICAgICAgICAgICBWYWx1ZSA9PiAnYXBwcm92ZWQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxNTcsCiAgICAgICAgICAgIFZhbHVlID0+ICdpbiBwcm9ncmVzcycsCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgQ2hhbmdlUG9zc2libGVTdGF0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBsaXN0CiAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICkgfHwge307CgogICAgIyB0byBzdG9yZSBhbiBhcnJheSBvZiBoYXNoIHJlZnMKICAgIG15IEBBcnJheUhhc2hSZWY7CgogICAgIyBpZiBDaGFuZ2VJRCBpcyBnaXZlbiwgb25seSB1c2UgcG9zc2libGUgbmV4dCBzdGF0ZXMgYXMgZGVmaW5lZCBpbiBzdGF0ZSBtYWNoaW5lCiAgICBpZiAoICRQYXJhbXtDaGFuZ2VJRH0gKSB7CgogICAgICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICAgICAgbXkgJENoYW5nZSA9ICRTZWxmLT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZm9yIHN0YXRlIGxvY2sKICAgICAgICBteSAkU3RhdGVMb2NrOwogICAgICAgICRTdGF0ZUxvY2sgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkNvbmRpdGlvbk1hdGNoU3RhdGVMb2NrKAogICAgICAgICAgICBPYmplY3ROYW1lID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgU2VsZWN0b3IgICA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICAgICBTdGF0ZUlEICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VTdGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBhcyBkZWZhdWx0IHN0YXRlIGN1cnJlbnQgc3RhdGUgYW5kIGFsbCBwb3NzaWJsZSBlbmQgc3RhdGVzCiAgICAgICAgbXkgJEVuZFN0YXRlSURzUmVmID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoCiAgICAgICAgICAgIFN0YXRlSUQgPT4gJENoYW5nZS0+e0NoYW5nZVN0YXRlSUR9LAogICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICApIHx8IFtdOwogICAgICAgIG15IEBOZXh0U3RhdGVJRHMgPSBzb3J0ICggQHskRW5kU3RhdGVJRHNSZWZ9LCAkQ2hhbmdlLT57Q2hhbmdlU3RhdGVJRH0gKTsKCiAgICAgICAgIyBnZXQgcG9zc2libGUgbmV4dCBzdGF0ZXMgaWYgbm8gc3RhdGUgbG9jawogICAgICAgIGlmICggISRTdGF0ZUxvY2sgKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgcG9zc2libGUgbmV4dCBzdGF0ZSBpZHMKICAgICAgICAgICAgbXkgJE5leHRTdGF0ZUlEc1JlZiA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICAgICAgU3RhdGVJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgY2hhbmdlIHN0YXRlIGlkIHRvIGxpc3QKICAgICAgICAgICAgQE5leHRTdGF0ZUlEcyA9IHNvcnQgKCBAeyROZXh0U3RhdGVJRHNSZWZ9LCAkQ2hhbmdlLT57Q2hhbmdlU3RhdGVJRH0gKTsKICAgICAgICB9CgogICAgICAgICMgYXNzZW1ibGUgdGhlIGFycmF5IG9mIGhhc2ggcmVmcyB3aXRoIG9ubHkgcG9zc2libGUgbmV4dCBzdGF0ZXMKICAgICAgICBTVEFURUlEOgogICAgICAgIGZvciBteSAkU3RhdGVJRCAoQE5leHRTdGF0ZUlEcykgewoKICAgICAgICAgICAgbmV4dCBTVEFURUlEIGlmICEkU3RhdGVJRDsKCiAgICAgICAgICAgIHB1c2ggQEFycmF5SGFzaFJlZiwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU3RhdGVMaXN0LT57JFN0YXRlSUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwogICAgfQoKICAgICMgYXNzZW1ibGUgdGhlIGFycmF5IG9mIGhhc2ggcmVmcyB3aXRoIGFsbCBuZXh0IHN0YXRlcwogICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICV7JFN0YXRlTGlzdH0gKSB7CiAgICAgICAgcHVzaCBAQXJyYXlIYXNoUmVmLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICBWYWx1ZSA9PiAkU3RhdGVMaXN0LT57JFN0YXRlSUR9LAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwp9Cgo9aXRlbSBDaGFuZ2VQb3NzaWJsZUNJUEdldCgpCgpUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBwb3NzaWJsZSBjYXRlZ29yaWVzLCBpbXBhY3RzIG9yIHByaW9yaXRpZXMuCgogICAgbXkgJENJUExpc3QgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICBUeXBlICAgPT4gJ0NhdGVnb3J5JywgICMgQ2F0ZWdvcnl8SW1wYWN0fFByaW9yaXR5CiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBoYXNocmVmcy4gVGhlIEVsZW1lbnQgJ0tleScgaXMgdGhlbgp0aGUgSUQgYW5kIHRoZSBlbGVtZW50ICdWYWx1ZScgaXMgdGhlIG5hbWUgb2YgdGhlIGNhdGVnb3J5LCBpbXBhY3Qgb3IgcHJpb3JpdHkuClRoZSBhcnJheSBlbGVtZW50cyBhcmUgc29ydGVkIGJ5IGlkIGluIGFzY2VuZGluZyBvcmRlci4KCiAgICBteSAkQ0lQTGlzdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+IDE1NiwKICAgICAgICAgICAgVmFsdWUgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxNTcsCiAgICAgICAgICAgIFZhbHVlID0+ICcyIGxvdycsCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgQ2hhbmdlUG9zc2libGVDSVBHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgVHlwZSBwYXJhbSBmb3IgdmFsaWQgdmFsdWVzCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtUeXBlfQogICAgICAgIHx8ICggJFBhcmFte1R5cGV9IG5lICdDYXRlZ29yeScgJiYgJFBhcmFte1R5cGV9IG5lICdJbXBhY3QnICYmICRQYXJhbXtUeXBlfSBuZSAnUHJpb3JpdHknICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW0gVHlwZSBtdXN0IGJlIGVpdGhlciAiQ2F0ZWdvcnkiIG9yICJJbXBhY3QiIG9yICJQcmlvcml0eSIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBpdGVtIGxpc3QgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZQogICAgbXkgJENJUExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OicgLiAkUGFyYW17VHlwZX0sCiAgICApIHx8IHt9OwoKICAgICMgYXNzZW1ibGUgYW4gYXJyYXkgb2YgaGFzaCByZWZzCiAgICBteSBAQXJyYXlIYXNoUmVmOwogICAgZm9yIG15ICRJRCAoIHNvcnQga2V5cyAleyRDSVBMaXN0fSApIHsKICAgICAgICBwdXNoIEBBcnJheUhhc2hSZWYsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJElELAogICAgICAgICAgICBWYWx1ZSA9PiAkQ0lQTGlzdC0+eyRJRH0sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gXEBBcnJheUhhc2hSZWY7Cn0KCj1pdGVtIENoYW5nZUNJUExvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGNoYW5nZSBjYXRlZ29yeSwgaW1wYWN0IG9yIHByaW9yaXR5LgpJZiBhIGNoYW5nZSBDSVAtSUQgaXMgZ2l2ZW4sIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIENJUC4KSWYgYSBjaGFuZ2UgQ0lQIG5hbWUgaXMgZ2l2ZW4sIHRoZSBhcHByb3ByaWF0ZSBJRCBpcyByZXR1cm5lZC4KCiAgICBteSAkTmFtZSA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICBJRCAgID0+IDEyMzQsCiAgICAgICAgVHlwZSA9PiAnUHJpb3JpdHknLAogICAgKTsKCiAgICBteSAkSUQgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgQ0lQICA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgVHlwZSA9PiAnQ2F0ZWdvcnknLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VDSVBMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGVpdGhlciBJRCBvciBDSVAgbXVzdCBiZSBwYXNzZWQKICAgIGlmICggISRQYXJhbXtJRH0gJiYgISRQYXJhbXtDSVB9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJRCBvciBDSVAhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgbm90IGJvdGggSUQgYW5kIENJUCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte0lEfSAmJiAkUGFyYW17Q0lQfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIElEIE9SIENJUCAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBUeXBlIHBhcmFtIGZvciB2YWxpZCB2YWx1ZXMKICAgIGlmICgKICAgICAgICAhJFBhcmFte1R5cGV9CiAgICAgICAgfHwgKCAkUGFyYW17VHlwZX0gbmUgJ0NhdGVnb3J5JyAmJiAkUGFyYW17VHlwZX0gbmUgJ0ltcGFjdCcgJiYgJFBhcmFte1R5cGV9IG5lICdQcmlvcml0eScgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RoZSBwYXJhbSBUeXBlIG11c3QgYmUgZWl0aGVyICJDYXRlZ29yeSIgb3IgIkltcGFjdCIgb3IgIlByaW9yaXR5IiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBDSVAgZnJvbSBnZW5lcmFsIGNhdGFsb2cKICAgICMgbWFwcGluZyBvZiB0aGUgaWQgdG8gdGhlIG5hbWUKICAgIG15ICVDaGFuZ2VDSVAgPSAlewogICAgICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OicgLiAkUGFyYW17VHlwZX0sCiAgICAgICAgICAgICkgfHwge30KICAgICAgICB9OwoKICAgIGlmICggJFBhcmFte0lEfSApIHsKICAgICAgICByZXR1cm4gJENoYW5nZUNJUHsgJFBhcmFte0lEfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcmV2ZXJzZSBrZXkgLSB2YWx1ZSBwYWlycyB0byBoYXZlIHRoZSBuYW1lIGFzIGtleXMKICAgICAgICBteSAlUmV2ZXJzZWRDaGFuZ2VDSVAgPSByZXZlcnNlICVDaGFuZ2VDSVA7CgogICAgICAgIHJldHVybiAkUmV2ZXJzZWRDaGFuZ2VDSVB7ICRQYXJhbXtDSVB9IH07CiAgICB9Cn0KCj1pdGVtIFBlcm1pc3Npb24oKQoKUmV0dXJucyB3aGV0aGVyIHRoZSBhZ2VudCBDPFVzZXJJRD4gaGFzIHBlcm1pc3Npb25zIG9mIHRoZSB0eXBlIEM8VHlwZT4Kb24gdGhlIGNoYW5nZSBDPENoYW5nZUlEPi4gVGhlIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCBvbiB0bwp0aGUgcGVybWlzc2lvbiBtb2R1bGVzIHRoYXQgd2VyZSByZWdpc3RlcmVkIGluIHRoZSBwZXJtaXNzaW9uIHJlZ2lzdHJ5LgpUaGUgc3RhbmRhcmQgcGVybWlzc2lvbiByZWdpc3RyeSBpcyBCPElUU01DaGFuZ2U6OlBlcm1pc3Npb24+LCBidXQKdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSBwYXJhbWV0ZXIgQzxQZXJtaXNzaW9uUmVnaXN0cnk+LgoKVGhlIG9wdGlvbmFsIG9wdGlvbiBDPExvZ05vPiB0dXJucyBvZmYgbG9nZ2luZyB3aGVuIGFjY2VzcyB3YXMgZGVuaWVkLgpUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBtZXRob2QgaXMgdXNlZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhIGxpbmsgb3IgYW4gYWN0aW9uIHNob3VsZCBiZSBzaG93bi4KCiAgICBteSAkQWNjZXNzID0gJENoYW5nZU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgICAgICAgICAgICA9PiAncm8nLCAgICMgJ3JvJyBhbmQgJ3J3JyBhcmUgc3VwcG9ydGVkCiAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgID0+IDMzMzMsICAgIyBvcHRpb25hbCwgZG8gbm90IHBhc3MgZm9yICdDaGFuZ2VBZGQnCiAgICAgICAgUGVybWlzc2lvblJlZ2lzdHJ5ID0+ICdJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHdpdGggZGVmYXVsdCAnSVRTTUNoYW5nZTo6UGVybWlzc2lvbicKICAgICAgICBDYWNoZWQgICAgICAgICAgICAgPT4gMCwgICAgICAjIG9wdGlvbmFsIHdpdGggZGVmYXVsdCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGFzc2luZyB0aGUgdmFsdWUgMCBpcyB1c2VmdWwgaW4gdGVzdCBzY3JpcHRzCiAgICAgICAgTG9nTm8gICAgICAgICAgICAgID0+IDEsICAgICAgIyBvcHRpb25hbCwgdHVybnMgb2ZmIGxvZ2dpbmcgd2hlbiBhY2Nlc3MgaXMgZGVuaWVkCiAgICApOwoKPWN1dAoKc3ViIFBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVHlwZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgVGhlcmUgYXJlIHZhbGlkIGNhc2VzIHdoZW4gbm8gQ2hhbmdlSUQgaXMgcGFzc2VkLgogICAgIyBFLmcuIGZvciBDaGFuZ2VBZGQoKSBvciBDaGFuZ2VTZWFyY2goKS4KICAgICRQYXJhbXtDaGFuZ2VJRH0gfHw9ICcnOwoKICAgICMgdGhlIHBsYWNlIHdoZXJlIHRoZSBwZXJtaXNzaW9uIG1vZHVsZXMgYXJlIHJlZ2lzdGVyZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHBhcmFtZXRlcgogICAgbXkgJFJlZ2lzdHJ5ID0gJFBhcmFte1Blcm1pc3Npb25SZWdpc3RyeX0gfHwgJ0lUU01DaGFuZ2U6OlBlcm1pc3Npb24nOwoKICAgICMgcnVuIHRoZSByZWxldmFudCBwZXJtaXNzaW9uIG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCRSZWdpc3RyeSkgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNb2R1bGVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJFJlZ2lzdHJ5KSB9OwogICAgICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICVNb2R1bGVzICkgewoKICAgICAgICAgICAgIyBsb2cgdHJ5IG9mIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gPiAxICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVHJ5IHRvIGxvYWQgbW9kdWxlOiAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0hIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QKICAgICAgICAgICAgbXkgJE1vZHVsZU9iamVjdCA9ICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fSwKICAgICAgICAgICAgICAgIEVuY29kZU9iamVjdCA9PiAkU2VsZi0+e0VuY29kZU9iamVjdH0sCiAgICAgICAgICAgICAgICBMb2dPYmplY3QgICAgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgTWFpbk9iamVjdCAgID0+ICRTZWxmLT57TWFpbk9iamVjdH0sCiAgICAgICAgICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFNlbGYtPntUaW1lT2JqZWN0fSwKICAgICAgICAgICAgICAgIERCT2JqZWN0ICAgICA9PiAkU2VsZi0+e0RCT2JqZWN0fSwKICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgICA9PiAkU2VsZi0+e1VzZXJPYmplY3R9LAogICAgICAgICAgICAgICAgR3JvdXBPYmplY3QgID0+ICRTZWxmLT57R3JvdXBPYmplY3R9LAogICAgICAgICAgICAgICAgQ2hhbmdlT2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhc2sgZm9yIHRoZSBvcGluaW9uIG9mIHRoZSBQZXJtaXNzaW9uIG1vZHVsZQogICAgICAgICAgICBteSAkQWNjZXNzID0gJE1vZHVsZU9iamVjdC0+UnVuKCVQYXJhbSk7CgogICAgICAgICAgICAjIEdyYW50IG92ZXJhbGwgcGVybWlzc2lvbiwKICAgICAgICAgICAgIyB3aGVuIHRoZSBtb2R1bGUgZ3JhbnRlZCBhIHN1ZmZpY2llbnQgcGVybWlzc2lvbi4KICAgICAgICAgICAgaWYgKCAkQWNjZXNzICYmICRNb2R1bGVzeyRNb2R1bGV9LT57R3JhbnRlZH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdyYW50ZWQgJyRQYXJhbXtUeXBlfScgYWNjZXNzIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJVc2VySUQ6ICRQYXJhbXtVc2VySUR9IG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNoYW5nZUlEICckUGFyYW17Q2hhbmdlSUR9JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJ0aHJvdWdoICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSAobm8gbW9yZSBjaGVja3MpISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdyYW50IHBlcm1pc3Npb24KICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIERlbnkgb3ZlcmFsbCBwZXJtaXNzaW9uLAogICAgICAgICAgICAjIHdoZW4gdGhlIG1vZHVsZSBkZW5pZWQgYSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICYmICRNb2R1bGVzeyRNb2R1bGV9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEZW5pZWQgJyRQYXJhbXtUeXBlfScgYWNjZXNzIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJVc2VySUQ6ICRQYXJhbXtVc2VySUR9IG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIkNoYW5nZUlEICckUGFyYW17Q2hhbmdlSUR9JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJiZWNhdXNlICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSBpcyByZXF1aXJlZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBkZW55IHBlcm1pc3Npb24KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIERlbnkgYWNjZXNzIHdoZW4gbmVpdGhlciBhICdHcmFudGVkJy1DaGVjayBub3IgYSAnUmVxdWlyZWQnLUNoZWNrIGhhcyByZWFjaGVkIGEgY29uY2x1c2lvbi4KICAgIGlmICggISRQYXJhbXtMb2dOb30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUGVybWlzc2lvbiBkZW5pZWQgKFVzZXJJRDogJFBhcmFte1VzZXJJRH0gJyRQYXJhbXtUeXBlfScgIgogICAgICAgICAgICAgICAgLiAib24gQ2hhbmdlSUQ6ICRQYXJhbXtDaGFuZ2VJRH0pISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIENoYW5nZUF0dGFjaG1lbnRBZGQoKQoKQWRkIGFuIGF0dGFjaG1lbnQgdG8gdGhlIGdpdmVuIGNoYW5nZS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRBZGQoCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gMTIzLCAgICAgICAgICAgICAgICMgdGhlIENoYW5nZUlEIGJlY29tZXMgcGFydCBvZiB0aGUgZmlsZSBwYXRoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2ZpbGVuYW1lJywKICAgICAgICBDb250ZW50ICAgICA9PiAnY29udGVudCcsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZUF0dGFjaG1lbnRBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENoYW5nZUlEIEZpbGVuYW1lIENvbnRlbnQgQ29udGVudFR5cGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHdyaXRlIHRvIHZpcnR1YWwgZnMKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntWaXJ0dWFsRlNPYmplY3R9LT5Xcml0ZSgKICAgICAgICBGaWxlbmFtZSAgICA9PiAiQ2hhbmdlLyRQYXJhbXtDaGFuZ2VJRH0vJFBhcmFte0ZpbGVuYW1lfSIsCiAgICAgICAgTW9kZSAgICAgICAgPT4gJ2JpbmFyeScsCiAgICAgICAgQ29udGVudCAgICAgPT4gXCRQYXJhbXtDb250ZW50fSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbnRlbnRJRCAgID0+ICRQYXJhbXtDb250ZW50SUR9LAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkUGFyYW17Q29udGVudFR5cGV9LAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgIyB0cmlnZ2VyIEF0dGFjaG1lbnRBZGQtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQ2hhbmdlQXR0YWNobWVudEFkZFBvc3QnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgYWRkIGF0dGFjaG1lbnQgZm9yIGNoYW5nZSAkUGFyYW17Q2hhbmdlSUR9IiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENoYW5nZUF0dGFjaG1lbnREZWxldGUoKQoKRGVsZXRlIHRoZSBnaXZlbiBmaWxlIGZyb20gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgRmlsZUlEICAgPT4gMTIzNCwgICAgICMgaWRlbnRpZmllcyB0aGUgYXR0YWNobWVudAogICAgICAgIENoYW5nZUlEID0+IDEyMywgICAgICAjIHVzZWQgaW4gZXZlbnQgaGFuZGxpbmcsIGUuZy4gZm9yIGxvZ2dpbmcgdGhlIGhpc3RvcnkKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VBdHRhY2htZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhGaWxlSUQgQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlYXJjaCBmb3IgYXR0YWNobWVudHMKICAgIG15ICVBdHRhY2htZW50cyA9ICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fS0+U2VhcmNoKAogICAgICAgIEZpbGVJRCA9PiAkUGFyYW17RmlsZUlEfSwKICAgICk7CgogICAgIyBnZXQgZmlsZW5hbWUKICAgIG15ICRGaWxlbmFtZSA9ICRBdHRhY2htZW50c3sgJFBhcmFte0ZpbGVJRH0gfTsKCiAgICAjIGRlbGV0ZSBmaWxlCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICk7CgogICAgJEZpbGVuYW1lID1+IHN7IFxBIENoYW5nZSAvIFxkKyAvIH17fXhtczsKCiAgICAjIGNoZWNrIGZvciBlcnJvcgogICAgaWYgKCRTdWNjZXNzKSB7CgogICAgICAgICMgdHJpZ2dlciBBdHRhY2htZW50RGVsZXRlUG9zdC1FdmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VBdHRhY2htZW50RGVsZXRlUG9zdCcsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbm5vdCBkZWxldGUgYXR0YWNobWVudCAkUGFyYW17RmlsZUlEfSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1pdGVtIENoYW5nZUF0dGFjaG1lbnRHZXQoKQoKVGhpcyBtZXRob2QgcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgc3BlY2lmaWMgYXR0YWNobWVudC4KCiAgICBteSAkQXR0YWNobWVudCA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUF0dGFjaG1lbnRHZXQoCiAgICAgICAgRmlsZUlEID0+IDEyMywKICAgICk7CgpyZXR1cm5zCgogICAgewogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQWxsUHJlZmVyZW5jZXMgPT4gJ3Rlc3QnLAogICAgICAgIH0sCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3Rlc3QudHh0JywKICAgICAgICBDb250ZW50ICAgICA9PiAnaGFsbG8nLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBGaWxlc2l6ZSAgICA9PiAnMTIzIEtCeXRlcycsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgfQoKPWN1dAoKc3ViIENoYW5nZUF0dGFjaG1lbnRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0ZpbGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEZpbGVJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNlYXJjaCBmb3IgYXR0YWNobWVudHMKICAgIG15ICVBdHRhY2htZW50cyA9ICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fS0+U2VhcmNoKAogICAgICAgIEZpbGVJRCA9PiAkUGFyYW17RmlsZUlEfSwKICAgICk7CgogICAgIyBnZXQgZmlsZW5hbWUKICAgIG15ICRGaWxlbmFtZSA9ICRBdHRhY2htZW50c3sgJFBhcmFte0ZpbGVJRH0gfTsKCiAgICAjIHJldHVybiBlcnJvciBpZiBmaWxlIGRvZXMgbm90IGV4aXN0CiAgICBpZiAoICEkRmlsZW5hbWUgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgKCRQYXJhbXtGaWxlSUR9KSEgTWF5IGJlIGFuIGF0dGFjayEhISIsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YSBmb3IgYXR0YWNobWVudAogICAgbXkgJUF0dGFjaG1lbnREYXRhID0gJFNlbGYtPntWaXJ0dWFsRlNPYmplY3R9LT5SZWFkKAogICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgICBNb2RlICAgICA9PiAnYmluYXJ5JywKICAgICk7CgogICAgIyByZXR1cm4gaWYgbm8gYXR0YWNobWVudCBkYXRhIGlzIGF2YWlsYWJsZQogICAgaWYgKCAhJUF0dGFjaG1lbnREYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gYXR0YWNobWVudCBkYXRhIGZvciBhdHRhY2htZW50ICgkUGFyYW17RmlsZUlEfSkhIiwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlbW92ZSBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lCiAgICAoIG15ICROYW1lRGlzcGxheWVkID0gJEZpbGVuYW1lICkgPX4gc3sgXEEgQ2hhbmdlIC8gXGQrIC8gfXt9eG1zOwoKICAgIG15ICRBdHRhY2htZW50SW5mbyA9IHsKICAgICAgICAlQXR0YWNobWVudERhdGEsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJE5hbWVEaXNwbGF5ZWQsCiAgICAgICAgQ29udGVudCAgICAgPT4gJHsgJEF0dGFjaG1lbnREYXRhe0NvbnRlbnR9IH0sCiAgICAgICAgQ29udGVudFR5cGUgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0NvbnRlbnRUeXBlfSwKICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgRmlsZUlEICAgICAgPT4gJFBhcmFte0ZpbGVJRH0sCiAgICAgICAgRmlsZXNpemUgICAgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVzaXplfSwKICAgIH07CgogICAgcmV0dXJuICRBdHRhY2htZW50SW5mbzsKfQoKPWl0ZW0gQ2hhbmdlQXR0YWNobWVudExpc3QoKQoKUmV0dXJucyBhIGhhc2ggd2l0aCBhbGwgYXR0YWNobWVudHMgb2YgdGhlIGdpdmVuIGNoYW5nZS4gVGhlIGZpbGUgaWQgaXMgdGhlIGtleQphbmQgdGhlIGZpbGVuYW1lIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgaGFzaC4KCiAgICBteSAlQXR0YWNobWVudHMgPSAkQ2hhbmdlT2JqZWN0LT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICApOwoKcmV0dXJucwoKICAgIDEyMyA9PiAnZmlsZW5hbWUudHh0JywKICAgIDQzNSA9PiAnb3RoZXJfZmlsZS5wZGYnLAoKPWN1dAoKc3ViIENoYW5nZUF0dGFjaG1lbnRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDaGFuZ2VJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEZpbGVJRCEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNlYXJjaCBmb3IgYXR0YWNobWVudHMKICAgIG15ICVBdHRhY2htZW50cyA9ICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fS0+U2VhcmNoKAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICBmb3IgbXkgJEZpbGVJRCAoIGtleXMgJUF0dGFjaG1lbnRzICkgewoKICAgICAgICAjIHJlbW92ZSBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lCiAgICAgICAgJEF0dGFjaG1lbnRzeyRGaWxlSUR9ID1+IHN7IFxBIENoYW5nZSAvIFxkKyAvIH17fXhtczsKICAgIH0KCiAgICByZXR1cm4gJUF0dGFjaG1lbnRzOwp9Cgo9aXRlbSBDaGFuZ2VBdHRhY2htZW50RXhpc3RzKCkKCkNoZWNrcyBpZiBhIGZpbGUgd2l0aCBhIGdpdmVuIGZpbGVuYW1lIGV4aXN0cy4KCiAgICBteSAkRXhpc3RzID0gJENoYW5nZU9iamVjdC0+Q2hhbmdlQXR0YWNobWVudEV4aXN0cygKICAgICAgICBGaWxlbmFtZSA9PiAndGVzdC50eHQnLAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VBdHRhY2htZW50RXhpc3RzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhGaWxlbmFtZSBDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJFNlbGYtPntWaXJ0dWFsRlNPYmplY3R9LT5GaW5kKAogICAgICAgIEZpbGVuYW1lID0+ICdDaGFuZ2UvJyAuICRQYXJhbXtDaGFuZ2VJRH0gLiAnLycgLiAkUGFyYW17RmlsZW5hbWV9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ2hhbmdlR2V0Q29uZmlndXJlZEZyZWVUZXh0RmllbGRzKCkKClJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgbnVtYmVycyBvZiBhbGwgY29uZmlndXJlZCBjaGFuZ2UgZnJlZWtleSBhbmQgZnJlZXRleHQgZmllbGRzCgogICAgbXkgQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkcyA9ICRDaGFuZ2VPYmplY3QtPkNoYW5nZUdldENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcygpOwoKPWN1dAoKc3ViIENoYW5nZUdldENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbG9va3VwIGNhY2hlZCByZXN1bHQKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkc30KICAgICAgICAmJiByZWYgJFNlbGYtPntDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHN9IGVxICdBUlJBWScKICAgICAgICAmJiBAeyAkU2VsZi0+e0NvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkc30gfQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm4gQHsgJFNlbGYtPntDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHN9IH07CiAgICB9CgogICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcwogICAgbXkgJE1heE51bWJlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpGcmVlVGV4dDo6TWF4TnVtYmVyJyk7CgogICAgIyBnZXQgYWxsIGNvbmZpZ3VyZWQgY2hhbmdlIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IG51bWJlcnMKICAgIG15IEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMgPSAoKTsKICAgIEZSRUVURVhUTlVNQkVSOgogICAgZm9yIG15ICROdW1iZXIgKCAxIC4uICRNYXhOdW1iZXIgKSB7CgogICAgICAgICMgY2hlY2sgY2hhbmdlIGZyZWVrZXkgY29uZmlnCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ0NoYW5nZUZyZWVLZXknIC4gJE51bWJlciApICkgewogICAgICAgICAgICBwdXNoIEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMsICROdW1iZXI7CiAgICAgICAgICAgIG5leHQgRlJFRVRFWFROVU1CRVI7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGNoYW5nZSBmcmVldGV4dCBjb25maWcKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnQ2hhbmdlRnJlZVRleHQnIC4gJE51bWJlciApICkgewogICAgICAgICAgICBwdXNoIEBDb25maWd1cmVkQ2hhbmdlRnJlZVRleHRGaWVsZHMsICROdW1iZXI7CiAgICAgICAgICAgIG5leHQgRlJFRVRFWFROVU1CRVI7CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUgcmVzdWx0CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkc30gPSBcQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkczsKCiAgICByZXR1cm4gQENvbmZpZ3VyZWRDaGFuZ2VGcmVlVGV4dEZpZWxkczsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0NoZWNrQ2hhbmdlU3RhdGVJRHMoKQoKQ2hlY2sgd2hldGhlciBhbGwgb2YgdGhlIGdpdmVuIGNoYW5nZSBzdGF0ZSBpZHMgYXJlIHZhbGlkLgoKICAgIG15ICRPayA9ICRDaGFuZ2VPYmplY3QtPl9DaGVja0NoYW5nZVN0YXRlSURzKAogICAgICAgIENoYW5nZVN0YXRlSURzID0+IFsgMjUsIDI2IF0sCiAgICApOwoKPWN1dAoKc3ViIF9DaGVja0NoYW5nZVN0YXRlSURzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDaGFuZ2VTdGF0ZUlEc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoYW5nZVN0YXRlSURzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte0NoYW5nZVN0YXRlSURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlIHBhcmFtIENoYW5nZVN0YXRlSURzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBDaGFuZ2VTdGF0ZUlEcyBiZWxvbmcgdG8gY29ycmVjdCBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgIGZvciBteSAkU3RhdGVJRCAoIEB7ICRQYXJhbXtDaGFuZ2VTdGF0ZUlEc30gfSApIHsKICAgICAgICBteSAkU3RhdGUgPSAkU2VsZi0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJFN0YXRlSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN0YXRlICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHN0YXRlIGlkICRTdGF0ZUlEIGlzIG5vdCB2YWxpZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0NoZWNrQ2hhbmdlQ0lQSURzKCkKCkNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZSBnaXZlbiBpZHMgb2YgY2F0ZWdvcnksIGltcGFjdCBvciBwcmlvcml0eSBhcmUgdmFsaWQuCgogICAgbXkgJE9rID0gJENoYW5nZU9iamVjdC0+X0NoZWNrQ2hhbmdlQ0lQSURzKAogICAgICAgIElEcyAgPT4gWyAyNSwgMjYgXSwgIyBtYW5kYXRvcnkKICAgICAgICBUeXBlID0+ICdQcmlvcml0eScsICMgbWFuZGF0b3J5IChDYXRlZ29yeXxJbXBhY3R8UHJpb3JpdHkpCiAgICApOwoKPWN1dAoKc3ViIF9DaGVja0NoYW5nZUNJUElEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSURzIFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBJRHMgaXMgYW4gYXJyYXkgcmVmZXJlbmNlCiAgICBpZiAoIHJlZiAkUGFyYW17SURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlIHBhcmFtIElEcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgVHlwZSBwYXJhbSBmb3IgdmFsaWQgdmFsdWVzCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtUeXBlfQogICAgICAgIHx8ICggJFBhcmFte1R5cGV9IG5lICdDYXRlZ29yeScgJiYgJFBhcmFte1R5cGV9IG5lICdJbXBhY3QnICYmICRQYXJhbXtUeXBlfSBuZSAnUHJpb3JpdHknICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW0gVHlwZSBtdXN0IGJlIGVpdGhlciAiQ2F0ZWdvcnkiIG9yICJJbXBhY3QiIG9yICJQcmlvcml0eSIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIElEcyBiZWxvbmdzIHRvIGNvcnJlY3QgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICBmb3IgbXkgJElEICggQHsgJFBhcmFte0lEc30gfSApIHsKICAgICAgICBteSAkQ0lQID0gJFNlbGYtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgSUQgICA9PiAkSUQsCiAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRDSVAgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgJFBhcmFte1R5cGV9IGlkICRJRCBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9DaGVja0NoYW5nZVBhcmFtcygpCgpDaGVja3MgdGhlIHBhcmFtcyB0byBDaGFuZ2VBZGQoKSBhbmQgQ2hhbmdlVXBkYXRlKCkuClRoZXJlIGFyZSBubyByZXF1aXJlZCBwYXJhbWV0ZXJzLgoKICAgIG15ICRPayA9ICRDaGFuZ2VPYmplY3QtPl9DaGVja0NoYW5nZVBhcmFtcygKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICA9PiAnUmVwbGFjZW1lbnQgb2YgbWFpbCBzZXJ2ZXInLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnTmV3IG1haWwgc2VydmVyIDxiPmlzPC9iPiBmYXN0ZXInLCAjIChvcHRpb25hbCkKICAgICAgICBEZXNjcmlwdGlvblBsYWluICAgICA9PiAnTmV3IG1haWwgc2VydmVyIGlzIGZhc3RlcicsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBKdXN0aWZpY2F0aW9uICAgICAgICA9PiAnT2xkIG1haWwgc2VydmVyPGI+dG9vPC9iPiBzbG93JywgICAjIChvcHRpb25hbCkKICAgICAgICBKdXN0aWZpY2F0aW9uUGxhaW4gICA9PiAnT2xkIG1haWwgc2VydmVyIHRvbyBzbG93JywgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgICAgICA9PiA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgICAgICA9PiA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCdWlsZGVySUQgICAgICA9PiA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDYXRlZ29yeUlEICAgICAgICAgICA9PiA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbXBhY3RJRCAgICAgICAgICAgICA9PiA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQcmlvcml0eUlEICAgICAgICAgICA9PiA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBSZXF1ZXN0ZWRUaW1lICAgICAgICA9PiAnMjAwOS0xMC0yMyAwODo1NzoxMicsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDQUJBZ2VudHMgICAgICAgICAgICA9PiBbIDEsIDIsIDQgXSwgICAgICMgVXNlcklEcyAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDQUJDdXN0b21lcnMgICAgICAgICA9PiBbICd0dCcsICdtbScgXSwgICMgQ3VzdG9tZXJVc2VySURzICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VGcmVlS2V5MSAgICAgICA9PiAnU3VuJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgY2hhbmdlIGZyZWVrZXkgZmllbGRzIGZyb20gMSB0byBJVFNNQ2hhbmdlOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICAgICAgQ2hhbmdlRnJlZVRleHQxICAgICAgPT4gJ0VhcnRoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgZnJvbSAxIHRvIElUU01DaGFuZ2U6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICk7CgpUaGUgQ2hhbmdlU3RhdGVJRCBpcyBjaGVja2VkIGZvciBleGlzdGVuY2UgaW4gdGhlIGdlbmVyYWwgY2F0YWxvZy4KVGhlc2Ugc3RyaW5nIHBhcmFtZXRlcnMgaGF2ZSBsZW5ndGggY29uc3RyYWludHM6CgogICAgUGFyYW1ldGVyICAgICAgICAgICB8IG1heC4gbGVuZ3RoCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hhbmdlVGl0bGUgICAgICAgICB8ICAyNTAgY2hhcmFjdGVycwogICAgRGVzY3JpcHRpb24gICAgICAgICB8IDM4MDAgY2hhcmFjdGVycwogICAgRGVzY3JpcHRpb25QbGFpbiAgICB8IDM4MDAgY2hhcmFjdGVycwogICAgSnVzdGlmaWNhdGlvbiAgICAgICB8IDM4MDAgY2hhcmFjdGVycwogICAgSnVzdGlmaWNhdGlvblBsYWluICB8IDM4MDAgY2hhcmFjdGVycwogICAgQ2hhbmdlRnJlZUtleVhYICAgICB8ICAyNTAgY2hhcmFjdGVycwogICAgQ2hhbmdlRnJlZVRleHRYWCAgICB8ICAyNTAgY2hhcmFjdGVycwoKPWN1dAoKc3ViIF9DaGVja0NoYW5nZVBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgdGhlIHN0cmluZyBhbmQgaWQgcGFyYW1ldGVycwogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50ICgKICAgICAgICBxdygKICAgICAgICBDaGFuZ2VUaXRsZQogICAgICAgIERlc2NyaXB0aW9uCiAgICAgICAgRGVzY3JpcHRpb25QbGFpbgogICAgICAgIEp1c3RpZmljYXRpb24KICAgICAgICBKdXN0aWZpY2F0aW9uUGxhaW4KICAgICAgICBDaGFuZ2VNYW5hZ2VySUQKICAgICAgICBDaGFuZ2VCdWlsZGVySUQKICAgICAgICBDaGFuZ2VTdGF0ZUlECiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBwYXJhbXMgYXJlIG5vdCByZXF1aXJlZAogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgIyBjaGVjayBpZiBwYXJhbSBpcyBub3QgZGVmaW5lZAogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgZGVmaW5lZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHBhcmFtIGlzIG5vdCBhIHJlZmVyZW5jZQogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICcnICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0bid0IGJlIGEgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRpdGxlCiAgICAgICAgaWYgKCAkQXJndW1lbnQgZXEgJ0NoYW5nZVRpdGxlJyAmJiBsZW5ndGgoICRQYXJhbXskQXJndW1lbnR9ICkgPiAyNTAgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgc2hvcnRlciB0aGFuIDI1MCBjaGFyYWN0ZXJzISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXJndW1lbnQgICAgZXEgJ0Rlc2NyaXB0aW9uJwogICAgICAgICAgICB8fCAkQXJndW1lbnQgZXEgJ0Rlc2NyaXB0aW9uUGxhaW4nCiAgICAgICAgICAgIHx8ICRBcmd1bWVudCBlcSAnSnVzdGlmaWNhdGlvbicKICAgICAgICAgICAgfHwgJEFyZ3VtZW50IGVxICdKdXN0aWZpY2F0aW9uUGxhaW4nCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggbGVuZ3RoKCAkUGFyYW17JEFyZ3VtZW50fSApID4gMzgwMCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJyRBcmd1bWVudCcgbXVzdCBiZSBzaG9ydGVyIHRoYW4gMzgwMCBjaGFyYWN0ZXJzISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhlIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IHBhcmFtZXRlcnMKICAgIGZvciBteSAkVHlwZSAoICdDaGFuZ2VGcmVlS2V5JywgJ0NoYW5nZUZyZWVUZXh0JyApIHsKCiAgICAgICAgIyBjaGVjayBhbGwgcG9zc2libGUgZnJlZXRleHQgZmllbGRzCiAgICAgICAgTlVNQkVSOgogICAgICAgIGZvciBteSAkTnVtYmVyICggMSAuLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6RnJlZVRleHQ6Ok1heE51bWJlcicpICkgewoKICAgICAgICAgICAgIyBidWlsZCBhcmd1bWVudCwgZS5nLiBDaGFuZ2VGcmVlS2V5MQogICAgICAgICAgICBteSAkQXJndW1lbnQgPSAkVHlwZSAuICROdW1iZXI7CgogICAgICAgICAgICAjIHBhcmFtcyBhcmUgbm90IHJlcXVpcmVkCiAgICAgICAgICAgIG5leHQgTlVNQkVSIGlmICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIHBhcmFtIGlzIG5vdCBkZWZpbmVkCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgZGVmaW5lZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBwYXJhbSBpcyBub3QgYSByZWZlcmVuY2UKICAgICAgICAgICAgaWYgKCByZWYgJFBhcmFteyRBcmd1bWVudH0gbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3RuJ3QgYmUgYSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGZyZWV0ZXh0IGZpZWxkcwogICAgICAgICAgICBpZiAoIGxlbmd0aCggJFBhcmFteyRBcmd1bWVudH0gKSA+IDI1MCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJyRBcmd1bWVudCcgbXVzdCBiZSBzaG9ydGVyIHRoYW4gMjUwIGNoYXJhY3RlcnMhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByZXF1ZXN0ZWRfdGltZSBoYXMgY29ycmVjdCBmb3JtYXQKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtSZXF1ZXN0ZWRUaW1lfQogICAgICAgICYmICRQYXJhbXtSZXF1ZXN0ZWRUaW1lfSAhfiBteyBcQSBcZFxkXGRcZC1cZFxkLVxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgXHogfXhtcwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgZm9ybWF0IGZvciBSZXF1ZXN0ZWRUaW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBnaXZlbiBDaGFuZ2VTdGF0ZUlEIGlzIHZhbGlkCiAgICBpZiAoICRQYXJhbXtDaGFuZ2VTdGF0ZUlEfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tDaGFuZ2VTdGF0ZUlEcygKICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRHMgPT4gWyAkUGFyYW17Q2hhbmdlU3RhdGVJRH0gXSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgZ2l2ZW4gY2F0ZWdvcnksIGltcGFjdCBvciBwcmlvcml0eSBJRCBpcyB2YWxpZAogICAgZm9yIG15ICRUeXBlIChxdyhDYXRlZ29yeSBJbXBhY3QgUHJpb3JpdHkpKSB7CiAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXsiJHtUeXBlfUlEIn0gKSB7CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja0NoYW5nZUNJUElEcygKICAgICAgICAgICAgICAgIElEcyAgPT4gWyAkUGFyYW17IiR7VHlwZX1JRCJ9IF0sCiAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXskVHlwZX0gKSB7CiAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPkNoYW5nZUNJUExvb2t1cCgKICAgICAgICAgICAgICAgIENJUCAgPT4gJFBhcmFteyRUeXBlfSwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hhbmdlIG1hbmFnZXIgYW5kIGNoYW5nZSBidWlsZGVyIG11c3QgYmUgYWdlbnRzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KCBDaGFuZ2VNYW5hZ2VySUQgQ2hhbmdlQnVpbGRlcklEICkpIHsKCiAgICAgICAgIyBwYXJhbXMgYXJlIG5vdCByZXF1aXJlZAogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgJEFyZ3VtZW50ICRQYXJhbXskQXJndW1lbnR9IGlzIG5vdCBhIHZhbGlkIHVzZXIgaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIENBQiBhZ2VudHMgbXVzdCBiZSBhZ2VudHMKICAgIGlmICggZXhpc3RzICRQYXJhbXtDQUJBZ2VudHN9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtDQUJBZ2VudHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW1ldGVyIENBQkFnZW50cyBpcyBub3QgYW4gQVJSQVkgcmVmZXJlbmNlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdXNlcnMKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIEB7ICRQYXJhbXtDQUJBZ2VudHN9IH0gKSB7CgogICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgQ0FCQWdlbnQgJFVzZXJJRCBpcyBub3QgYSB2YWxpZCB1c2VyIGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgQ0FCIGN1c3RvbWVycyBtdXN0IGJlIGN1c3RvbWVycwogICAgaWYgKCBleGlzdHMgJFBhcmFte0NBQkN1c3RvbWVyc30gKSB7CiAgICAgICAgaWYgKCByZWYgJFBhcmFte0NBQkN1c3RvbWVyc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RoZSBwYXJhbWV0ZXIgQ0FCQ3VzdG9tZXJzIGlzIG5vdCBhbiBBUlJBWSByZWZlcmVuY2UhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBjdXN0b21lciB1c2VycwogICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyICggQHsgJFBhcmFte0NBQkN1c3RvbWVyc30gfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgZGF0YQogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckRhdGEgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgQ0FCQ3VzdG9tZXIgJEN1c3RvbWVyVXNlciBpcyBub3QgYSB2YWxpZCBjdXN0b21lciEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0NoYW5nZUZyZWVUZXh0R2V0KCkKCkdldHMgdGhlIGZyZWV0ZXh0IGFuZCBmcmVla2V5IGZpZWxkcyBvZiBhIGNoYW5nZSBhcyBhIGhhc2ggcmVmZXJlbmNlLgoKICAgIG15ICRDaGFuZ2VGcmVlVGV4dCA9ICRDaGFuZ2VPYmplY3QtPl9DaGFuZ2VGcmVlVGV4dEdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgpSZXR1cm5zOgoKICAgICRDaGFuZ2VGcmVlVGV4dCA9IHsKICAgICAgICBDaGFuZ2VGcmVlS2V5MSAgPT4gJ1N1bicsICAgIyBjaGFuZ2UgZnJlZWtleSBmaWVsZHMgZnJvbSAxIHRvIElUU01DaGFuZ2U6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBDaGFuZ2VGcmVlVGV4dDEgPT4gJ0VhcnRoJywgIyBjaGFuZ2UgZnJlZXRleHQgZmllbGRzIGZyb20gMSB0byBJVFNNQ2hhbmdlOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICB9Cgo9Y3V0CgpzdWIgX0NoYW5nZUZyZWVUZXh0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0byBzdG9yZSBjaGFuZ2UgZnJlZWtleSBhbmQgZnJlZXRleHQgZGF0YQogICAgbXkgJURhdGE7CgogICAgIyBnZXQgY2hhbmdlIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IGRhdGEKICAgIGZvciBteSAkVHlwZSAoICdDaGFuZ2VGcmVlS2V5JywgJ0NoYW5nZUZyZWVUZXh0JyApIHsKCiAgICAgICAgIyBwcmVzZXQgZXZlcnkgZnJlZXRleHQgZmllbGQgd2l0aCBlbXB0eSBzdHJpbmcKICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkZyZWVUZXh0OjpNYXhOdW1iZXInKSApIHsKICAgICAgICAgICAgJERhdGF7ICRUeXBlIC4gJE51bWJlciB9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0YWJsZSBuYW1lCiAgICAgICAgbXkgJFRhYmxlTmFtZSA9ICcnOwogICAgICAgIGlmICggJFR5cGUgZXEgJ0NoYW5nZUZyZWVUZXh0JyApIHsKICAgICAgICAgICAgJFRhYmxlTmFtZSA9ICdjaGFuZ2VfZnJlZXRleHQnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdDaGFuZ2VGcmVlS2V5JyApIHsKICAgICAgICAgICAgJFRhYmxlTmFtZSA9ICdjaGFuZ2VfZnJlZWtleSc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjaGFuZ2UgZnJlZXRleHQgZmllbGRzCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgZmllbGRfaWQsIGZpZWxkX3ZhbHVlJwogICAgICAgICAgICAgICAgLiAnIEZST00gJyAuICRUYWJsZU5hbWUKICAgICAgICAgICAgICAgIC4gJyBXSEVSRSBjaGFuZ2VfaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBteSAkRmllbGQgPSAkVHlwZSAuICRSb3dbMF07CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRSb3dbMV07CiAgICAgICAgICAgICREYXRheyRGaWVsZH0gPSBkZWZpbmVkICRWYWx1ZSA/ICRWYWx1ZSA6ICcnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBfQ2hhbmdlRnJlZVRleHRVcGRhdGUoKQoKVXBkYXRlcyB0aGUgZnJlZXRleHQgYW5kIGZyZWVrZXkgZmllbGRzIG9mIGEgY2hhbmdlLgpQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBkZWxldGVzIHRoZSBmcmVldGV4dCBmaWVsZC4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGFuZ2VPYmplY3QtPl9DaGFuZ2VGcmVlVGV4dFVwZGF0ZSgKICAgICAgICBDaGFuZ2VJRCAgICAgICAgPT4gMTIzLAogICAgICAgIENoYW5nZUZyZWVLZXkxICA9PiAnU3VuJywgICAjIChvcHRpb25hbCkgY2hhbmdlIGZyZWVrZXkgZmllbGRzIGZyb20gMSB0byBJVFNNQ2hhbmdlOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICAgICAgQ2hhbmdlRnJlZVRleHQxID0+ICdFYXJ0aCcsICMgKG9wdGlvbmFsKSBjaGFuZ2UgZnJlZXRleHQgZmllbGRzIGZyb20gMSB0byBJVFNNQ2hhbmdlOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9DaGFuZ2VGcmVlVGV4dFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhlIGdpdmVuIHBhcmFtZXRlcnMKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja0NoYW5nZVBhcmFtcyglUGFyYW0pOwoKICAgICMgc3RvcmUgdGhlIGdpdmVuIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IGlkcwogICAgbXkgQEZyZWVLZXlGaWVsZElEczsKICAgIG15IEBGcmVlVGV4dEZpZWxkSURzOwogICAgZm9yIG15ICRUeXBlICggJ0NoYW5nZUZyZWVLZXknLCAnQ2hhbmdlRnJlZVRleHQnICkgewoKICAgICAgICAjIGNoZWNrIGFsbCBwb3NzaWJsZSBmcmVldGV4dCBmaWVsZHMKICAgICAgICBOVU1CRVI6CiAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpGcmVlVGV4dDo6TWF4TnVtYmVyJykgKSB7CgogICAgICAgICAgICAjIGJ1aWxkIGFyZ3VtZW50LCBlLmcuIENoYW5nZUZyZWVLZXkxCiAgICAgICAgICAgIG15ICRBcmd1bWVudCA9ICRUeXBlIC4gJE51bWJlcjsKCiAgICAgICAgICAgICMgcGFyYW1zIGFyZSBub3QgcmVxdWlyZWQKICAgICAgICAgICAgbmV4dCBOVU1CRVIgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgICAgICMgYWxsIGNoZWNrcyB3ZXJlIGRvbmUgYmVmb3JlLCBzbyBoZXJlIHdlIGFyZSBzYWZlIGFuZCBzdG9yZSB0aGUgaWRzCiAgICAgICAgICAgIGlmICggJFR5cGUgZXEgJ0NoYW5nZUZyZWVLZXknICkgewogICAgICAgICAgICAgICAgcHVzaCBARnJlZUtleUZpZWxkSURzLCAkTnVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ0NoYW5nZUZyZWVUZXh0JyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEZyZWVUZXh0RmllbGRJRHMsICROdW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICRUeXBlICggJ0NoYW5nZUZyZWVLZXknLCAnQ2hhbmdlRnJlZVRleHQnICkgewoKICAgICAgICAjIHNldCB0YWJsZSBuYW1lIGFuZCBhcnJheXMgb2YgZmllbGQgaWRzCiAgICAgICAgbXkgJFRhYmxlTmFtZTsKICAgICAgICBteSBARmllbGRJRHM7CiAgICAgICAgaWYgKCAkVHlwZSBlcSAnQ2hhbmdlRnJlZUtleScgKSB7CiAgICAgICAgICAgICRUYWJsZU5hbWUgPSAnY2hhbmdlX2ZyZWVrZXknOwogICAgICAgICAgICBARmllbGRJRHMgID0gQEZyZWVLZXlGaWVsZElEczsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkVHlwZSBlcSAnQ2hhbmdlRnJlZVRleHQnICkgewogICAgICAgICAgICAkVGFibGVOYW1lID0gJ2NoYW5nZV9mcmVldGV4dCc7CiAgICAgICAgICAgIEBGaWVsZElEcyAgPSBARnJlZVRleHRGaWVsZElEczsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIGFsbCBnaXZlbiBjaGFuZ2UgZnJlZWtleSBhbmQgZnJlZXRleHQgZmllbGRzCiAgICAgICAgZm9yIG15ICRGaWVsZElEIChARmllbGRJRHMpIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgZW50cnkgZXhpc3RzIGZvciB0aGlzIGNvbWJpbmF0aW9uCiAgICAgICAgICAgICMgb2YgY2hhbmdlX2lkLCBmaWVsZF9pZCBhbmQgdHlwZSAoQ2hhbmdlRnJlZUtleSBvciBDaGFuZ2VGcmVlVGV4dCkKICAgICAgICAgICAgbXkgJElEOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gJyAuICRUYWJsZU5hbWUKICAgICAgICAgICAgICAgICAgICAuICcgV0hFUkUgY2hhbmdlX2lkID0gPyAnCiAgICAgICAgICAgICAgICAgICAgLiAnIEFORCBmaWVsZF9pZCA9ID8gJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSwgXCRGaWVsZElEIF0sCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAgICAgJElEID0gJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgbmV3IHZhbHVlIGZyb20gcGFyYW1ldGVyCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbXsgJFR5cGUgLiAkRmllbGRJRCB9OwoKICAgICAgICAgICAgIyBlbnRyeSBleGlzdHMgYW5kIG5lZWRzIGFuIHVwZGF0ZQogICAgICAgICAgICBpZiAoICRJRCAmJiAkVmFsdWUgbmUgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgICAgICBTUUwgPT4gJ1VQREFURSAnIC4gJFRhYmxlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAuICcgU0VUIGZpZWxkX3ZhbHVlID0gPycKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkVmFsdWUsIFwkSUQgXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZW50cnkgZXhpc3RzIGJ1dCBuZXcgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nCiAgICAgICAgICAgIGVsc2lmICggJElEICYmICRWYWx1ZSBlcSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gJyAuICRUYWJsZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkSUQgXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZW50cnkgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBlbnRyeQogICAgICAgICAgICBlbHNpZiAoICEkSUQgJiYgJFZhbHVlIG5lICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyAnIC4gJFRhYmxlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAuICcgKGNoYW5nZV9pZCwgZmllbGRfaWQsIGZpZWxkX3ZhbHVlKScKICAgICAgICAgICAgICAgICAgICAgICAgLiAnIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSwgXCRGaWVsZElELCBcJFZhbHVlIF0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICBLZXkgID0+ICdDaGFuZ2VHZXQ6OklEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9DaGFuZ2VGcmVlVGV4dERlbGV0ZSgpCgpEZWxldGVzIGFsbCBmcmVldGV4dCBhbmQgZnJlZWtleSBmaWVsZHMgb2YgYSBjaGFuZ2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hhbmdlT2JqZWN0LT5fQ2hhbmdlRnJlZVRleHREZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9DaGFuZ2VGcmVlVGV4dERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGZvciBteSAkVHlwZSAoICdDaGFuZ2VGcmVlS2V5JywgJ0NoYW5nZUZyZWVUZXh0JyApIHsKCiAgICAgICAgIyBzZXQgdGFibGUgbmFtZQogICAgICAgIG15ICRUYWJsZU5hbWU7CiAgICAgICAgaWYgKCAkVHlwZSBlcSAnQ2hhbmdlRnJlZUtleScgKSB7CiAgICAgICAgICAgICRUYWJsZU5hbWUgPSAnY2hhbmdlX2ZyZWVrZXknOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdDaGFuZ2VGcmVlVGV4dCcgKSB7CiAgICAgICAgICAgICRUYWJsZU5hbWUgPSAnY2hhbmdlX2ZyZWV0ZXh0JzsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGVudHJpZXMgZnJvbSBkYXRhYmFzZQogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NICcgLiAkVGFibGVOYW1lCiAgICAgICAgICAgICAgICAuICcgV0hFUkUgY2hhbmdlX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgIEtleSAgPT4gJ0NoYW5nZUdldDo6SUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjI1OSAkICREYXRlOiAyMDEwLzA3LzAzIDAwOjM3OjU2ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ2hhbmdlQ0lQQWxsb2NhdGUucG0gLSBhbGwgY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkgYWxsb2NhdGlvbiBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2VDSVBBbGxvY2F0ZS5wbSx2IDEuMiAyMDEwLzAzLzAxIDEyOjQ0OjUzIHViIEV4cCAkCiMgJE9sZElkOiBJVFNNQ0lQQWxsb2NhdGUucG0sdiAxLjE1IDIwMTAvMDIvMTggMTQ6MzI6NTkgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KI3BhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlOwojIC0tLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCj1oZWFkMSBOQU1FCgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KI0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUgLSBjcml0aWNhbGl0eSwgaW1wYWN0IGFuZCBwcmlvcml0eSBhbGxvY2F0aW9uIGxpYgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlIC0gY2F0ZWdvcnksIGltcGFjdCBhbmQgcHJpb3JpdHkgYWxsb2NhdGlvbiBsaWIKIyAtLS0KCj1oZWFkMSBTWU5PUFNJUwoKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiNBbGwgY3JpdGljYWxpdHksIGltcGFjdCBhbmQgcHJpb3JpdHkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCkFsbCBjYXRlZ29yeSwgaW1wYWN0IGFuZCBwcmlvcml0eSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KIyAtLS0KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiMgLS0tCiMgSVRTTSBDaGFuZ2UgTWFuYWdlbWVudAojIC0tLQojICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGU7CiMgLS0tCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiMgLS0tCiMgSVRTTSBDaGFuZ2UgTWFuYWdlbWVudAojIC0tLQojICAgIG15ICRDSVBBbGxvY2F0ZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldygKICAgIG15ICRDSVBBbGxvY2F0ZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUtPm5ldygKIyAtLS0KICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBbGxvY2F0ZUxpc3QoKQoKcmV0dXJuIGEgMmQgaGFzaCByZWZlcmVuY2Ugb2YgYWxsb2NhdGlvbnMKCiAgICBteSAkTGlzdFJlZiA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+QWxsb2NhdGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCkM8JExpc3RSZWY+IGlzIHNvbWV0aGluZyBsaWtlCgogICAgJExpc3RSZXQgPSB7CiAgICAgICAgJzYnID0+IHsKICAgICAgICAgICAgJzQnID0+IDIsCiAgICAgICAgICAgICcxJyA9PiAxLAogICAgICAgICAgICAnMycgPT4gMiwKICAgICAgICB9LAogICAgICAgICc4JyA9PiB7CiAgICAgICAgICAgICc0JyA9PiA0LAogICAgICAgICAgICAnMScgPT4gMiwKICAgICAgICAgICAgJzMnID0+IDMsCiAgICAgICAgfSwKICAgIH07CgptZWFuaW5nIHRoYXQgdGhlIENyaXRpY2FsaXR5SUQgJzYnIGFuZCB0aGUgSW5jaWRlbnRJRCAnNCcgc3VnZ2VzdCB0aGUgUHJpb3JpdHlJRCAnMicuCgo9Y3V0CgpzdWIgQWxsb2NhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKIyAgICAgICAgU1FMID0+ICdTRUxFQ1QgY3JpdGljYWxpdHlfaWQsIGltcGFjdF9pZCwgcHJpb3JpdHlfaWQgRlJPTSBjaXBfYWxsb2NhdGUnLAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBjYXRlZ29yeV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCBGUk9NIGNoYW5nZV9jaXBfYWxsb2NhdGUnLAojIC0tLQogICAgKTsKCiAgICAjIHJlc3VsdCBsaXN0CiAgICBteSAlQWxsb2NhdGVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxsb2NhdGVEYXRheyAkUm93WzFdIH17ICRSb3dbMF0gfSA9ICRSb3dbMl07CiAgICB9CgogICAgcmV0dXJuIFwlQWxsb2NhdGVEYXRhOwp9Cgo9aXRlbSBBbGxvY2F0ZVVwZGF0ZSgpCgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KI3VwZGF0ZSB0aGUgYWxsb2NhdGlvbiBvZiBjcml0aWNhbGl0eSwgaW1wYWN0IGFuZCBwcmlvcml0eQp1cGRhdGUgdGhlIGFsbG9jYXRpb24gb2YgY2F0ZWdvcnksIGltcGFjdCBhbmQgcHJpb3JpdHkKIyAtLS0KCiAgICBteSAkVHJ1ZSA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+QWxsb2NhdGVVcGRhdGUoCiAgICAgICAgQWxsb2NhdGVEYXRhID0+ICREYXRhUmVmLCAgIyAyRCBoYXNoIHJlZmVyZW5jZQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBbGxvY2F0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBbGxvY2F0ZURhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGFsbG9jYXRlIGRhdGEgaXMgYSBoYXNoIHJlZmVyZW5jZQogICAgaWYgKCByZWYgJFBhcmFte0FsbG9jYXRlRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQWxsb2NhdGVEYXRhIG11c3QgYmUgYSAyRCBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYWxsb2NhdGUgZGF0YSBpcyBhIDJEIGhhc2ggcmVmZXJlbmNlCiAgICBJTVBBQ1RJRDoKICAgIGZvciBteSAkSW1wYWN0SUQgKCBrZXlzICV7ICRQYXJhbXtBbGxvY2F0ZURhdGF9IH0gKSB7CgogICAgICAgIG5leHQgSU1QQUNUSUQgaWYgcmVmICRQYXJhbXtBbGxvY2F0ZURhdGF9LT57JEltcGFjdElEfSBlcSAnSEFTSCc7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQWxsb2NhdGVEYXRhIG11c3QgYmUgYSAyRCBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIG9sZCBhbGxvY2F0aW9ucwojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAnREVMRVRFIEZST00gY2lwX2FsbG9jYXRlJyApOwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAnREVMRVRFIEZST00gY2hhbmdlX2NpcF9hbGxvY2F0ZScgKTsKIyAtLS0KCiAgICAjIGluc2VydCBuZXcgYWxsb2NhdGlvbnMKICAgIGZvciBteSAkSW1wYWN0SUQgKCBrZXlzICV7ICRQYXJhbXtBbGxvY2F0ZURhdGF9IH0gKSB7CgojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgZm9yIG15ICRDcml0aWNhbGl0eUlEICgga2V5cyAleyAkUGFyYW17QWxsb2NhdGVEYXRhfS0+eyRJbXBhY3RJRH0gfSApIHsKICAgICAgICBmb3IgbXkgJENhdGVnb3J5SUQgKCBrZXlzICV7ICRQYXJhbXtBbGxvY2F0ZURhdGF9LT57JEltcGFjdElEfSB9ICkgewojIC0tLQoKICAgICAgICAgICAgIyBleHRyYWN0IHByaW9yaXR5CiMgLS0tCiMgSVRTTSBDaGFuZ2UgTWFuYWdlbWVudAojIC0tLQojICAgICAgICAgICAgbXkgJFByaW9yaXR5SUQgPSAkUGFyYW17QWxsb2NhdGVEYXRhfS0+eyRJbXBhY3RJRH0tPnskQ3JpdGljYWxpdHlJRH07CiAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJFBhcmFte0FsbG9jYXRlRGF0YX0tPnskSW1wYWN0SUR9LT57JENhdGVnb3J5SUR9OwojIC0tLQoKICAgICAgICAgICAgIyBpbnNlcnQgbmV3IGFsbG9jYXRpb24KIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiMgICAgICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaXBfYWxsb2NhdGUgJwojICAgICAgICAgICAgICAgICAgICAuICcoY3JpdGljYWxpdHlfaWQsIGltcGFjdF9pZCwgcHJpb3JpdHlfaWQsICcKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9jaXBfYWxsb2NhdGUgJwogICAgICAgICAgICAgICAgICAgIC4gJyhjYXRlZ29yeV9pZCwgaW1wYWN0X2lkLCBwcmlvcml0eV9pZCwgJwojIC0tLQogICAgICAgICAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgICAgICAgICAgLiAnKD8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbCiMgLS0tCiMgSVRTTSBDaGFuZ2UgTWFuYWdlbWVudAojIC0tLQojICAgICAgICAgICAgICAgICAgICBcJENyaXRpY2FsaXR5SUQsIFwkSW1wYWN0SUQsIFwkUHJpb3JpdHlJRCwKICAgICAgICAgICAgICAgICAgICBcJENhdGVnb3J5SUQsIFwkSW1wYWN0SUQsIFwkUHJpb3JpdHlJRCwKIyAtLS0KICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBQcmlvcml0eUFsbG9jYXRpb25HZXQoKQoKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiNyZXR1cm4gdGhlIHByaW9yaXR5IGlkIG9mIGEgY3JpdGljYWxpdHkgYW5kIGFuIGltcGFjdApyZXR1cm4gdGhlIHByaW9yaXR5IGlkIGZvciBnaXZlbiBjYXRlZ29yeSBhbmQgaW1wYWN0CiMgLS0tCgogICAgbXkgJFByaW9yaXR5SUQgPSAkQ0lQQWxsb2NhdGVPYmplY3QtPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gMzIxLAojICAgICAgICBJbXBhY3RJRCAgICAgID0+IDEyMywKICAgICAgICBDYXRlZ29yeUlEID0+IDMyMSwKICAgICAgICBJbXBhY3RJRCAgID0+IDEyMywKIyAtLS0KICAgICk7Cgo9Y3V0CgpzdWIgUHJpb3JpdHlBbGxvY2F0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiMgICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3JpdGljYWxpdHlJRCBJbXBhY3RJRCkpIHsKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENhdGVnb3J5SUQgSW1wYWN0SUQpKSB7CiMgLS0tCiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5IGlkIGZyb20gZGIKIyAtLS0KIyBJVFNNIENoYW5nZSBNYW5hZ2VtZW50CiMgLS0tCiMgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiMgICAgICAgIFNRTCA9PiAnU0VMRUNUIHByaW9yaXR5X2lkIEZST00gY2lwX2FsbG9jYXRlICcKIyAgICAgICAgICAgIC4gJ1dIRVJFIGNyaXRpY2FsaXR5X2lkID0gPyBBTkQgaW1wYWN0X2lkID0gPycsCiMgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NyaXRpY2FsaXR5SUR9LCBcJFBhcmFte0ltcGFjdElEfSBdLAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBwcmlvcml0eV9pZCBGUk9NIGNoYW5nZV9jaXBfYWxsb2NhdGUgJwogICAgICAgICAgICAuICdXSEVSRSBjYXRlZ29yeV9pZCA9ID8gQU5EIGltcGFjdF9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NhdGVnb3J5SUR9LCBcJFBhcmFte0ltcGFjdElEfSBdLAojIC0tLQogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggcmVzdWx0CiAgICBteSAkUHJpb3JpdHlJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFByaW9yaXR5SUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkUHJpb3JpdHlJRDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIC0tLQojIElUU00gQ2hhbmdlIE1hbmFnZW1lbnQKIyAtLS0KI2RpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dD4uCiMgLS0tCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAxMC8wMy8wMSAxMjo0NDo1MyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uLnBtIC0gYWxsIGNvbmRpdGlvbiBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Db25kaXRpb24ucG0sdiAxLjUxIDIwMTAvMDcvMDIgMjM6MDg6MzEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcik7CnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPYmplY3QpOwp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QXR0cmlidXRlKTsKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9wZXJhdG9yKTsKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246OkV4cHJlc3Npb24pOwp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uKTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNTEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uIC0gY29uZGl0aW9uIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIGZvciBjb25kaXRpb25zIGluIElUU01DaGFuZ2VNYW5hZ2VtZW50LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZGl0aW9uT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWJ1ZyBmbGFnCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyAgICAgPT4gJ0lUU01Db25kaXRpb246OkV2ZW50TW9kdWxlJywKICAgICAgICBCYXNlT2JqZWN0ID0+ICdDb25kaXRpb25PYmplY3QnLAogICAgICAgIE9iamVjdHMgICAgPT4gewogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvbmRpdGlvbkFkZCgpCgpBZGQgYSBuZXcgY29uZGl0aW9uLgoKICAgIG15ICRDb25kaXRpb25JRCA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkFkZCgKICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnVGhlIGNvbmRpdGlvbiBuYW1lJywKICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2FueScsICAgICAgICAgICAgICAgICAjIChhbnl8YWxsKQogICAgICAgIENvbW1lbnQgICAgICAgICAgICAgICA9PiAnQSBjb21tZW50JywgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25kaXRpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlSUQgTmFtZSBFeHByZXNzaW9uQ29uanVuY3Rpb24gVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYSBjb25kaXRpb24gd2l0aCB0aGlzIG5hbWUgYW5kIGNoYW5nZSBpZCBleGlzdCBhbHJlYWR5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX2NvbmRpdGlvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoYW5nZV9pZCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDaGFuZ2VJRH0sIFwkUGFyYW17TmFtZX0sCiAgICAgICAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDb25kaXRpb25JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvbmRpdGlvbklEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGEgY29uZGl0aW9uIHdpdGggdGhpcyBuYW1lIGFuZCBjaGFuZ2UgaWQgZXhpc3RzIGFscmVhZHkKICAgIGlmICgkQ29uZGl0aW9uSUQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgY29uZGl0aW9uIHdpdGggdGhlIG5hbWUgJFBhcmFte05hbWV9ICIKICAgICAgICAgICAgICAgIC4gImV4aXN0cyBhbHJlYWR5IGZvciBDaGFuZ2VJRCAkUGFyYW17Q2hhbmdlSUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cmlnZ2VyIENvbmRpdGlvbkFkZFByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ29uZGl0aW9uQWRkUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgbmV3IGNvbmRpdGlvbiB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2VfY29uZGl0aW9uICcKICAgICAgICAgICAgLiAnKGNoYW5nZV9pZCwgbmFtZSwgZXhwcmVzc2lvbl9jb25qdW5jdGlvbiwgY29tbWVudHMsIHZhbGlkX2lkLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDaGFuZ2VJRH0sIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSwKICAgICAgICAgICAgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfY29uZGl0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgY2hhbmdlX2lkID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NoYW5nZUlEfSwgXCRQYXJhbXtOYW1lfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZGl0aW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2hlY2sgaWYgY29uZGl0aW9uIGNvdWxkIGJlIGFkZGVkCiAgICBpZiAoICEkQ29uZGl0aW9uSUQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb25kaXRpb25BZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHRyaWdnZXIgQ29uZGl0aW9uQWRkUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ29uZGl0aW9uQWRkUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRDb25kaXRpb25JRDsKfQoKPWl0ZW0gQ29uZGl0aW9uVXBkYXRlKCkKClVwZGF0ZSBhIGNvbmRpdGlvbi4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvblVwZGF0ZSgKICAgICAgICBDb25kaXRpb25JRCAgICAgICAgICAgPT4gMTIzNCwKICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gJ1RoZSBjb25kaXRpb24gbmFtZScsICAjIChvcHRpb25hbCkKICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2FueScsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgKGFueXxhbGwpCiAgICAgICAgQ29tbWVudCAgICAgICAgICAgICAgID0+ICdBIGNvbW1lbnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvblVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBDb25kaXRpb25VcGRhdGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NvbmRpdGlvblVwZGF0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGN1cnJlbnQgY29uZGl0aW9uIGRhdGEgZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb25EYXRhID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIG1hcCB1cGRhdGUgYXR0cmlidXRlcyB0byBjb2x1bW4gbmFtZXMKICAgIG15ICVBdHRyaWJ1dGUgPSAoCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICduYW1lJywKICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2V4cHJlc3Npb25fY29uanVuY3Rpb24nLAogICAgICAgIENvbW1lbnQgICAgICAgICAgICAgICA9PiAnY29tbWVudHMnLAogICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgICA9PiAndmFsaWRfaWQnLAogICAgKTsKCiAgICAjIGJ1aWxkIFNRTCB0byB1cGRhdGUgY29uZGl0aW9uCiAgICBteSAkU1FMID0gJ1VQREFURSBjaGFuZ2VfY29uZGl0aW9uIFNFVCAnOwogICAgbXkgQEJpbmQ7CgogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICVBdHRyaWJ1dGUgKSB7CgogICAgICAgICMgcHJlc2VydmUgdGhlIG9sZCB2YWx1ZSwgd2hlbiB0aGUgY29sdW1uIGlzbid0IGluIGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZXhpc3RzICRQYXJhbXskQXR0cmlidXRlfTsKCiAgICAgICAgIyBwYXJhbSBjaGVja2luZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNvIHRoaXMgaXMgc2FmZQogICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17JEF0dHJpYnV0ZX07CiAgICB9CgogICAgIyBhZGQgY2hhbmdlIHRpbWUgYW5kIGNoYW5nZSB1c2VyCiAgICAkU1FMIC49ICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICc7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CgogICAgIyBzZXQgbWF0Y2hpbmcgb2YgU1FMIHN0YXRlbWVudAogICAgJFNRTCAuPSAnV0hFUkUgaWQgPSA/JzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q29uZGl0aW9uSUR9OwoKICAgICMgdXBkYXRlIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIHRyaWdnZXIgQ29uZGl0aW9uVXBkYXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ29uZGl0aW9uVXBkYXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIE9sZENvbmRpdGlvbkRhdGEgPT4gJENvbmRpdGlvbkRhdGEsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb25kaXRpb25HZXQoKQoKUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIG9mIHRoZSBjb25kaXRpb24gZGF0YSBmb3IgYSBnaXZlbiBDb25kaXRpb25JRC4KCiAgICBteSAkQ29uZGl0aW9uRGF0YSA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgZm9sbG93aW5nIGVsZW1lbnRzOgoKICAgICRDb25kaXRpb25EYXRhe0NvbmRpdGlvbklEfQogICAgJENvbmRpdGlvbkRhdGF7Q2hhbmdlSUR9CiAgICAkQ29uZGl0aW9uRGF0YXtOYW1lfQogICAgJENvbmRpdGlvbkRhdGF7RXhwcmVzc2lvbkNvbmp1bmN0aW9ufQogICAgJENvbmRpdGlvbkRhdGF7Q29tbWVudH0KICAgICRDb25kaXRpb25EYXRhe1ZhbGlkSUR9CiAgICAkQ29uZGl0aW9uRGF0YXtDcmVhdGVUaW1lfQogICAgJENvbmRpdGlvbkRhdGF7Q3JlYXRlQnl9CiAgICAkQ29uZGl0aW9uRGF0YXtDaGFuZ2VUaW1lfQogICAgJENvbmRpdGlvbkRhdGF7Q2hhbmdlQnl9Cgo9Y3V0CgpzdWIgQ29uZGl0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGNoYW5nZV9pZCwgbmFtZSwgZXhwcmVzc2lvbl9jb25qdW5jdGlvbiwgY29tbWVudHMsICcKICAgICAgICAgICAgLiAndmFsaWRfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9jb25kaXRpb24gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25kaXRpb25JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVDb25kaXRpb25EYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDb25kaXRpb25JRH0gICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDaGFuZ2VJRH0gICAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtOYW1lfSAgICAgICAgICAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtFeHByZXNzaW9uQ29uanVuY3Rpb259ID0gJFJvd1szXTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDb21tZW50fSAgICAgICAgICAgICAgID0gJFJvd1s0XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtWYWxpZElEfSAgICAgICAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDcmVhdGVUaW1lfSAgICAgICAgICAgID0gJFJvd1s2XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDcmVhdGVCeX0gICAgICAgICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDaGFuZ2VUaW1lfSAgICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXtDaGFuZ2VCeX0gICAgICAgICAgICAgID0gJFJvd1s5XTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElQ29uZGl0aW9uRGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbklEICRQYXJhbXtDb25kaXRpb25JRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNsZWFudXAgdGltZSBzdGFtcHMgKHNvbWUgZGF0YWJhc2VzIGFyZSB1c2luZyBlLiBnLiAyMDA4LTAyLTI1IDIyOjAzOjAwLjAwMDAwMCkKICAgIFRJTUVGSUVMRDoKICAgIGZvciBteSAkVGltZWZpZWxkICggJ0NyZWF0ZVRpbWUnLCAnQ2hhbmdlVGltZScsICkgewogICAgICAgIG5leHQgVElNRUZJRUxEIGlmICEkQ29uZGl0aW9uRGF0YXskVGltZWZpZWxkfTsKICAgICAgICAkQ29uZGl0aW9uRGF0YXskVGltZWZpZWxkfQogICAgICAgICAgICA9fiBzeyBcQSAoIFxkXGRcZFxkIC0gXGRcZCAtIFxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgKSBcLiAuKz8gXHogfXskMX14bXM7CiAgICB9CgogICAgcmV0dXJuIFwlQ29uZGl0aW9uRGF0YTsKfQoKPWl0ZW0gQ29uZGl0aW9uTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIGFsbCBjb25kaXRpb25zIGlkcyBvZiBhIGdpdmVuIGNoYW5nZSBpZCBhcyBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkQ29uZGl0aW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiA1LAogICAgICAgIFZhbGlkICAgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIHBhcmFtCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBkZWZpbmUgU1FMIHN0YXRlbWVudAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgJwogICAgICAgIC4gJ0ZST00gY2hhbmdlX2NvbmRpdGlvbiAnCiAgICAgICAgLiAnV0hFUkUgY2hhbmdlX2lkID0gPyAnOwoKICAgICMgZ2V0IG9ubHkgdmFsaWQgY29uZGl0aW9uIGlkcwogICAgaWYgKCAkUGFyYW17VmFsaWR9ICkgewoKICAgICAgICBteSBAVmFsaWRJRHMgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKTsKICAgICAgICBteSAkVmFsaWRJRFN0cmluZyA9IGpvaW4gJywgJywgQFZhbGlkSURzOwoKICAgICAgICAkU1FMIC49ICJBTkQgdmFsaWRfaWQgSU4gKCAkVmFsaWRJRFN0cmluZyApICI7CiAgICB9CgogICAgIyBnZXQgc29ydGVkIGxpc3QKICAgICRTUUwgLj0gJ09SREVSIEJZIG5hbWUgQVNDICc7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDb25kaXRpb25JRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENvbmRpdGlvbklEcywgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBDb25kaXRpb25JRHM7Cn0KCj1pdGVtIENvbmRpdGlvbkRlbGV0ZSgpCgpEZWxldGUgYSBjb25kaXRpb24uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25EZWxldGUoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbkRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBDb25kaXRpb25EZWxldGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NvbmRpdGlvbkRlbGV0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmRpdGlvbiBkYXRhIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uRGF0YSA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIGV4cHJlc3Npb25zIGZvciB0aGlzIGNvbmRpdGlvbiBpZAogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+RXhwcmVzc2lvbkRlbGV0ZUFsbCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTdWNjZXNzOwoKICAgICMgZGVsZXRlIGFsbCBhY3Rpb25zIGZvciB0aGlzIGNvbmRpdGlvbiBpZAogICAgJFN1Y2Nlc3MgPSAkU2VsZi0+QWN0aW9uRGVsZXRlQWxsKAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgIyBkZWxldGUgY29uZGl0aW9uIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY2hhbmdlX2NvbmRpdGlvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q29uZGl0aW9uSUR9IF0sCiAgICApOwoKICAgICMgdHJpZ2dlciBDb25kaXRpb25EZWxldGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25kaXRpb25EZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgT2xkQ29uZGl0aW9uRGF0YSA9PiAkQ29uZGl0aW9uRGF0YSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvbmRpdGlvbkRlbGV0ZUFsbCgpCgpEZWxldGUgYWxsIGNvbmRpdGlvbnMgZm9yIGEgZ2l2ZW4gQ2hhbmdlSUQuCkFsbCByZWxhdGVkIGV4cHJlc3Npb25zIGFuZCBhY3Rpb25zIHdpbGwgYmUgZGVsZXRlZCBmaXJzdC4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkRlbGV0ZUFsbCgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZGl0aW9uRGVsZXRlQWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIGNvbmRpdGlvbiBpZHMgKGluY2x1ZGluZyBpbnZhbGlkKSBmb3IgdGhlIGdpdmVuIGNoYW5nZSBpZAogICAgbXkgJENvbmRpdGlvbklEc1JlZiA9ICRTZWxmLT5Db25kaXRpb25MaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVmFsaWQgICAgPT4gMCwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB0cmlnZ2VyIENvbmRpdGlvbkRlbGV0ZUFsbFByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ29uZGl0aW9uRGVsZXRlQWxsUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgZm9yIG15ICRDb25kaXRpb25JRCAoIEB7JENvbmRpdGlvbklEc1JlZn0gKSB7CgogICAgICAgICMgZGVsZXRlIGFsbCBleHByZXNzaW9ucyBmb3IgdGhpcyBjb25kaXRpb24gaWQKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5FeHByZXNzaW9uRGVsZXRlQWxsKAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgICAgICMgZGVsZXRlIGFsbCBhY3Rpb25zIGZvciB0aGlzIGNvbmRpdGlvbiBpZAogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPkFjdGlvbkRlbGV0ZUFsbCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gaWYgISRTdWNjZXNzOwogICAgfQoKICAgICMgZGVsZXRlIGNvbmRpdGlvbnMgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjaGFuZ2VfY29uZGl0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgY2hhbmdlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICApOwoKICAgICMgdHJpZ2dlciBDb25kaXRpb25EZWxldGVBbGxQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDb25kaXRpb25EZWxldGVBbGxQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvbmRpdGlvbk1hdGNoRXhlY3V0ZUFsbCgpCgpUaGlzIGZ1bmN0aW9ucyBmaW5kcyBhbGwgY29uZGl0aW9ucyBmb3IgYSBnaXZlbiBDaGFuZ2VJRCwgYW5kIGluIGNhc2UgYSBjb25kaXRpb24gbWF0Y2hlcywKYWxsIGRlZmluZWQgYWN0aW9ucyB3aWxsIGJlIGV4ZWN1dGVkLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+Q29uZGl0aW9uTWF0Y2hFeGVjdXRlQWxsKAogICAgICAgIENoYW5nZUlEICAgICAgICAgID0+IDEyMywKICAgICAgICBBdHRyaWJ1dGVzQ2hhbmdlZCA9PiB7IElUU01DaGFuZ2UgPT4gWyBDaGFuZ2VUaXRsZSwgQ2hhbmdlRGVzY3JpcHRpb25dIH0sICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25kaXRpb25NYXRjaEV4ZWN1dGVBbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhbGwgY29uZGl0aW9uIGlkcyBmb3IgdGhlIGdpdmVuIGNoYW5nZSBpZAogICAgbXkgJENvbmRpdGlvbklEc1JlZiA9ICRTZWxmLT5Db25kaXRpb25MaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVmFsaWQgICAgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcnMKICAgIHJldHVybiBpZiAhJENvbmRpdGlvbklEc1JlZjsKICAgIHJldHVybiBpZiByZWYgJENvbmRpdGlvbklEc1JlZiBuZSAnQVJSQVknOwoKICAgICMgbm8gZXJyb3IgaWYganVzdCBubyB2YWxpZCBjb25kaXRpb25zIHdlcmUgZm91bmQKICAgIHJldHVybiAxIGlmICFAeyRDb25kaXRpb25JRHNSZWZ9OwoKICAgICMgbWF0Y2ggYW5kIGV4ZWN1dGUgYWxsIGNvbmRpdGlvbnMKICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBAeyRDb25kaXRpb25JRHNSZWZ9ICkgewoKICAgICAgICAjIG1hdGNoIGFuZCBleGVjdXRlIGVhY2ggY29uZGl0aW9uCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+Q29uZGl0aW9uTWF0Y2hFeGVjdXRlKAogICAgICAgICAgICBDb25kaXRpb25JRCAgICAgICA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+ICRQYXJhbXtBdHRyaWJ1dGVzQ2hhbmdlZH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgd3JpdGUgbG9nIGVudHJ5IGJ1dCBkbyBub3QgcmV0dXJuCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb25kaXRpb25NYXRjaEV4ZWN1dGUgZm9yIENvbmRpdGlvbklEICckQ29uZGl0aW9uSUQnIGZhaWxlZCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29uZGl0aW9uTWF0Y2hFeGVjdXRlKCkKClRoaXMgZnVuY3Rpb24gbWF0Y2hlcyB0aGUgZ2l2ZW4gY29uZGl0aW9uIGFuZCBleGVjdXRlcyBhbGwgZGVmaW5lZCBhY3Rpb25zLgpUaGUgb3B0aW9uYWwgcGFyYW1ldGVyICdBdHRyaWJ1dGVzQ2hhbmdlZCcgZGVmaW5lcyBhIGxpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IHdlcmUgY2hhbmdlZApkdXJpbmcgZS5nLiBhIENoYW5nZVVwZGF0ZS1FdmVudC4gSWYgYSBjb25kaXRpb24gbWF0Y2hlcyBhbiBleHByZXNzaW9uLCB0aGUgYXR0cmlidXRlIG9mIHRoZSBleHByZXNzaW9uCm11c3QgYmUgbGlzdGVkIGluICdBdHRyaWJ1dGVzQ2hhbmdlZCcuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25NYXRjaEV4ZWN1dGUoCiAgICAgICAgQ29uZGl0aW9uSUQgICAgICAgPT4gMTIzLAogICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgSVRTTUNoYW5nZSA9PiBbIENoYW5nZVRpdGxlLCBDaGFuZ2VEZXNjcmlwdGlvbl0gfSwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbk1hdGNoRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBkYXRhCiAgICBteSAkQ29uZGl0aW9uRGF0YSA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uRGF0YTsKCiAgICAjIGdldCBhbGwgZXhwcmVzc2lvbnMgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaWQKICAgIG15ICRFeHByZXNzaW9uSURzUmVmID0gJFNlbGYtPkV4cHJlc3Npb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3JzCiAgICByZXR1cm4gaWYgISRFeHByZXNzaW9uSURzUmVmOwogICAgcmV0dXJuIGlmIHJlZiAkRXhwcmVzc2lvbklEc1JlZiBuZSAnQVJSQVknOwoKICAgICMgbm8gZXJyb3IgaWYganVzdCBubyBleHByZXNzaW9ucyB3ZXJlIGZvdW5kCiAgICByZXR1cm4gMSBpZiAhQHskRXhwcmVzc2lvbklEc1JlZn07CgogICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb24gaWRzCiAgICBteSAkRXhwcmVzc2lvbklEQ291bnQgPSBzY2FsYXIgQHskRXhwcmVzc2lvbklEc1JlZn07CgogICAgIyBnZXQgYWxsIGFjdGlvbnMgZm9yIHRoZSBnaXZlbiBjb25kaXRpb24gaWQKICAgIG15ICRBY3Rpb25JRHNSZWYgPSAkU2VsZi0+QWN0aW9uTGlzdCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9ycwogICAgcmV0dXJuIGlmICEkQWN0aW9uSURzUmVmOwogICAgcmV0dXJuIGlmIHJlZiAkQWN0aW9uSURzUmVmIG5lICdBUlJBWSc7CgogICAgIyBubyBlcnJvciBpZiBqdXN0IG5vIGFjdGlvbnMgd2VyZSBmb3VuZAogICAgcmV0dXJuIDEgaWYgIUB7JEFjdGlvbklEc1JlZn07CgogICAgIyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHBvc2l0aXZlICh0cnVlKSBleHByZXNzaW9ucwogICAgbXkgQEV4cHJlc3Npb25NYXRjaFJlc3VsdDsKCiAgICAjIHRvIHN0b3JlIGlmIHRoZSBjb25kaXRpb24gbWF0Y2hlcwogICAgbXkgJENvbmRpdGlvbk1hdGNoOwoKICAgICMgdHJ5IHRvIG1hdGNoIGVhY2ggZXhwcmVzc2lvbgogICAgRVhQUkVTU0lPTklEOgogICAgZm9yIG15ICRFeHByZXNzaW9uSUQgKCBAeyRFeHByZXNzaW9uSURzUmVmfSApIHsKCiAgICAgICAgIyBub3JtYWxseSBnaXZlIHRoZSBsaXN0IG9mIGNoYW5nZWQgYXR0cmlidXRlcyB0byBFeHByZXNzaW9uTWF0Y2goKSBmdW5jdGlvbgogICAgICAgIG15ICRBdHRyaWJ1dGVzQ2hhbmdlZCA9ICRQYXJhbXtBdHRyaWJ1dGVzQ2hhbmdlZH07CgogICAgICAgICMgZXhwcmVzc2lvbiBjb25qdW5jdGlvbiBpcyAnYWxsJyBhbmQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBleHByZXNpb24KICAgICAgICBpZiAoICRDb25kaXRpb25EYXRhLT57RXhwcmVzc2lvbkNvbmp1bmN0aW9ufSBlcSAnYWxsJyAmJiAkRXhwcmVzc2lvbklEQ291bnQgPiAxICkgewoKICAgICAgICAgICAgIyBkbyBub3QgZ2l2ZSB0aGUgbGlzdCBvZiBjaGFuZ2VkIGF0dHJpYnV0ZXMgdG8gRXhwcmVzc2lvbk1hdGNoKCkKICAgICAgICAgICAgJEF0dHJpYnV0ZXNDaGFuZ2VkID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIG1hdGNoIGV4cHJlc3Npb24KICAgICAgICBteSAkRXhwcmVzc2lvbk1hdGNoID0gJFNlbGYtPkV4cHJlc3Npb25NYXRjaCgKICAgICAgICAgICAgRXhwcmVzc2lvbklEICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgQXR0cmlidXRlc0NoYW5nZWQgPT4gJEF0dHJpYnV0ZXNDaGFuZ2VkLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApIHx8IDA7CgogICAgICAgICMgc2V0IENvbmRpdGlvbk1hdGNoIHRydWUgaWYgRXhwcmVzc2lvbk1hdGNoIGlzIHRydWUgYW5kICdhbnknIGlzIHJlcXVlc3RlZAogICAgICAgIGlmICggJENvbmRpdGlvbkRhdGEtPntFeHByZXNzaW9uQ29uanVuY3Rpb259IGVxICdhbnknICYmICRFeHByZXNzaW9uTWF0Y2ggKSB7CiAgICAgICAgICAgICRDb25kaXRpb25NYXRjaCA9IDE7CiAgICAgICAgICAgIGxhc3QgRVhQUkVTU0lPTklEOwogICAgICAgIH0KCiAgICAgICAgIyBjb25kaXRpb24gaXMgZmFsc2UgYXQgYWxsLCBzbyByZXR1cm4gdHJ1ZQogICAgICAgIGlmICggJENvbmRpdGlvbkRhdGEtPntFeHByZXNzaW9uQ29uanVuY3Rpb259IGVxICdhbGwnICYmICEkRXhwcmVzc2lvbk1hdGNoICkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBjdXJyZW50IGV4cHJlc3Npb24gbWF0Y2ggcmVzdWx0IGZvciBsYXRlciBjaGVja3MKICAgICAgICBwdXNoIEBFeHByZXNzaW9uTWF0Y2hSZXN1bHQsICRFeHByZXNzaW9uTWF0Y2g7CiAgICB9CgogICAgIyBjb3VudCBhbGwgcmVzdWx0cyB3aGljaCBoYXZlIGEgdHJ1ZSB2YWx1ZQogICAgbXkgJFRydWVDb3VudCA9IHNjYWxhciBncmVwIHsgJF8gPT0gMSB9IEBFeHByZXNzaW9uTWF0Y2hSZXN1bHQ7CgogICAgIyBpZiB0aGUgY29uZGl0aW9uIGRpZCBub3QgbWF0Y2ggYWxyZWFkeSwgYW5kIG5vdCBhbGwgZXhwcmVzc2lvbnMgYXJlIHRydWUKICAgIGlmICggISRDb25kaXRpb25NYXRjaCAmJiAkVHJ1ZUNvdW50ICE9ICRFeHByZXNzaW9uSURDb3VudCApIHsKCiAgICAgICAgIyBubyBlcnJvcjogaWYganVzdCB0aGUgY29uZGl0aW9uIGRpZCBub3QgbWF0Y2gsCiAgICAgICAgIyB0aGVyZSBpcyBubyBuZWVkIHRvIGV4ZWN1dGUgYW55IGFjdGlvbnMKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGV4ZWN1dGUgYWxsIGFjdGlvbnMgb2YgdGhpcyBjb25kaXRpb24KICAgIEFDVElPTklEOgogICAgZm9yIG15ICRBY3Rpb25JRCAoIEB7JEFjdGlvbklEc1JlZn0gKSB7CgogICAgICAgICMgZXhlY3V0ZSBlYWNoIGFjdGlvbgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFjdGlvbkV4ZWN1dGUoCiAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICMgZG8gbm90IHByaW50IGVycm9yIG1lc3NhZ2UgaWYgJzAnIGlzIHJldHVybmVkCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU3VjY2VzcyB8fCAkU3VjY2VzcyBuZSAnMScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBY3Rpb25JRCAnJEFjdGlvbklEJyBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5ICIKICAgICAgICAgICAgICAgICAgICAuICJmb3IgQ29uZGl0aW9uSUQgJyRQYXJhbXtDb25kaXRpb25JRH0nLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb25kaXRpb25NYXRjaFN0YXRlTG9jaygpCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5Db25kaXRpb25NYXRjaFN0YXRlTG9jaygKICAgICAgICBPYmplY3ROYW1lID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBTZWxlY3RvciAgID0+IDIzNCwKICAgICAgICBTdGF0ZUlEICAgID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmRpdGlvbk1hdGNoU3RhdGVMb2NrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdE5hbWUgU2VsZWN0b3IgU3RhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGlkIG9mIG9iamVjdAogICAgbXkgJE9iamVjdElEID0gJFNlbGYtPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJFBhcmFte09iamVjdE5hbWV9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgcmV0dXJuIGlmICEkT2JqZWN0SUQ7CgogICAgIyBnZXQgaWQgb2Ygb3BlcmF0b3I7CiAgICBteSAkT3BlcmF0b3JOYW1lID0gJ2xvY2snOwogICAgbXkgJE9wZXJhdG9ySUQgICA9ICRTZWxmLT5PcGVyYXRvckxvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJE9wZXJhdG9yTmFtZSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJE9wZXJhdG9ySUQ7CgogICAgIyBnZXQgY29uZGl0aW9ucwogICAgbXkgJENvbmRpdGlvbnMgPSAkU2VsZi0+X0NvbmRpdGlvbkxpc3RCeU9iamVjdCgKICAgICAgICBPYmplY3ROYW1lID0+ICRQYXJhbXtPYmplY3ROYW1lfSwKICAgICAgICBTZWxlY3RvciAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICkgfHwgW107CgogICAgIyBjaGVjayBlcnJvcgogICAgcmV0dXJuIGlmICFAeyRDb25kaXRpb25zfTsKCiAgICAjIGdldCBhbGwgYWN0aW9ucyBhZmZlY3RpbmcgdGhpcyBvYmplY3QKICAgIG15IEBBZmZlY3RlZENvbmRpdGlvbklEczsKICAgIENPTkRJVElPTklEOgogICAgZm9yIG15ICRDb25kaXRpb25JRCAoIEB7JENvbmRpdGlvbnN9ICkgewoKICAgICAgICAjIGdldCBhY3Rpb25zIGZvciB0aGlzIGNvbmRpdGlvbgogICAgICAgIG15ICRBY3Rpb25JRHNSZWYgPSAkU2VsZi0+QWN0aW9uTGlzdCgKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApIHx8IFtdOwoKICAgICAgICAjIGNoZWNrIGFjdGlvbnMKICAgICAgICBuZXh0IENPTkRJVElPTklEIGlmICFAeyRBY3Rpb25JRHNSZWZ9OwoKICAgICAgICAjIGNoZWNrIGZvciBhY3Rpb25zCiAgICAgICAgQUNUSU9OSUQ6CiAgICAgICAgZm9yIG15ICRBY3Rpb25JRCAoIEB7JEFjdGlvbklEc1JlZn0gKSB7CgogICAgICAgICAgICAjIGdldCBhY3Rpb24KICAgICAgICAgICAgbXkgJEFjdGlvbiA9ICRTZWxmLT5BY3Rpb25HZXQoCiAgICAgICAgICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgYWN0aW9uCiAgICAgICAgICAgIG5leHQgQUNUSU9OSUQgaWYgISRBY3Rpb247CgogICAgICAgICAgICAjIHN0b3JlIG9ubHkgYWZmZWN0ZWQgYWN0aW9ucwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQWN0aW9uLT57T2JqZWN0SUR9IGVxICRPYmplY3RJRAogICAgICAgICAgICAgICAgJiYgJEFjdGlvbi0+e09wZXJhdG9ySUR9IGVxICRPcGVyYXRvcklECiAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgJEFjdGlvbi0+e1NlbGVjdG9yfSBlcSAkUGFyYW17U2VsZWN0b3J9CiAgICAgICAgICAgICAgICAgICAgfHwgJEFjdGlvbi0+e1NlbGVjdG9yfSBlcSAnYWxsJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgJiYgJEFjdGlvbi0+e0FjdGlvblZhbHVlfSBlcSAkUGFyYW17U3RhdGVJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQWZmZWN0ZWRDb25kaXRpb25JRHMsICRBY3Rpb24tPntDb25kaXRpb25JRH07CgogICAgICAgICAgICAgICAgIyBmb3VuZCBhIGNvbmRpdGlvbiB3aXRoIGFuIGFmZmVjdGVkIGFjdGlvbgogICAgICAgICAgICAgICAgIyBzbyB3ZSBjYW4gbW92ZSBvbiB0byB0aGUgbmV4dCBjb25kaXRpb24KICAgICAgICAgICAgICAgIG5leHQgQ09ORElUSU9OSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgYWZmZWN0ZWQgY29uZGl0aW9ucwogICAgcmV0dXJuIGlmICFAQWZmZWN0ZWRDb25kaXRpb25JRHM7CgogICAgIyBjaGVjayBmb3IgcG9zaXRpdmUgY29uZGl0aW9uIG1hdGNoZXMKICAgIEFGRkVDVEVEQ09ORElUSU9OSUQ6CiAgICBmb3IgbXkgJEFmZmVjdGVkQ29uZGl0aW9uSUQgKEBBZmZlY3RlZENvbmRpdGlvbklEcykgewoKICAgICAgICAjIGdldCBjb25kaXRpb24gbWF0Y2gKICAgICAgICBteSAkQ29uZGl0aW9uTWF0Y2ggPSAkU2VsZi0+X0NvbmRpdGlvbk1hdGNoKAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQWZmZWN0ZWRDb25kaXRpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBBRkZFQ1RFRENPTkRJVElPTklEIGlmICEkQ29uZGl0aW9uTWF0Y2g7CgogICAgICAgICMgY29uZGl0aW9uIG1hdGNoZWQgc3VjY2Vzc2Z1bGx5CiAgICAgICAgcmV0dXJuIDEgaWYgJENvbmRpdGlvbk1hdGNoOwogICAgfQoKICAgICMgbm8gY29uZGl0aW9uIG1hdGNoZWQKICAgIHJldHVybjsKfQoKPWl0ZW0gQ29uZGl0aW9uQ29tcGFyZVZhbHVlRmllbGRUeXBlKCkKClJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGNvbXBhcmUgdmFsdWUgZmllbGQgYXMgc3RyaW5nLCBiYXNlZCBvbiB0aGUgZ2l2ZW4gb2JqZWN0IGlkIGFuZCBhdHRyaWJ1dGUgaWQuCgogICAgbXkgJEZpZWxkVHlwZSA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkNvbXBhcmVWYWx1ZUZpZWxkVHlwZSgKICAgICAgICBPYmplY3RJRCAgICA9PiAxMjM0LAogICAgICAgIEF0dHJpYnV0ZUlEID0+IDUsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zICdUZXh0JyBvciAnU2VsZWN0aW9uJyBvciAnRGF0ZScuCgpUT0RPOiBBZGQgJ0F1dG9jb21wbGV0ZScgdHlwZSBmb3IgQ2hhbmdlQnVpbGRlciwgQ2hhbmdlTWFuYWdlciwgV29ya09yZGVyQWdlbnQsIGV0Yy4uLgoKPWN1dAoKc3ViIENvbmRpdGlvbkNvbXBhcmVWYWx1ZUZpZWxkVHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3RJRCBBdHRyaWJ1dGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9va3VwIG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgT2JqZWN0SUQgPT4gJFBhcmFte09iamVjdElEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJE9iamVjdE5hbWUgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPYmplY3RJRCAkUGFyYW17T2JqZWN0SUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgYXR0cmlidXRlIG5hbWUKICAgIG15ICRBdHRyaWJ1dGVOYW1lID0gJFNlbGYtPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICBBdHRyaWJ1dGVJRCA9PiAkUGFyYW17QXR0cmlidXRlSUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICEkQXR0cmlidXRlTmFtZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dHJpYnV0ZUlEICRQYXJhbXtBdHRyaWJ1dGVJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgZmllbGQgdHlwZSBjb25maWcgZm9yIHRoZSBnaXZlbiBvYmplY3QKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJE9iamVjdE5hbWUgLiAnOjpBdHRyaWJ1dGU6OkNvbXBhcmVWYWx1ZTo6RmllbGRUeXBlJyApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJENvbmZpZzsKCiAgICAjIHJlbW92ZSB0aGUgSUQgZnJvbSBjaGFuZ2Ugb3Igd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgJEF0dHJpYnV0ZU5hbWUgPX4gc3sgXEEgKCggQ2hhbmdlIHwgV29ya09yZGVyICkgRnJlZSAoIEtleSB8IFRleHQgKSkgKCBcZCsgKSB9eyQxfXhtczsKCiAgICAjIGdldCB0aGUgZmllbGQgdHlwZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBvciByZXR1cm4gdGhlIGRlZmF1bHQgZmllbGQgdHlwZSAnU2VsZWN0aW9uJwogICAgbXkgJEZpZWxkVHlwZSA9ICRDb25maWctPnskQXR0cmlidXRlTmFtZX0gfHwgJ1NlbGVjdGlvbic7CgogICAgcmV0dXJuICRGaWVsZFR5cGU7Cn0KCj1pdGVtIENvbmRpdGlvbkxpc3RCeU9iamVjdFR5cGUoKQoKUmV0dXJuIGEgbGlzdCBvZiBhbGwgY29uZGl0aW9ucyBpZHMgb2YgYSBnaXZlbiBjaGFuZ2UgaWQgYXMgYXJyYXkgcmVmZXJlbmNlLgpPbmx5IHRoZSBpZHMgb2YgYWYgY29uZGl0aW9uIGFyZSByZXR1cm5lZCB3aGVyZSBvYmplY3QgdHlwZSBhbmQgaWRlbnRpZmllciBhcmUgbWF0Y2hpbmcuCgogICAgbXkgJENvbmRpdGlvbklEc1JlZiA9ICRDb25kaXRpb25PYmplY3QtPkNvbmRpdGlvbkxpc3RCeU9iamVjdFR5cGUoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnSVRTTVdvcmtPcmRlcicKICAgICAgICBTZWxlY3RvciAgID0+IDEyMzQsCiAgICAgICAgQ2hhbmdlSUQgICA9PiA1LAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZGl0aW9uTGlzdEJ5T2JqZWN0VHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3RUeXBlIFNlbGVjdG9yIENoYW5nZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9ucyBvZiBjaGFuZ2UKICAgIG15ICRDaGFuZ2VDb25kaXRpb25zID0gJFNlbGYtPkNvbmRpdGlvbkxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBjb25kaXRpb25zCiAgICByZXR1cm4gaWYgISRDaGFuZ2VDb25kaXRpb25zOwoKICAgICMgZ2V0IGV4cHJlc3Npb25zIG9mIGNvbmRpdGlvbnMKICAgIG15ICVDb25kaXRpb25FeHByZXNzaW9uID0gbWFwIHsKICAgICAgICAkXyA9PiAkU2VsZi0+RXhwcmVzc2lvbkxpc3QoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRfLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKSB8fCBbXQogICAgfSBAeyRDaGFuZ2VDb25kaXRpb25zfTsKCiAgICAjIGdldCBhY3Rpb25zIG9mIGNvbmRpdGlvbnMKICAgIG15ICVDb25kaXRpb25BY3Rpb24gPSBtYXAgewogICAgICAgICRfID0+ICRTZWxmLT5BY3Rpb25MaXN0KAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkXywKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICkgfHwgW10KICAgIH0gQHskQ2hhbmdlQ29uZGl0aW9uc307CgogICAgIyBnZXQgb2JqZWN0IGlkIG9mIG9iamVjdCB0eXBlCiAgICBteSAkT2JqZWN0SUQgPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgIE5hbWUgICA9PiAkUGFyYW17T2JqZWN0VHlwZX0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBpZAogICAgcmV0dXJuIGlmICEkT2JqZWN0SUQ7CgogICAgIyBnZXQgb25seSBhZmZlY3RlZCB1bmlxdWUgY29uZGl0aW9uIGlkCiAgICBteSBAQWZmZWN0ZWRDb25kaXRpb25JRHM7CiAgICBDT05ESVRJT05JRDoKICAgIGZvciBteSAkQ29uZGl0aW9uSUQgKCBrZXlzICVDb25kaXRpb25FeHByZXNzaW9uICkgewoKICAgICAgICAjIGNoZWNrIGV4cHJlc3Npb24gZm9yIHRoaXMgd29ya29yZGVyCiAgICAgICAgRVhQUkVTU0lPTklEOgogICAgICAgIGZvciBteSAkRXhwcmVzc2lvbklEICggQHsgJENvbmRpdGlvbkV4cHJlc3Npb257JENvbmRpdGlvbklEfSB9ICkgewoKICAgICAgICAgICAgIyBnZXQgZXhwcmVzc2lvbgogICAgICAgICAgICBteSAkRXhwcmVzc2lvbiA9ICRTZWxmLT5FeHByZXNzaW9uR2V0KAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGV4cHJlc3Npb24KICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9OSUQgaWYgISRFeHByZXNzaW9uOwoKICAgICAgICAgICAgIyBjaGVjayBmb3Igc2VsZWN0b3IKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9OSUQgaWYgJEV4cHJlc3Npb24tPntTZWxlY3Rvcn0gbmUgJFBhcmFte1NlbGVjdG9yfTsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIG9iamVjdCB0eXBlCiAgICAgICAgICAgIG5leHQgRVhQUkVTU0lPTklEIGlmICRFeHByZXNzaW9uLT57T2JqZWN0SUR9IG5lICRPYmplY3RJRDsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGhpcyBjb25kaXRpb25zIGlzIGFscmVhZHkgb24gc3RhY2sKICAgICAgICAgICAgaWYgKCAhZ3JlcCB7ICRfIGVxICRDb25kaXRpb25JRCB9IEBBZmZlY3RlZENvbmRpdGlvbklEcyApIHsKCiAgICAgICAgICAgICAgICAjIHRoaXMgZXhwcmVzc2lvbiBpcyB2YWxpZAogICAgICAgICAgICAgICAgcHVzaCBAQWZmZWN0ZWRDb25kaXRpb25JRHMsICRDb25kaXRpb25JRDsKCiAgICAgICAgICAgICAgICAjIGp1bXAgdG8gbmV4dCBjb25kaXRpb24KICAgICAgICAgICAgICAgIG5leHQgQ09ORElUSU9OSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgQ09ORElUSU9OSUQ6CiAgICBmb3IgbXkgJENvbmRpdGlvbklEICgga2V5cyAlQ29uZGl0aW9uQWN0aW9uICkgewoKICAgICAgICAjIGNoZWNrIGFjdGlvbiBmb3IgdGhpcyB3b3Jrb3JkZXIKICAgICAgICBBQ1RJT05JRDoKICAgICAgICBmb3IgbXkgJEFjdGlvbklEICggQHsgJENvbmRpdGlvbkFjdGlvbnskQ29uZGl0aW9uSUR9IH0gKSB7CgogICAgICAgICAgICAjIGdldCBhY3Rpb24KICAgICAgICAgICAgbXkgJEFjdGlvbiA9ICRTZWxmLT5BY3Rpb25HZXQoCiAgICAgICAgICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZXhwcmVzc2lvbgogICAgICAgICAgICBuZXh0IEFDVElPTklEIGlmICEkQWN0aW9uOwoKICAgICAgICAgICAgIyBjaGVjayBmb3Igc2VsZWN0b3IKICAgICAgICAgICAgbmV4dCBBQ1RJT05JRCBpZiAkQWN0aW9uLT57U2VsZWN0b3J9IG5lICRQYXJhbXtTZWxlY3Rvcn07CgogICAgICAgICAgICAjIGNoZWNrIGZvciBvYmplY3QgdHlwZQogICAgICAgICAgICBuZXh0IEFDVElPTklEIGlmICRBY3Rpb24tPntPYmplY3RJRH0gbmUgJE9iamVjdElEOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGlzIGNvbmRpdGlvbnMgaXMgYWxyZWFkeSBvbiBzdGFjawogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJENvbmRpdGlvbklEIH0gQEFmZmVjdGVkQ29uZGl0aW9uSURzICkgewoKICAgICAgICAgICAgICAgICMgdGhpcyBleHByZXNzaW9uIGlzIHZhbGlkCiAgICAgICAgICAgICAgICBwdXNoIEBBZmZlY3RlZENvbmRpdGlvbklEcywgJENvbmRpdGlvbklEOwoKICAgICAgICAgICAgICAgICMganVtcCB0byBuZXh0IGNvbmRpdGlvbgogICAgICAgICAgICAgICAgbmV4dCBDT05ESVRJT05JRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBBZmZlY3RlZENvbmRpdGlvbklEczsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0NvbmRpdGlvbk1hdGNoKCkKClRoaXMgZnVuY3Rpb24gbWF0Y2hlcyB0aGUgZ2l2ZW4gY29uZGl0aW9uIGFuZCBleGVjdXRlcyAnbm8nIGFjdGlvbnMuClRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgJ0F0dHJpYnV0ZXNDaGFuZ2VkJyBkZWZpbmVzIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBjaGFuZ2VkCmR1cmluZyBlLmcuIGEgQ2hhbmdlVXBkYXRlLUV2ZW50LiBJZiBhIGNvbmRpdGlvbiBtYXRjaGVzIGFuIGV4cHJlc3Npb24sIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGV4cHJlc3Npb24KbXVzdCBiZSBsaXN0ZWQgaW4gJ0F0dHJpYnV0ZXNDaGFuZ2VkJy4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPl9Db25kaXRpb25NYXRjaCgKICAgICAgICBDb25kaXRpb25JRCAgICAgICA9PiAxMjMsCiAgICAgICAgQXR0cmlidXRlc0NoYW5nZWQgPT4geyBJVFNNQ2hhbmdlID0+IFsgQ2hhbmdlVGl0bGUsIENoYW5nZURlc2NyaXB0aW9uXSB9LCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0NvbmRpdGlvbk1hdGNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9uIGRhdGEKICAgIG15ICRDb25kaXRpb25EYXRhID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICByZXR1cm4gaWYgISRDb25kaXRpb25EYXRhOwoKICAgICMgZ2V0IGFsbCBleHByZXNzaW9ucyBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbiBpZAogICAgbXkgJEV4cHJlc3Npb25JRHNSZWYgPSAkU2VsZi0+RXhwcmVzc2lvbkxpc3QoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBlcnJvcnMKICAgIHJldHVybiBpZiAhJEV4cHJlc3Npb25JRHNSZWY7CiAgICByZXR1cm4gaWYgcmVmICRFeHByZXNzaW9uSURzUmVmIG5lICdBUlJBWSc7CgogICAgIyBubyBlcnJvciBpZiBqdXN0IG5vIGV4cHJlc3Npb25zIHdlcmUgZm91bmQKICAgIHJldHVybiAwIGlmICFAeyRFeHByZXNzaW9uSURzUmVmfTsKCiAgICAjIGNvdW50IHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbiBpZHMKICAgIG15ICRFeHByZXNzaW9uSURDb3VudCA9IHNjYWxhciBAeyRFeHByZXNzaW9uSURzUmVmfTsKCiAgICAjIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgcG9zaXRpdmUgKHRydWUpIGV4cHJlc3Npb25zCiAgICBteSBARXhwcmVzc2lvbk1hdGNoUmVzdWx0OwoKICAgICMgdG8gc3RvcmUgaWYgdGhlIGNvbmRpdGlvbiBtYXRjaGVzCiAgICBteSAkQ29uZGl0aW9uTWF0Y2g7CgogICAgIyB0cnkgdG8gbWF0Y2ggZWFjaCBleHByZXNzaW9uCiAgICBFWFBSRVNTSU9OSUQ6CiAgICBmb3IgbXkgJEV4cHJlc3Npb25JRCAoIEB7JEV4cHJlc3Npb25JRHNSZWZ9ICkgewoKICAgICAgICAjIG5vcm1hbGx5IGdpdmUgdGhlIGxpc3Qgb2YgY2hhbmdlZCBhdHRyaWJ1dGVzIHRvIEV4cHJlc3Npb25NYXRjaCgpIGZ1bmN0aW9uCiAgICAgICAgbXkgJEF0dHJpYnV0ZXNDaGFuZ2VkID0gJFBhcmFte0F0dHJpYnV0ZXNDaGFuZ2VkfTsKCiAgICAgICAgIyBleHByZXNzaW9uIGNvbmp1bmN0aW9uIGlzICdhbGwnIGFuZCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGV4cHJlc2lvbgogICAgICAgIGlmICggJENvbmRpdGlvbkRhdGEtPntFeHByZXNzaW9uQ29uanVuY3Rpb259IGVxICdhbGwnICYmICRFeHByZXNzaW9uSURDb3VudCA+IDEgKSB7CgogICAgICAgICAgICAjIGRvIG5vdCBnaXZlIHRoZSBsaXN0IG9mIGNoYW5nZWQgYXR0cmlidXRlcyB0byBFeHByZXNzaW9uTWF0Y2goKQogICAgICAgICAgICAkQXR0cmlidXRlc0NoYW5nZWQgPSB1bmRlZjsKICAgICAgICB9CgogICAgICAgICMgbWF0Y2ggZXhwcmVzc2lvbgogICAgICAgIG15ICRFeHByZXNzaW9uTWF0Y2ggPSAkU2VsZi0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgICAgICBFeHByZXNzaW9uSUQgICAgICA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICAgICBBdHRyaWJ1dGVzQ2hhbmdlZCA9PiAkQXR0cmlidXRlc0NoYW5nZWQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICkgfHwgMDsKCiAgICAgICAgIyBzZXQgQ29uZGl0aW9uTWF0Y2ggdHJ1ZSBpZiBFeHByZXNzaW9uTWF0Y2ggaXMgdHJ1ZSBhbmQgJ2FueScgaXMgcmVxdWVzdGVkCiAgICAgICAgaWYgKCAkQ29uZGl0aW9uRGF0YS0+e0V4cHJlc3Npb25Db25qdW5jdGlvbn0gZXEgJ2FueScgJiYgJEV4cHJlc3Npb25NYXRjaCApIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgICAgICAjIGNvbmRpdGlvbiBpcyBmYWxzZSBhdCBhbGwsIHNvIHJldHVybiB0cnVlCiAgICAgICAgaWYgKCAkQ29uZGl0aW9uRGF0YS0+e0V4cHJlc3Npb25Db25qdW5jdGlvbn0gZXEgJ2FsbCcgJiYgISRFeHByZXNzaW9uTWF0Y2ggKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIGN1cnJlbnQgZXhwcmVzc2lvbiBtYXRjaCByZXN1bHQgZm9yIGxhdGVyIGNoZWNrcwogICAgICAgIHB1c2ggQEV4cHJlc3Npb25NYXRjaFJlc3VsdCwgJEV4cHJlc3Npb25NYXRjaDsKICAgIH0KCiAgICAjIGNvdW50IGFsbCByZXN1bHRzIHdoaWNoIGhhdmUgYSB0cnVlIHZhbHVlCiAgICBteSAkVHJ1ZUNvdW50ID0gc2NhbGFyIGdyZXAgeyAkXyA9PSAxIH0gQEV4cHJlc3Npb25NYXRjaFJlc3VsdDsKCiAgICAjIGlmIHRoZSBjb25kaXRpb24gZGlkIG5vdCBtYXRjaCBhbHJlYWR5LCBhbmQgbm90IGFsbCBleHByZXNzaW9ucyBhcmUgdHJ1ZQogICAgaWYgKCAhJENvbmRpdGlvbk1hdGNoICYmICRUcnVlQ291bnQgIT0gJEV4cHJlc3Npb25JRENvdW50ICkgewoKICAgICAgICAjIG5vdCBhbGwgZXhwcmVzc2lvbnMgaGF2ZSBtYXRjaGVkCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Db25kaXRpb25MaXN0QnlPYmplY3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBhbGwgY29uZGl0aW9ucyBpZHMgb2YgYSBnaXZlbiBvYmplY3QuCgogICAgbXkgJENvbmRpdGlvbklEc1JlZiA9ICRDb25kaXRpb25PYmplY3QtPl9Db25kaXRpb25MaXN0QnlPYmplY3QoCiAgICAgICAgT2JqZWN0TmFtZSA9PiAnSVRTTUNoYW5nZScKICAgICAgICBTZWxlY3RvciAgID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9Db25kaXRpb25MaXN0QnlPYmplY3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0TmFtZSBTZWxlY3RvciBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZSBpZAogICAgbXkgJENoYW5nZUlEOwoKICAgIGlmICggJFBhcmFte09iamVjdE5hbWV9IGVxICdJVFNNQ2hhbmdlJyApIHsKCiAgICAgICAgIyBzZWxlY3RvciBpcyBuZWVkZWQgY2hhbmdlIGlkCiAgICAgICAgJENoYW5nZUlEID0gJFBhcmFte1NlbGVjdG9yfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte09iamVjdE5hbWV9IGVxICdJVFNNV29ya09yZGVyJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fT2JqZWN0TG9hZEJhY2tlbmQoCiAgICAgICAgICAgIFR5cGUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICAgICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAgICAgIyBkZWZpbmUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGJhY2tlbmQKICAgICAgICBteSAkU3ViID0gJ0RhdGFHZXQnOwoKICAgICAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgICAgICBpZiAoICEkQmFja2VuZE9iamVjdC0+Y2FuKCRTdWIpICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZnVuY3Rpb24gJyRTdWInIGF2YWlsYWJsZSBmb3IgYmFja2VuZCAnJFBhcmFte09iamVjdE5hbWV9JyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGV4ZWN1dGUgdGhlIHN1YnJvdXRpbmUKICAgICAgICBteSAkV29ya09yZGVyID0gJEJhY2tlbmRPYmplY3QtPiRTdWIoCiAgICAgICAgICAgIFNlbGVjdG9yID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICkgfHwge307CgogICAgICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGlkCiAgICAgICAgJENoYW5nZUlEID0gJFdvcmtPcmRlci0+WzBdLT57Q2hhbmdlSUR9OwogICAgfQoKICAgICMgY2hlY2sgY2hhbmdlIGlkCiAgICByZXR1cm4gaWYgISRDaGFuZ2VJRDsKCiAgICAjIGdldCBjb25kaXRpb25zIGZvciB0aGlzIGNoYW5nZQogICAgbXkgJENvbmRpdGlvbnMgPSAkU2VsZi0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQ29uZGl0aW9uczsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUxICQgJERhdGU6IDIwMTAvMDcvMDIgMjM6MDg6MzEgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9IaXN0b3J5LnBtIC0gYWxsIGNoYW5nZSBhbmQgd29ya29yZGVyIGhpc3RvcnkgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBIaXN0b3J5LnBtLHYgMS4yNyAyMDEwLzA2LzE1IDAxOjQ4OjUzIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnkgLSBhbGwgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgaGlzdG9yeSBmdW5jdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGhpc3RvcnkgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3Rvcnk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkSGlzdG9yeU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9IHx8PSAwOwoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBIaXN0b3J5QWRkKCkKCkFkZHMgYSBzaW5nbGUgaGlzdG9yeSBlbnRyeSB0byB0aGUgaGlzdG9yeS4gUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICRIaXN0b3J5T2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgIENoYW5nZUlEICAgICAgPT4gMTIzNCwgICAgICAgICAgICAjIGVpdGhlciBDaGFuZ2VJRCBvciBXb3JrT3JkZXJJRCBpcyBuZWVkZWQKICAgICAgICBXb3JrT3JkZXJJRCAgID0+IDEyMywgICAgICAgICAgICAgIyBlaXRoZXIgQ2hhbmdlSUQgb3IgV29ya09yZGVySUQgaXMgbmVlZGVkCiAgICAgICAgSGlzdG9yeVR5cGUgICA9PiAnV29ya09yZGVyQWRkJywgICMgZWl0aGVyIEhpc3RvcnlUeXBlIG9yIEhpc3RvcnlUeXBlSUQgaXMgbmVlZGVkCiAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiAxLCAgICAgICAgICAgICAgICMgZWl0aGVyIEhpc3RvcnlUeXBlIG9yIEhpc3RvcnlUeXBlSUQgaXMgbmVlZGVkCiAgICAgICAgRmllbGRuYW1lICAgICA9PiAnSnVzdGlmaWNhdGlvbicsICMgb3B0aW9uYWwKICAgICAgICBDb250ZW50TmV3ICAgID0+ICdBbnkgdXNlZnVsIGluZm9ybWF0aW9uJywgIyBvcHRpb25hbAogICAgICAgIENvbnRlbnRPbGQgICAgPT4gJ09sZCB2YWx1ZSBvZiBmaWVsZCcsICAgICAjIG9wdGlvbmFsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICMgQ2hhbmdlSUQgaXMgYWx3YXlzIG5lZWRlZCwgd29ya29yZGVyIGlkIGlzIG9ubHkgbmVlZGVkIGZvciB3b3Jrb3JkZXIgZXZlbnRzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIENoYW5nZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZWl0aGVyIEhpc3RvcnlUeXBlIG9yIEhpc3RvcnlUeXBlSUQgaXMgbmVlZGVkCiAgICBpZiAoICEoICRQYXJhbXtIaXN0b3J5VHlwZX0gfHwgJFBhcmFte0hpc3RvcnlUeXBlSUR9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEhpc3RvcnlUeXBlIG9yIEhpc3RvcnlUeXBlSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBoaXN0b3J5IHR5cGUgaWQgZnJvbSBoaXN0b3J5IHR5cGUgaWYgaGlzdG9yeSB0eXBlIGlzIGdpdmVuLgogICAgaWYgKCAkUGFyYW17SGlzdG9yeVR5cGV9ICkgewogICAgICAgIG15ICRJRCA9ICRTZWxmLT5IaXN0b3J5VHlwZUxvb2t1cCggSGlzdG9yeVR5cGUgPT4gJFBhcmFte0hpc3RvcnlUeXBlfSApOwoKICAgICAgICAjIG5vIHZhbGlkIGhpc3RvcnkgdHlwZSBnaXZlbgogICAgICAgIGlmICggISRJRCApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgaGlzdG9yeSB0eXBlICckUGFyYW17SGlzdG9yeVR5cGV9JyBnaXZlbiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17SGlzdG9yeVR5cGVJRH0gPSAkSUQ7CiAgICB9CgogICAgIyBpbnNlcnQgaGlzdG9yeSBlbnRyeQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2VfaGlzdG9yeSAoIGNoYW5nZV9pZCwgd29ya29yZGVyX2lkLCBjb250ZW50X25ldywgJwogICAgICAgICAgICAuICdjb250ZW50X29sZCwgY3JlYXRlX2J5LCBjcmVhdGVfdGltZSwgdHlwZV9pZCwgZmllbGRuYW1lICkgJwogICAgICAgICAgICAuICdWQUxVRVMgKCA/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgPyApJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgICAgIFwkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbnRlbnROZXd9LAogICAgICAgICAgICBcJFBhcmFte0NvbnRlbnRPbGR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SGlzdG9yeVR5cGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17RmllbGRuYW1lfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya09yZGVySGlzdG9yeUdldCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhbGwgaGlzdG9yeSBlbnRyaWVzIHRoYXQgYmVsb25nIHRvIHRoZSBnaXZlbiBXb3JrT3JkZXJJRC4gVGhlCmxpc3QgY29udGFpbnMgaGFzaCByZWZlcmVuY2VzIHdpdGggdGhlc2UgaW5mb3JtYXRpb246CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDaGFuZ2VJRH0KICAgICRJbmZve1dvcmtPcmRlcklEfQogICAgJEluZm97SGlzdG9yeVR5cGV9CiAgICAkSW5mb3tIaXN0b3J5VHlwZUlEfQogICAgJEluZm97RmllbGRuYW1lfQogICAgJEluZm97Q29udGVudE5ld30KICAgICRJbmZve0NvbnRlbnRPbGR9CiAgICAkSW5mb3tDcmVhdGVCeX0KICAgICRJbmZve0NyZWF0ZVRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQoKICAgIG15ICRIaXN0b3J5RW50cmllcyA9ICRIaXN0b3J5T2JqZWN0LT5Xb3JrT3JkZXJIaXN0b3J5R2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJIaXN0b3J5R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoV29ya09yZGVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcnVuIHRoZSBzcWwgc3RhdGVtZW50IHRvIGdldCBoaXN0b3J5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNoLmlkLCBjaGFuZ2VfaWQsIHdvcmtvcmRlcl9pZCwgY29udGVudF9uZXcsIGNvbnRlbnRfb2xkLCAnCiAgICAgICAgICAgIC4gJ2NoLmNyZWF0ZV9ieSwgY2guY3JlYXRlX3RpbWUsIHR5cGVfaWQsIGNodC5uYW1lLCBmaWVsZG5hbWUgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9oaXN0b3J5IGNoLCBjaGFuZ2VfaGlzdG9yeV90eXBlIGNodCAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoLnR5cGVfaWQgPSBjaHQuaWQgJwogICAgICAgICAgICAuICdBTkQgd29ya29yZGVyX2lkID0gPyBPUkRFUiBCWSBjaC5jcmVhdGVfdGltZSwgY2guaWQnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1dvcmtPcmRlcklEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSBlbnRyaWVzIGFuZCBzYXZlIGluZm9ybWF0aW9uIGluIGFycmF5CiAgICBteSBASGlzdG9yeUVudHJpZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVIaXN0b3J5RW50cnkgPSAoCiAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRSb3dbMF0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIENvbnRlbnROZXcgICAgID0+IGRlZmluZWQoICRSb3dbM10gKSA/ICRSb3dbM10gOiAnJywKICAgICAgICAgICAgQ29udGVudE9sZCAgICAgPT4gZGVmaW5lZCggJFJvd1s0XSApID8gJFJvd1s0XSA6ICcnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBIaXN0b3J5VHlwZUlEICA9PiAkUm93WzddLAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkUm93WzhdLAogICAgICAgICAgICBGaWVsZG5hbWUgICAgICA9PiAkUm93WzldLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQEhpc3RvcnlFbnRyaWVzLCBcJUhpc3RvcnlFbnRyeTsKICAgIH0KCiAgICAjIGdldCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzZXIgd2hvIGNyZWF0ZWQgZW50cnkKICAgIGZvciBteSAkSGlzdG9yeUVudHJ5IChASGlzdG9yeUVudHJpZXMpIHsKCiAgICAgICAgIyBnZXQgdXNlciBuYW1lCiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRIaXN0b3J5RW50cnktPntDcmVhdGVCeX0sCiAgICAgICAgICAgIENhY2hlICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSB1c2VyIGluZm8gaW4gaGlzdG9yeSBlbnRyeQogICAgICAgIGlmICglVXNlcikgewogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlcklEfSAgICAgICAgPSAkVXNlcntVc2VySUR9OwogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlckxvZ2lufSAgICAgPSAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlckZpcnN0bmFtZX0gPSAkVXNlcntVc2VyRmlyc3RuYW1lfTsKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e1VzZXJMYXN0bmFtZX0gID0gJFVzZXJ7VXNlckxhc3RuYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxASGlzdG9yeUVudHJpZXM7Cn0KCj1pdGVtIENoYW5nZUhpc3RvcnlHZXQoKQoKUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGhpc3RvcnkgZW50cmllcyB0aGF0IGJlbG9uZyB0byB0aGUgZ2l2ZW4gQ2hhbmdlSUQgLSBpbmNsdWRpbmcKaGlzdG9yeSBlbnRyaWVzIGZvciB3b3Jrb3JkZXJzLiBUaGUgbGlzdCBjb250YWlucyBoYXNoIHJlZmVyZW5jZXMgd2l0aCB0aGVzZSBpbmZvcm1hdGlvbjoKCiAgICAkSW5mb3tIaXN0b3J5RW50cnlJRH0KICAgICRJbmZve0NoYW5nZUlEfQogICAgJEluZm97V29ya09yZGVySUR9CiAgICAkSW5mb3tIaXN0b3J5VHlwZX0KICAgICRJbmZve0hpc3RvcnlUeXBlSUR9CiAgICAkSW5mb3tGaWVsZG5hbWV9CiAgICAkSW5mb3tDb250ZW50TmV3fQogICAgJEluZm97Q29udGVudE9sZH0KICAgICRJbmZve0NyZWF0ZUJ5fQogICAgJEluZm97Q3JlYXRlVGltZX0KICAgICRJbmZve1VzZXJJRH0KICAgICRJbmZve1VzZXJMb2dpbn0KICAgICRJbmZve1VzZXJMYXN0bmFtZX0KICAgICRJbmZve1VzZXJGaXJzdG5hbWV9CgogICAgbXkgJEhpc3RvcnlFbnRyaWVzID0gJEhpc3RvcnlPYmplY3QtPkNoYW5nZUhpc3RvcnlHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENoYW5nZUhpc3RvcnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gdGhlIHNxbCBzdGF0ZW1lbnQgdG8gZ2V0IGhpc3RvcnkKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgY2guaWQsIGNoYW5nZV9pZCwgd29ya29yZGVyX2lkLCBjb250ZW50X25ldywgY29udGVudF9vbGQsICcKICAgICAgICAgICAgLiAnY2guY3JlYXRlX2J5LCBjaC5jcmVhdGVfdGltZSwgdHlwZV9pZCwgY2h0Lm5hbWUsIGZpZWxkbmFtZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX2hpc3RvcnkgY2gsIGNoYW5nZV9oaXN0b3J5X3R5cGUgY2h0ICcKICAgICAgICAgICAgLiAnV0hFUkUgY2gudHlwZV9pZCA9IGNodC5pZCAnCiAgICAgICAgICAgIC4gJ0FORCBjaGFuZ2VfaWQgPSA/IE9SREVSIEJZIGNoLmNyZWF0ZV90aW1lLCBjaC5pZCcsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIGVudHJpZXMgYW5kIHNhdmUgaW5mb3JtYXRpb24gaW4gYXJyYXkKICAgIG15IEBIaXN0b3J5RW50cmllczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJUhpc3RvcnlFbnRyeSA9ICgKICAgICAgICAgICAgSGlzdG9yeUVudHJ5SUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgV29ya09yZGVySUQgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgQ29udGVudE5ldyAgICAgPT4gZGVmaW5lZCggJFJvd1szXSApID8gJFJvd1szXSA6ICcnLAogICAgICAgICAgICBDb250ZW50T2xkICAgICA9PiBkZWZpbmVkKCAkUm93WzRdICkgPyAkUm93WzRdIDogJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgID0+ICRSb3dbNl0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlSUQgID0+ICRSb3dbN10sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgIEZpZWxkbmFtZSAgICAgID0+ICRSb3dbOV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGVhbnVwIHRpbWUgc3RhbXBzIChzb21lIGRhdGFiYXNlcyBhcmUgdXNpbmcgZS4gZy4gMjAwOC0wMi0yNSAyMjowMzowMC4wMDAwMDApCiAgICAgICAgJEhpc3RvcnlFbnRyeXtDcmVhdGVUaW1lfQogICAgICAgICAgICA9fiBzeyBcQSAoIFxkXGRcZFxkIC0gXGRcZCAtIFxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgKSBcLiAuKz8gXHogfXskMX14bXM7CgogICAgICAgIHB1c2ggQEhpc3RvcnlFbnRyaWVzLCBcJUhpc3RvcnlFbnRyeTsKICAgIH0KCiAgICAjIGdldCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzZXIgd2hvIGNyZWF0ZWQgZW50cnkKICAgIGZvciBteSAkSGlzdG9yeUVudHJ5IChASGlzdG9yeUVudHJpZXMpIHsKCiAgICAgICAgIyBnZXQgdXNlciBuYW1lCiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRIaXN0b3J5RW50cnktPntDcmVhdGVCeX0sCiAgICAgICAgICAgIENhY2hlICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSB1c2VyIGluZm8gaW4gaGlzdG9yeSBlbnRyeQogICAgICAgIGlmICglVXNlcikgewogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlcklEfSAgICAgICAgPSAkVXNlcntVc2VySUR9OwogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlckxvZ2lufSAgICAgPSAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICAkSGlzdG9yeUVudHJ5LT57VXNlckZpcnN0bmFtZX0gPSAkVXNlcntVc2VyRmlyc3RuYW1lfTsKICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e1VzZXJMYXN0bmFtZX0gID0gJFVzZXJ7VXNlckxhc3RuYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxASGlzdG9yeUVudHJpZXM7Cn0KCj1pdGVtIEhpc3RvcnlFbnRyeUdldCgpCgpSZXR1cm5zIGEgc2luZ2xlIGhpc3RvcnkgZW50cnkuIFRoZSBoYXNoIHJlZmVyZW5jZSBoYXMgdGhlc2UgaW5mb3JtYXRpb246CgogICAgJEluZm97SGlzdG9yeUVudHJ5SUR9CiAgICAkSW5mb3tDaGFuZ2VJRH0KICAgICRJbmZve1dvcmtPcmRlcklEfQogICAgJEluZm97SGlzdG9yeVR5cGV9CiAgICAkSW5mb3tIaXN0b3J5VHlwZUlEfQogICAgJEluZm97RmllbGRuYW1lfQogICAgJEluZm97Q29udGVudE5ld30KICAgICRJbmZve0NvbnRlbnRPbGR9CiAgICAkSW5mb3tDcmVhdGVCeX0KICAgICRJbmZve0NyZWF0ZVRpbWV9CiAgICAkSW5mb3tVc2VySUR9CiAgICAkSW5mb3tVc2VyTG9naW59CiAgICAkSW5mb3tVc2VyTGFzdG5hbWV9CiAgICAkSW5mb3tVc2VyRmlyc3RuYW1lfQoKICAgIG15ICRIaXN0b3J5RW50cnkgPSAkSGlzdG9yeU9iamVjdC0+SGlzdG9yeUVudHJ5R2V0KAogICAgICAgIEhpc3RvcnlFbnRyeUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5RW50cnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhIaXN0b3J5RW50cnlJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gdGhlIHNxbCBzdGF0ZW1lbnQgdG8gZ2V0IGhpc3RvcnkKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgY2guaWQsIGNoYW5nZV9pZCwgd29ya29yZGVyX2lkLCBjb250ZW50X25ldywgY29udGVudF9vbGQsICcKICAgICAgICAgICAgLiAnY2guY3JlYXRlX2J5LCBjaC5jcmVhdGVfdGltZSwgdHlwZV9pZCwgY2h0Lm5hbWUsIGZpZWxkbmFtZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX2hpc3RvcnkgY2gsIGNoYW5nZV9oaXN0b3J5X3R5cGUgY2h0ICcKICAgICAgICAgICAgLiAnV0hFUkUgY2gudHlwZV9pZCA9IGNodC5pZCAnCiAgICAgICAgICAgIC4gJ0FORCBjaC5pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0hpc3RvcnlFbnRyeUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSBlbnRyaWVzIGFuZCBzYXZlIGluZm9ybWF0aW9uIGluIGFycmF5CiAgICBteSAlSGlzdG9yeUVudHJ5OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAlSGlzdG9yeUVudHJ5ID0gKAogICAgICAgICAgICBIaXN0b3J5RW50cnlJRCA9PiAkUm93WzBdLAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBDb250ZW50TmV3ICAgICA9PiAkUm93WzNdLAogICAgICAgICAgICBDb250ZW50T2xkICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBIaXN0b3J5VHlwZUlEICA9PiAkUm93WzddLAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkUm93WzhdLAogICAgICAgICAgICBGaWVsZG5hbWUgICAgICA9PiAkUm93WzldLAogICAgICAgICk7CgogICAgICAgICMgY2xlYW51cCB0aW1lIHN0YW1wcyAoc29tZSBkYXRhYmFzZXMgYXJlIHVzaW5nIGUuIGcuIDIwMDgtMDItMjUgMjI6MDM6MDAuMDAwMDAwKQogICAgICAgICRIaXN0b3J5RW50cnl7Q3JlYXRlVGltZX0KICAgICAgICAgICAgPX4gc3sgXEEgKCBcZFxkXGRcZCAtIFxkXGQgLSBcZFxkIFxzIFxkXGQ6XGRcZDpcZFxkICkgXC4gLis/IFx6IH17JDF9eG1zOwogICAgfQoKICAgICMgZ2V0IHVzZXIgbmFtZQogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEhpc3RvcnlFbnRyeXtDcmVhdGVCeX0sCiAgICAgICAgQ2FjaGUgID0+IDEsCiAgICApOwoKICAgICMgc2F2ZSB1c2VyIGluZm8gaW4gaGlzdG9yeSBlbnRyeQogICAgaWYgKCVVc2VyKSB7CiAgICAgICAgJEhpc3RvcnlFbnRyeXtVc2VySUR9ICAgICAgICA9ICRVc2Vye1VzZXJJRH07CiAgICAgICAgJEhpc3RvcnlFbnRyeXtVc2VyTG9naW59ICAgICA9ICRVc2Vye1VzZXJMb2dpbn07CiAgICAgICAgJEhpc3RvcnlFbnRyeXtVc2VyRmlyc3RuYW1lfSA9ICRVc2Vye1VzZXJGaXJzdG5hbWV9OwogICAgICAgICRIaXN0b3J5RW50cnl7VXNlckxhc3RuYW1lfSAgPSAkVXNlcntVc2VyTGFzdG5hbWV9OwogICAgfQoKICAgIHJldHVybiBcJUhpc3RvcnlFbnRyeTsKfQoKPWl0ZW0gV29ya09yZGVySGlzdG9yeURlbGV0ZSgpCgpEZWxldGVzIGFsbCBlbnRyaWVzIGluIGhpc3RvcnkgdGFibGUgdGhhdCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBXb3JrT3JkZXJJRC4KVGhlIG1ldGhvZCByZXR1cm5zIDEgb24gc3VjY2VzcyBhbmQgQzx1bmRlZj4gb3RoZXJ3aXNlLgoKICAgIG15ICRTdWNjZXNzID0gJEhpc3RvcnlPYmplY3QtPldvcmtPcmRlckhpc3RvcnlEZWxldGUoCiAgICAgICAgV29ya09yZGVySUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlckhpc3RvcnlEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgZW50cmllcyBmb3IgdGhlIGdpdmVuIHdvcmtvcmRlcgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX2hpc3RvcnkgV0hFUkUgd29ya29yZGVyX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17V29ya09yZGVySUR9IF0sCiAgICApOwoKICAgICMgc3VjY2VzcwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENoYW5nZUhpc3RvcnlEZWxldGUoKQoKRGVsZXRlcyBhbGwgZW50cmllcyBpbiBoaXN0b3J5IHRhYmxlIHRoYXQgYmVsb25ncyB0byB0aGUgZ2l2ZW4gQ2hhbmdlSUQuClRoZSBtZXRob2QgcmV0dXJucyAxIG9uIHN1Y2Nlc3MgYW5kIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICRIaXN0b3J5T2JqZWN0LT5DaGFuZ2VIaXN0b3J5RGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDaGFuZ2VIaXN0b3J5RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGVudHJpZXMgZm9yIHRoZSBnaXZlbiBjaGFuZ2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV9oaXN0b3J5IFdIRVJFIGNoYW5nZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgKTsKCiAgICAjIHN1Y2Nlc3MKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBIaXN0b3J5VXBkYXRlKCkKClRoaXMgbWV0aG9kIHVwZGF0ZXMgYSBoaXN0b3J5IGVudHJ5LiBJdCByZXR1cm5zIDEgb24gc3VjY2VzcywgYW5kIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICRIaXN0b3J5T2JqZWN0LT5IaXN0b3J5VXBkYXRlKAogICAgICAgIEhpc3RvcnlFbnRyeUlEID0+IDEyMywKICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiAzNDUxLCAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAxMjM1LCAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBDb250ZW50TmV3ICAgICA9PiAnbmV3IHZhbHVlJywgICMgb3B0aW9uYWwKICAgICAgICBDb250ZW50T2xkICAgICA9PiAnb2xkIHZhbHVlJywgICMgb3B0aW9uYWwKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoSGlzdG9yeUVudHJ5SUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGhpc3RvcnkgZW50cnkgaWQgYW5kIHVzZXIgaWQKICAgIG15ICRIaXN0b3J5RW50cnlJRCA9IGRlbGV0ZSAkUGFyYW17SGlzdG9yeUVudHJ5SUR9OwogICAgbXkgJFVzZXJJRCAgICAgICAgID0gZGVsZXRlICRQYXJhbXtVc2VySUR9OwoKICAgICMgd2UgaGF2ZSB0byB1cGRhdGUgYXQgbGVhc3Qgb25lIGNvbHVtbgogICAgaWYgKCAha2V5cyAlUGFyYW0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGF0IGxlYXN0IG9uZSBjb2x1bW4gdG8gdXBkYXRlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB3aGF0IGNvbHVtbnMgc2hvdWxkIGJlIHVwZGF0ZWQKICAgIG15IEBDb2x1bW5zID0ga2V5cyAlUGFyYW07CiAgICBteSBAQmluZDsKCiAgICAjIGdldCBiaW5kIHZhcmlhYmxlcwogICAgZm9yIG15ICRDb2x1bW4gKEBDb2x1bW5zKSB7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXskQ29sdW1ufTsKICAgIH0KCiAgICAjIGdldCBiaW5kIHN0cmluZwogICAgbXkgJVBhcmFtS2V5MkNvbHVtbk5hbWUgPSAoCiAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAnY2hhbmdlX2lkJywKICAgICAgICBXb3JrT3JkZXJJRCAgID0+ICd3b3Jrb3JkZXJfaWQnLAogICAgICAgIENvbnRlbnROZXcgICAgPT4gJ2NvbnRlbnRfbmV3JywKICAgICAgICBDb250ZW50T2xkICAgID0+ICdjb250ZW50X29sZCcsCiAgICAgICAgSGlzdG9yeVR5cGVJRCA9PiAndHlwZV9pZCcsCiAgICAgICAgRmllbGRuYW1lICAgICA9PiAnZmllbGRuYW1lJywKICAgICk7CiAgICBteSAkQmluZHMgPSBqb2luICcsICcsIG1hcCB7ICRQYXJhbUtleTJDb2x1bW5OYW1leyRffSAuICcgPSA/ICcgfSBAQ29sdW1uczsKCiAgICAjIGRvIHRoZSB1cGRhdGUKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGNoYW5nZV9oaXN0b3J5IFNFVCAnIC4gJEJpbmRzIC4gJyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIEBCaW5kLCBcJEhpc3RvcnlFbnRyeUlEIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBIaXN0b3J5U2VhcmNoKCkKClNlYXJjaGVzIGZvciBjaGFuZ2VzL3dvcmtvcmRlcnMgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzZWFyY2ggY3JpdGVyaWEuIEl0IHJldHVybnMKYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggY2hhbmdlIG9yIHdvcmtvcmRlciBJRHMuIElmICJSZXN1bHQgPT4gJ0NPVU5UJyIgdGhlbiB0aGUKbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMgaXMgcmV0dXJuZWQuCgogICAgbXkgJElEcyA9ICRIaXN0b3J5T2JqZWN0LT5IaXN0b3J5U2VhcmNoKAogICAgICAgIFR5cGUgICAgICAgICAgICAgICAgPT4gJ0NoYW5nZScsICAgICAgICMgQ2hhbmdlfFdvcmtvcmRlciB3aGljaCBJRHMgc2hvdWxkIGJlIHJldHVybmVkCiAgICAgICAgQXR0cmlidXRlICAgICAgICAgICA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgIE9sZFZhbHVlcyAgICAgICAgICAgPT4gWyAncmVqZWN0ZWQnIF0sICMgb3B0aW9uYWwgLSBPbGRWYWx1ZXMgT1IgTmV3VmFsdWVzIGlzIG5lZWRlZAogICAgICAgIE5ld1ZhbHVlcyAgICAgICAgICAgPT4gWyAnYXBwcm92ZWQnIF0sICMgb3B0aW9uYWwgLSBPbGRWYWx1ZXMgT1IgTmV3VmFsdWVzIGlzIG5lZWRlZAogICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgPT4gWyAxLCAyLCAzIF0sICAgICMgb3B0aW9uYWwKICAgICAgICBDaGFuZ2VEYXRlTmV3ZXJEYXRlID0+ICcyMDA5LTAxLTEzIDAwOjAwOjAxJywgI29wdGlvbmFsCiAgICAgICAgQ2hhbmdlRGF0ZU9sZGVyRGF0ZSA9PiAnMjAwOS0wMS0xMyAwMDowMDowMScsICNvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2luZ1dpbGRjYXJkcyAgICAgID0+IDAsICAgICAgICAgICAgICAjIDB8MSAtIGRlZmF1bHQgMQogICAgICAgIFJlc3VsdCAgICAgICAgICAgICAgPT4gJ0FSUkFZJywgICAgICAgICMgQVJSQVl8Q09VTlQgLSBkZWZhdWx0IEFSUkFZCiAgICApOwoKPWN1dAoKc3ViIEhpc3RvcnlTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhUeXBlIEF0dHJpYnV0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB2ZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZgogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50ICgKICAgICAgICBxdygKICAgICAgICBPbGRWYWx1ZXMKICAgICAgICBOZXdWYWx1ZXMKICAgICAgICBDaGFuZ2VCeQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICBteSBAU1FMV2hlcmU7ICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCgogICAgIyBhZGQgc3RyaW5nIHBhcmFtcyB0byB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSAlU3RyaW5nUGFyYW1zID0gKAoKICAgICAgICAjIHN0cmluZ3MgaW4gY2hhbmdlX2hpc3RvcnkKICAgICAgICBBdHRyaWJ1dGUgPT4gJ2NoLmZpZWxkbmFtZScsCiAgICApOwoKICAgICMgYWRkIHN0cmluZyBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBTVFJJTkdQQVJBTToKICAgIGZvciBteSAkU3RyaW5nUGFyYW0gKCBrZXlzICVTdHJpbmdQYXJhbXMgKSB7CgogICAgICAgICMgY2hlY2sgc3RyaW5nIHBhcmFtcyBmb3IgdXNlZnVsIHZhbHVlcywgdGhlIHN0cmluZyAnMCcgaXMgYWxsb3dlZAogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWV4aXN0cyAkUGFyYW17JFN0cmluZ1BhcmFtfTsKICAgICAgICBuZXh0IFNUUklOR1BBUkFNIGlmICFkZWZpbmVkICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgJFBhcmFteyRTdHJpbmdQYXJhbX0gZXEgJyc7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRTdHJpbmdQYXJhbX0gKTsKCiAgICAgICAgIyB3aWxkY2FyZHMgYXJlIHVzZWQKICAgICAgICBpZiAoICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gKSB7CgogICAgICAgICAgICAjIFF1b3RlCiAgICAgICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFN0cmluZ1BhcmFtfSwgJ0xpa2UnICk7CgogICAgICAgICAgICAjIHJlcGxhY2UgKiB3aXRoICUKICAgICAgICAgICAgJFBhcmFteyRTdHJpbmdQYXJhbX0gPX4gc3sgXCorIH17JX14bXNnOwoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIHN0cmluZyBwYXJhbXMgd2hpY2ggY29udGFpbiBvbmx5ICUKICAgICAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAkUGFyYW17JFN0cmluZ1BhcmFtfSA9fiBteyBcQSAlKiBceiB9eG1zOwoKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICAgICAiTE9XRVIoJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19KSBMSUtFIExPV0VSKCckUGFyYW17JFN0cmluZ1BhcmFtfScpIjsKICAgICAgICB9CgogICAgICAgICMgbm8gd2lsZGNhcmRzIGFyZSB1c2VkCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgIkxPV0VSKCRTdHJpbmdQYXJhbXN7JFN0cmluZ1BhcmFtfSkgPSBMT1dFUignJFBhcmFteyRTdHJpbmdQYXJhbX0nKSI7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGFycmF5IHBhcmFtcwogICAgbXkgJUFycmF5UGFyYW1zID0gKAogICAgICAgIE9sZFZhbHVlcyA9PiAnY2guY29udGVudF9vbGQnLAogICAgICAgIE5ld1ZhbHVlcyA9PiAnY2guY29udGVudF9uZXcnLAogICAgICAgIENoYW5nZUJ5ICA9PiAnY2guY3JlYXRlX2J5JywKICAgICk7CgogICAgIyBhZGQgYXJyYXkgcGFyYW1zIHRvIHNxbC13aGVyZS1hcnJheQogICAgQVJSQVlQQVJBTToKICAgIGZvciBteSAkQXJyYXlQYXJhbSAoIGtleXMgJUFycmF5UGFyYW1zICkgewoKICAgICAgICAjIGlnbm9yZSBlbXB0eSBsaXN0cwogICAgICAgIG5leHQgQVJSQVlQQVJBTSBpZiAhQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICAjIHF1b3RlCiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfSApIHsKICAgICAgICAgICAgJE9uZVBhcmFtID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRPbmVQYXJhbSk7CgogICAgICAgICAgICAjIGZvciBzdHJpbmdzIHdlIG5lZWQgc2luZ2xlIHF1b3RlcwogICAgICAgICAgICBpZiAoICRPbmVQYXJhbSAhfiBteyBcQSBbKy1dPyBcZCsgKD86XC5cZCspPyBceiB9eG1zICkgewogICAgICAgICAgICAgICAgJE9uZVBhcmFtID0gIickT25lUGFyYW0nIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiAnLCAnLCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJEFycmF5UGFyYW1zeyRBcnJheVBhcmFtfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBzZXQgdGltZSBwYXJhbXMKICAgIG15ICVUaW1lUGFyYW1zID0gKAoKICAgICAgICAjIHRpbWVzIGluIGNoYW5nZV9oaXN0b3J5CiAgICAgICAgQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAnY2guY3JlYXRlX3RpbWUgPj0nLAogICAgICAgIENoYW5nZVRpbWVPbGRlckRhdGUgPT4gJ2NoLmNyZWF0ZV90aW1lIDw9JywKICAgICk7CgogICAgIyBjaGVjayBhbmQgYWRkIHRpbWUgcGFyYW1zIHRvIFdIRVJFCiAgICBUSU1FUEFSQU06CiAgICBmb3IgbXkgJFRpbWVQYXJhbSAoIGtleXMgJVRpbWVQYXJhbXMgKSB7CgogICAgICAgIG5leHQgVElNRVBBUkFNIGlmICEkUGFyYW17JFRpbWVQYXJhbX07CgogICAgICAgIGlmICggJFBhcmFteyRUaW1lUGFyYW19ICF+IG17IFxBIFxkXGRcZFxkLVxkXGQtXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCBceiB9eG1zICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAkVGltZVBhcmFtIGhhcyBhbiBpbnZhbGlkIGRhdGUgZm9ybWF0ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17JFRpbWVQYXJhbX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskVGltZVBhcmFtfSApOwoKICAgICAgICAjIHRoZSB0aW1lIGF0dHJpYnV0ZXMgb2YgY2hhbmdlX2hpc3Rvcnkgc2hvdyB1cCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkVGltZVBhcmFtc3skVGltZVBhcmFtfSAnJFBhcmFteyRUaW1lUGFyYW19JyI7CiAgICB9CgogICAgIyBjcmVhdGUgU1FMIHN0YXRlbWVudAogICAgbXkgJFR5cGUgPSBsYyAkUGFyYW17VHlwZX07CiAgICBteSAkU1FMICA9ICJTRUxFQ1QgRElTVElOQ1QgY2guJHtUeXBlfV9pZCBGUk9NIGNoYW5nZV9oaXN0b3J5IGNoICI7CgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoIERJU1RJTkNUKCBjaC4ke1R5cGV9X2lkICkgKSBGUk9NIGNoYW5nZV9oaXN0b3J5IGNoICI7CiAgICB9CgogICAgIyBhZGQgdGhlIFdIRVJFIGNsYXVzZQogICAgaWYgKEBTUUxXaGVyZSkgewogICAgICAgICRTUUwgLj0gJ1dIRVJFICc7CiAgICAgICAgJFNRTCAuPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICcgJzsKICAgIH0KCiAgICAjIGlnbm9yZSB0aGUgcGFyYW1ldGVyICdMaW1pdCcgd2hlbiByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKICAgICAgICBkZWxldGUgJFBhcmFte0xpbWl0fTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBASURzLCAkUm93WzBdOwogICAgfQoKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICAjIHJldHVybiB0aGUgQ09VTlQoYy5pZCkgYXR0cmlidXRlCiAgICAgICAgcmV0dXJuICRJRHNbMF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gXEBJRHM7CiAgICB9Cn0KCj1pdGVtIEhpc3RvcnlUeXBlTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgaGlzdG9yeSB0eXBlLiBJZiBhIGhpc3RvcnkgdHlwZSBpZCBpcyBnaXZlbiwKaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgaGlzdG9yeSB0eXBlLiBJZiBhIGhpc3RvcnkgdHlwZSBpcyBnaXZlbiwgdGhlIGFwcHJvcHJpYXRlCmlkIGlzIHJldHVybmVkLgoKICAgIG15ICROYW1lID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlSUQgPT4gMTIzNCwKICAgICk7CgogICAgbXkgJElEID0gJEhpc3RvcnlPYmplY3QtPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlID0+ICdXb3JrT3JkZXJBZGQnLAogICAgKTsKCj1jdXQKCnN1YiBIaXN0b3J5VHlwZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0hpc3RvcnlUeXBlSUR9ICYmICEkUGFyYW17SGlzdG9yeVR5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBIaXN0b3J5VHlwZUlEIG9yIEhpc3RvcnlUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBib3RoIHZhbGlkIGtleXMgYXJlIGdpdmVuLCByZXR1cm4KICAgIGlmICggJFBhcmFte0hpc3RvcnlUeXBlSUR9ICYmICRQYXJhbXtIaXN0b3J5VHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBIaXN0b3J5VHlwZUlEIE9SIEhpc3RvcnlUeXBlIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgb3V0IHdoYXQgdGhlIHVzZWQga2V5IGlzCiAgICBteSAkS2V5ID0gJ0hpc3RvcnlUeXBlJzsKCiAgICBpZiAoICRQYXJhbXtIaXN0b3J5VHlwZUlEfSApIHsKICAgICAgICAkS2V5ID0gJ0hpc3RvcnlUeXBlSUQnOwogICAgfQoKICAgICMgaWYgcmVzdWx0IGlzIGNhY2hlZCByZXR1cm4gdGhhdCByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0hpc3RvcnlUeXBlTG9va3VwfS0+eyAkUGFyYW17JEtleX0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SGlzdG9yeVR5cGVMb29rdXB9LT57ICRQYXJhbXskS2V5fSB9OwoKICAgICMgc2V0IHRoZSBhcHByb3ByaWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gJ1NFTEVDVCBuYW1lIEZST00gY2hhbmdlX2hpc3RvcnlfdHlwZSBXSEVSRSBpZCA9ID8nOwoKICAgIGlmICggJEtleSBlcSAnSGlzdG9yeVR5cGUnICkgewogICAgICAgICRTUUwgPSAnU0VMRUNUIGlkIEZST00gY2hhbmdlX2hpc3RvcnlfdHlwZSBXSEVSRSBuYW1lID0gPyc7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVxdWVzdGVkIHZhbHVlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFteyRLZXl9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFZhbHVlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVmFsdWUgPSAkUm93WzBdOwogICAgfQoKICAgICMgc2F2ZSB2YWx1ZSBpbiBjYWNoZQogICAgJFNlbGYtPntDYWNoZX0tPntIaXN0b3J5VHlwZUxvb2t1cH0tPnsgJFBhcmFteyRLZXl9IH0gPSAkVmFsdWU7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gSGlzdG9yeVR5cGVMaXN0KCkKCnJldHVybnMgYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggaGFzaHJlZmVyZW5jZXMuIFRoZSBrZXkgb2YgdGhlIGhhc2hyZWZlcmVuY2UgaXMgdGhlIGlkCm9mIGFuIHJlY2lwaWVudCBhbmQgdGhlIG5hbWUgaXMgdGhlIHZhbHVlLgoKPWN1dAoKc3ViIEhpc3RvcnlUeXBlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcHJlcGFyZSBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSBGUk9NIGNoYW5nZV9oaXN0b3J5X3R5cGUgT1JERVIgQlkgbmFtZScsCiAgICApOwoKICAgICMgcmV0cmlldmUgZGF0YQogICAgbXkgQEhpc3RvcnlUeXBlczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJEVudHJ5ID0gewogICAgICAgICAgICBLZXkgICA9PiAkUm93WzBdLAogICAgICAgICAgICBWYWx1ZSA9PiAkUm93WzFdLAogICAgICAgIH07CiAgICAgICAgcHVzaCBASGlzdG9yeVR5cGVzLCAkRW50cnk7CiAgICB9CgogICAgcmV0dXJuIFxASGlzdG9yeVR5cGVzOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yNyAkICREYXRlOiAyMDEwLzA2LzE1IDAxOjQ4OjUzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNU3RhdGVNYWNoaW5lLnBtIC0gYWxsIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNU3RhdGVNYWNoaW5lLnBtLHYgMS4xMSAyMDEwLzAxLzMwIDIwOjQ1OjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lIC0gc3RhdGVtYWNoaW5lIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIGZvciBzdGF0ZW1hY2hpbmUgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRTdGF0ZU1hY2hpbmVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN0YXRlVHJhbnNpdGlvbkFkZCgpCgpBZGQgYSBuZXcgc3RhdGUgdHJhbnNpdGlvbi4gUmV0dXJucyB0aGUgdHJhbnNpdGlvbiBpZCBvbiBzdWNjZXNzLgoKICAgIG15ICRUcmFuc2l0aW9uSUQgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgU3RhdGVJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkIHdpdGhpbiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IHN0YXRlCiAgICAgICAgTmV4dFN0YXRlSUQgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkIHdpdGhpbiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIDAgdG8gaW5kaWNhdGUgYW4gZW5kIHN0YXRlCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLCAjIHRoZSBuYW1lIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlVHJhbnNpdGlvbkFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgU3RhdGVJRCBhbmQgTmV4dFN0YXRlSUQgYXJlIGdpdmVuICh0aGV5IGNhbiBiZSAwKQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU3RhdGVJRCBOZXh0U3RhdGVJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgY2xhc3MgaXMgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFN0YXRlSUQgYW5kIE5leHRTdGF0ZUlEIGFyZSB6ZXJvCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRH0gJiYgISRQYXJhbXtOZXh0U3RhdGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGF0ZUlEIGFuZCBOZXh0U3RhdGVJRCBjYW4ndCBib3RoIGJlIHplcm8hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlZmluZSBsb29rdXAgaGFzaCBmb3Igc3RhdGUgbmFtZQogICAgbXkgJVN0YXRlSUQyU3RhdGU7CgogICAgIyBjaGVjayBpZiBTdGF0ZUlEIGFuZCBOZXh0U3RhdGVJRCBiZWxvbmcgdG8gdGhlIGdpdmVuIGNsYXNzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFN0YXRlSUQgTmV4dFN0YXRlSUQpKSB7CgogICAgICAgICRTdGF0ZUlEMlN0YXRleyAkUGFyYW17JEFyZ3VtZW50fSB9ID0gJFNlbGYtPlN0YXRlTG9va3VwKAogICAgICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBDbGFzcyAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgKTsKCiAgICAgICAgIyBkb250IGNoZWNrIHplcm8gdmFsdWVzCiAgICAgICAgbmV4dCBBUkdVTUVOVCBpZiAhJFBhcmFteyRBcmd1bWVudH07CgogICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgbXkgJERhdGFSZWYgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaWQgYmVsb25ncyB0byBnaXZlbiBjbGFzcwogICAgICAgIGlmICggISREYXRhUmVmIHx8ICEleyREYXRhUmVmfSB8fCAkRGF0YVJlZi0+e0NsYXNzfSBuZSAkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50ICRQYXJhbXskQXJndW1lbnR9IGlzIG5vdCBpbiB0aGUgY2xhc3MgJFBhcmFte0NsYXNzfSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYSBzdGF0ZSB0cmFuc2l0aW9uIHdpdGggdGhlIFN0YXRlSUQgYW5kIE5leHRTdGF0ZUlEIGV4aXN0cyBhbHJlYWR5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgJwogICAgICAgICAgICAuICdXSEVSRSBzdGF0ZV9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgbmV4dF9zdGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte05leHRTdGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFRyYW5zaXRpb25JRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRyYW5zaXRpb25JRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBkbyBub3QgaW5zZXJ0IHRoaXMgdHJhbnNpdGlvbiB0d2ljZQogICAgcmV0dXJuICRUcmFuc2l0aW9uSUQgaWYgJFRyYW5zaXRpb25JRDsKCiAgICAjIGNoZWNrIGlmIFN0YXRlSUQgaXMgYSBzdGFydCBzdGF0ZSAoPTApIGFuZCBhbm90aGVyIHN0YXJ0IHN0YXRlIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRH0gKSB7CgogICAgICAgICMgY291bnQgdGhlIG51bWJlciBvZiBleHN0aW5nIHN0YXJ0IHN0YXRlcyBpbiB0aGUgZ2l2ZW4gY2xhc3MKICAgICAgICAjICggdGhlIHN0YXRlX2lkIDAgaW5kaWNhdGVzIHRoYXQgdGhlIG5leHRfc3RhdGVfaWQgaXMgYSBzdGFydCBzdGF0ZSApCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgY291bnQocy5pZCkgJwogICAgICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSBzLCBnZW5lcmFsX2NhdGFsb2cgZyAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBnLmdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJwogICAgICAgICAgICAgICAgLiAnQU5EIHMubmV4dF9zdGF0ZV9pZCA9IGcuaWQgJwogICAgICAgICAgICAgICAgLiAnQU5EIHMuc3RhdGVfaWQgPSAwJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRDb3VudDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ291bnQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgc3RhcnQgc3RhdGUKICAgICAgICBpZiAoJENvdW50KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gbm90IGFkZCBzdGF0ZSAnJFN0YXRlSUQyU3RhdGV7JFBhcmFte05leHRTdGF0ZUlEfX0nICIKICAgICAgICAgICAgICAgICAgICAuICIoSUQ6ICRQYXJhbXtOZXh0U3RhdGVJRH0pIGFzIHN0YXJ0IHN0YXRlLiAiCiAgICAgICAgICAgICAgICAgICAgLiAiVGhlcmUgaXMgYWxyZWFkeSBhIHN0YXJ0IHN0YXRlIGRlZmluZWQgZm9yIGNsYXNzICckUGFyYW17Q2xhc3N9JyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJldmVudCBzZXR0aW5nIGFuIGVuZCBzdGF0ZSB0cmFuc2l0aW9uLCBpZiBvdGhlciBzdGF0ZSB0cmFuc2lzdGlvbnMgZXhpc3QgYWxyZWFkeQogICAgaWYgKCAkUGFyYW17U3RhdGVJRH0gJiYgISRQYXJhbXtOZXh0U3RhdGVJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgb3RoZXIgc3RhdGUgdHJhbnNpc3Rpb25zIGV4aXN0IGZvciB0aGUgZ2l2ZW4gU3RhdGVJRAogICAgICAgIG15ICROZXh0U3RhdGVJRHMgPSAkU2VsZi0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+ICRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICA9PiAkUGFyYW17Q2xhc3N9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgYW55IG5leHQgc3RhdGVzIGFyZSBkZWZpbmVkIGZvciB0aGlzIHN0YXJ0IHN0YXRlCiAgICAgICAgaWYgKCAkTmV4dFN0YXRlSURzICYmIEB7JE5leHRTdGF0ZUlEc30gJiYgc2NhbGFyIEB7JE5leHRTdGF0ZUlEc30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gbm90IHNldCBzdGF0ZSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJyRTdGF0ZUlEMlN0YXRleyRQYXJhbXtTdGF0ZUlEfX0nIChJRDogJFBhcmFte1N0YXRlSUR9KSBhcyBlbmQgc3RhdGUsICIKICAgICAgICAgICAgICAgICAgICAuICJiZWNhdXNlIG90aGVyIGZvbGxvd2luZyBzdGF0ZXMgZXhpc3QsIHdoaWNoIG11c3QgYmUgZGVsZXRlZCBmaXJzdCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIyBwcmV2ZW50IHRoZSBhZGRpbmcgb2Ygb3RoZXIgbmV4dCBzdGF0ZXMgaWYgYW4gZW5kIHN0YXRlIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhpcyBzdGFydCBzdGF0ZQogICAgZWxzaWYgKCAkUGFyYW17U3RhdGVJRH0gJiYgJFBhcmFte05leHRTdGF0ZUlEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBvdGhlciBzdGF0ZSB0cmFuc2lzdGlvbnMgZXhpc3QgZm9yIHRoZSBnaXZlbiBTdGF0ZUlECiAgICAgICAgbXkgJE5leHRTdGF0ZUlEcyA9ICRTZWxmLT5TdGF0ZVRyYW5zaXRpb25HZXQoCiAgICAgICAgICAgIFN0YXRlSUQgPT4gJFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICBDbGFzcyAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbiBlbmQgc3RhdGUgKD0wKSBkZWZpbmVkIGZvciB0aGlzIHN0YXJ0IHN0YXRlCiAgICAgICAgaWYgKCAkTmV4dFN0YXRlSURzICYmIEB7JE5leHRTdGF0ZUlEc30gJiYgISROZXh0U3RhdGVJRHMtPlswXSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXRlICckU3RhdGVJRDJTdGF0ZXskUGFyYW17U3RhdGVJRH19JyAiCiAgICAgICAgICAgICAgICAgICAgLiAiKElEOiAkUGFyYW17U3RhdGVJRH0pIGlzIGRlZmluZWQgYXMgYW4gZW5kIHN0YXRlLCAiCiAgICAgICAgICAgICAgICAgICAgLiAiaXQgbXVzdCBiZSBkZWxldGVkIGZpcnN0LCBiZWZvcmUgbmV3IGZvbGxvd2luZyBzdGF0ZXMgY2FuIGJlIGFkZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgc3RhdGUgdHJhbnNpdGlvbiB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2Vfc3RhdGVfbWFjaGluZSAnCiAgICAgICAgICAgIC4gJyhzdGF0ZV9pZCwgbmV4dF9zdGF0ZV9pZCkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTdGF0ZUlEfSwgXCRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgVHJhbnNpdGlvbklECiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgJwogICAgICAgICAgICAuICdXSEVSRSBzdGF0ZV9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgbmV4dF9zdGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte05leHRTdGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVHJhbnNpdGlvbklEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHN0YXRlIHRyYW5zaXRpb24gY291bGQgYmUgYWRkZWQKICAgIGlmICggISRUcmFuc2l0aW9uSUQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGF0ZVRyYW5zaXRpb25BZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFRyYW5zaXRpb25JRDsKfQoKPWl0ZW0gU3RhdGVUcmFuc2l0aW9uRGVsZXRlKCkKCkRlbGV0ZSBhIHN0YXRlIHRyYW5zaXRpb24uIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoKICAgIG15ICRTdWNjZXNzID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uRGVsZXRlKAogICAgICAgIFN0YXRlSUQgICAgID0+IDEsICAjIGlkIHdpdGhpbiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IHN0YXRlCiAgICAgICAgTmV4dFN0YXRlSUQgPT4gMiwgICMgaWQgd2l0aGluIHRoZSBnaXZlbiBjbGFzcywgb3IgMCB0byBpbmRpY2F0ZSBhbiBlbmQgc3RhdGUKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdGVUcmFuc2l0aW9uRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBTdGF0ZUlEIGFuZCBOZXh0U3RhdGVJRCBhcmUgZ2l2ZW4gKHRoZXkgY2FuIGJlIDApCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTdGF0ZUlEIE5leHRTdGF0ZUlEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIHN0YXRlIHRyYW5zaXRpb24gZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIHN0YXRlX2lkID0gPyBBTkQgbmV4dF9zdGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte1N0YXRlSUR9LCBcJFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gU3RhdGVUcmFuc2l0aW9uRGVsZXRlQWxsKCkKCkRlbGV0ZSBhbGwgc3RhdGUgdHJhbnNpdGlvbnMgb2YgYSBjbGFzcy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCgogICAgbXkgJFN1Y2Nlc3MgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZVRyYW5zaXRpb25EZWxldGVBbGwoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLCAjIHRoZSBuYW1lIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlVHJhbnNpdGlvbkRlbGV0ZUFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcgogICAgaWYgKCAkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZmluZCBhbGwgc3RhdGUgaWRzIGFuZCBuZXh0X3N0YXRlIGlkcyB3aGljaCBiZWxvbmcgdG8gdGhlIGdpdmVuIGNsYXNzCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkICcKICAgICAgICAgICAgLiAnRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc30gXSwKICAgICk7CgogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBASURzLCAkUm93WzBdOwogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIHN0YXRlIHRyYW5zaXRpb25zIGV4aXN0IGZvciB0aGUgZ2l2ZW4gY2xhc3MKICAgIHJldHVybiAxIGlmICFASURzOwoKICAgICMgYnVpbGQgaWQgc3RyaW5nCiAgICBteSAkSURTdHJpbmcgPSBqb2luICcsICcsIEBJRHM7CgogICAgIyBkZWxldGUgc3RhdGUgdHJhbnNpdGlvbiBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGNoYW5nZV9zdGF0ZV9tYWNoaW5lICIKICAgICAgICAgICAgLiAiV0hFUkUgc3RhdGVfaWQgSU4gKCAkSURTdHJpbmcgKSAiCiAgICAgICAgICAgIC4gIk9SIG5leHRfc3RhdGVfaWQgSU4gKCAkSURTdHJpbmcgKSIsCiAgICApOwoKICAgIHJldHVybiAxOwoKfQoKPWl0ZW0gU3RhdGVUcmFuc2l0aW9uR2V0KCkKCkdldCBhIHN0YXRlIHRyYW5zaXRpb24gZm9yIGEgZ2l2ZW4gc3RhdGUgaWQuClJldHVybnMgYW4gYXJyYXkgcmVmZXJlbmNlIG9mIHRoZSBuZXh0IHN0YXRlIGlkcy4KCiAgICBteSAkTmV4dFN0YXRlSURzUmVmID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgIFN0YXRlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkIHdpdGhpbiB0aGUgZ2l2ZW4gY2xhc3MsIG9yIDAgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IHN0YXRlCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsICMgdGhlIG5hbWUgb2YgYSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdGVUcmFuc2l0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBTdGF0ZUlEIGFyZSBnaXZlbiAodGhleSBjYW4gYmUgMCkKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFN0YXRlSUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGF0IGNsYXNzIGlzIGdpdmVuCiAgICBpZiAoICEkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgU3RhdGVJRCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBjbGFzcywgYnV0IG9ubHkgaWYgc3RhdGUgaWQgaXMgbm90IGEgc3RhcnQgc3RhdGUgKD0wKQogICAgaWYgKCAkUGFyYW17U3RhdGVJRH0gKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIG9mIGdpdmVuIFN0YXRlSUQKICAgICAgICBteSAkRGF0YVJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte1N0YXRlSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgU3RhdGVJRCBiZWxvbmdzIHRvIGdpdmVuIGNsYXNzCiAgICAgICAgaWYgKCAhJERhdGFSZWYgfHwgISV7JERhdGFSZWZ9IHx8ICREYXRhUmVmLT57Q2xhc3N9IG5lICRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGF0ZUlEICRQYXJhbXtTdGF0ZUlEfSBpcyBub3QgaW4gdGhlIGNsYXNzICckUGFyYW17Q2xhc3N9JyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZmluZCBhbGwgc3RhdGUgaWRzIGFuZCBuZXh0X3N0YXRlIGlkcyB3aGljaCBiZWxvbmcgdG8gdGhlIGdpdmVuIGNsYXNzCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUIHMubmV4dF9zdGF0ZV9pZCAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgcyAnCiAgICAgICAgICAgIC4gJ0xFRlQgT1VURVIgSk9JTiBnZW5lcmFsX2NhdGFsb2cgZyAnCiAgICAgICAgICAgIC4gJ09OICggKHMuc3RhdGVfaWQgPSBnLmlkICkgT1IgKHMubmV4dF9zdGF0ZV9pZCA9IGcuaWQpICkgJwogICAgICAgICAgICAuICdXSEVSRSBzLnN0YXRlX2lkID0gPyBBTkQgZy5nZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtTdGF0ZUlEfSwgXCRQYXJhbXtDbGFzc30gXSwKICAgICk7CgogICAgbXkgQE5leHRTdGF0ZUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATmV4dFN0YXRlSURzLCAkUm93WzBdOwogICAgfQoKICAgICMgaWYgdGhlIHN0YXJ0IHN0YXRlIHdhcyByZXF1ZXN0ZWQgYW5kIG1vcmUgdGhhbiBvbmUgc3RhcnQgc3RhdGUgd2FzIGZvdW5kCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRH0gKSB7CgogICAgICAgIGlmICggIUBOZXh0U3RhdGVJRHMgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gbm90IGdldCBpbml0aWFsIHN0YXRlIGZvciAnJFBhcmFte0NsYXNzfScgIgogICAgICAgICAgICAgICAgICAgIC4gIk5vIGluaXRpYWwgc3RhdGUgd2FzIGZvdW5kISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCBzY2FsYXIgQE5leHRTdGF0ZUlEcyA+IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gbm90IGdldCBpbml0aWFsIHN0YXRlIGZvciAnJFBhcmFte0NsYXNzfScgIgogICAgICAgICAgICAgICAgICAgIC4gIk1vcmUgdGhhbiBvbmUgaW5pdGlhbCBzdGF0ZSB3YXMgZm91bmQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBOZXh0U3RhdGVJRHM7Cn0KCj1pdGVtIFN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcygpCgpHZXQgYSBzdGF0ZSB0cmFuc2l0aW9uIGZvciBhIGdpdmVuIHN0YXRlIGlkLCBidXQgb25seSBzaG93IHRoZSBwb3NzaWJsZSBuZXh0IGVuZCBzdGF0ZXMuClJldHVybnMgYW4gYXJyYXkgcmVmZXJlbmNlIG9mIHRoZSBuZXh0IGVuZCBzdGF0ZSBpZHMuCgogICAgbXkgJE5leHRTdGF0ZUlEc1JlZiA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcygKICAgICAgICBTdGF0ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZCB3aXRoaW4gdGhlIGdpdmVuIGNsYXNzLCBvciAwIHRvIGluZGljYXRlIHRoZSBzdGFydCBzdGF0ZQogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLCAjIHRoZSBuYW1lIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgU3RhdGVJRCBhcmUgZ2l2ZW4gKHRoZXkgY2FuIGJlIDApCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTdGF0ZUlEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBjbGFzcyBpcyBnaXZlbgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIFN0YXRlSUQgYmVsb25ncyB0byB0aGUgZ2l2ZW4gY2xhc3MsIGJ1dCBvbmx5IGlmIHN0YXRlIGlkIGlzIG5vdCBhIHN0YXJ0IHN0YXRlICg9MCkKICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBvZiBnaXZlbiBTdGF0ZUlECiAgICAgICAgbXkgJERhdGFSZWYgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIFN0YXRlSUQgYmVsb25ncyB0byBnaXZlbiBjbGFzcwogICAgICAgIGlmICggISREYXRhUmVmIHx8ICEleyREYXRhUmVmfSB8fCAkRGF0YVJlZi0+e0NsYXNzfSBuZSAkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhdGVJRCAkUGFyYW17U3RhdGVJRH0gaXMgbm90IGluIHRoZSBjbGFzcyAnJFBhcmFte0NsYXNzfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZpbmQgYWxsIHN0YXRlIGlkcyBhbmQgbmV4dF9zdGF0ZSBpZHMgd2hpY2ggYmVsb25nIHRvIHRoZSBnaXZlbiBjbGFzcwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBzLm5leHRfc3RhdGVfaWQgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9zdGF0ZV9tYWNoaW5lIHMgJwogICAgICAgICAgICAuICdMRUZUIE9VVEVSIEpPSU4gZ2VuZXJhbF9jYXRhbG9nIGcgJwogICAgICAgICAgICAuICdPTiAoIChzLnN0YXRlX2lkID0gZy5pZCApIE9SIChzLm5leHRfc3RhdGVfaWQgPSBnLmlkKSApICcKICAgICAgICAgICAgLiAnV0hFUkUgcy5zdGF0ZV9pZCA9ID8gQU5EIGcuZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U3RhdGVJRH0sIFwkUGFyYW17Q2xhc3N9IF0sCiAgICApOwoKICAgIG15IEBOZXh0U3RhdGVJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQE5leHRTdGF0ZUlEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIGlmIHRoZSBzdGFydCBzdGF0ZSB3YXMgcmVxdWVzdGVkIGFuZCBtb3JlIHRoYW4gb25lIHN0YXJ0IHN0YXRlIHdhcyBmb3VuZAogICAgaWYgKCAhJFBhcmFte1N0YXRlSUR9ICkgewoKICAgICAgICBpZiAoICFATmV4dFN0YXRlSURzICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBnZXQgaW5pdGlhbCBzdGF0ZSBmb3IgJyRQYXJhbXtDbGFzc30nICIKICAgICAgICAgICAgICAgICAgICAuICJObyBpbml0aWFsIHN0YXRlIHdhcyBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICggc2NhbGFyIEBOZXh0U3RhdGVJRHMgPiAxICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBnZXQgaW5pdGlhbCBzdGF0ZSBmb3IgJyRQYXJhbXtDbGFzc30nICIKICAgICAgICAgICAgICAgICAgICAuICJNb3JlIHRoYW4gb25lIGluaXRpYWwgc3RhdGUgd2FzIGZvdW5kISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBuZXh0IHN0YXRlIGlkcyBzdHJpbmcKICAgIG15ICROZXh0U3RhdGVJRHNTdHJpbmcgPSBqb2luICcsICcsIEBOZXh0U3RhdGVJRHM7CgogICAgIyBmaW5kIGFsbCBuZXh0IHN0YXRlIGlkcyB3aGljaCBhcmUgZW5kIHN0YXRlcwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBzLnN0YXRlX2lkICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSBzICcKICAgICAgICAgICAgLiAiV0hFUkUgcy5zdGF0ZV9pZCBJTiAoICROZXh0U3RhdGVJRHNTdHJpbmcgKSAiCiAgICAgICAgICAgIC4gJ0FORCBzLm5leHRfc3RhdGVfaWQgPSAwJywKICAgICk7CgogICAgbXkgQE5leHRFbmRTdGF0ZUlEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATmV4dEVuZFN0YXRlSURzLCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQE5leHRFbmRTdGF0ZUlEczsKfQoKPWl0ZW0gU3RhdGVUcmFuc2l0aW9uTGlzdCgpCgpSZXR1cm4gYSBzdGF0ZSB0cmFuc2l0aW9uIGxpc3QgaGFzaC1hcnJheSByZWZlcmVuY2UuClRoZSBoYXNoIGtleSBpcyB0aGUgU3RhdGVJRCwgdGhlIGhhc2ggdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIG9mIE5leHRTdGF0ZUlEcy4KCiAgICBteSAkU3RhdGVUcmFuc2l0aW9uc1JlZiA9ICRTdGF0ZU1hY2hpbmVPYmplY3QtPlN0YXRlVHJhbnNpdGlvbkxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLCAjIHRoZSBuYW1lIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICApOwoKUmV0dXJuIGV4YW1wbGU6CgogICAgJFN0YXRlVHJhbnNpdGlvbnNSZWYgPSB7CiAgICAgICAgMCA9PiBbIDEgXSwKICAgICAgICAxID0+IFsgMiwgMywgNCBdLAogICAgICAgIDIgPT4gWyA1IF0sCiAgICAgICAgMyA9PiBbIDYsIDcgXSwKICAgICAgICA0ID0+IFsgMCBdLAogICAgICAgIDUgPT4gWyAwIF0sCiAgICAgICAgNiA9PiBbIDAgXSwKICAgICAgICA3ID0+IFsgMCBdLAogICAgfTsKCj1jdXQKCnN1YiBTdGF0ZVRyYW5zaXRpb25MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc3RhdGUgdHJhbnNpdGlvbnMKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1Qgcy5pZCAsIHMuc3RhdGVfaWQgLCBzLm5leHRfc3RhdGVfaWQgLCBnLmdlbmVyYWxfY2F0YWxvZ19jbGFzcyAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3N0YXRlX21hY2hpbmUgcyAnCiAgICAgICAgICAgIC4gJ0xFRlQgT1VURVIgSk9JTiBnZW5lcmFsX2NhdGFsb2cgZyAnCiAgICAgICAgICAgIC4gJ09OICggKHMuc3RhdGVfaWQgPSBnLmlkICkgT1IgKHMubmV4dF9zdGF0ZV9pZCA9IGcuaWQpICkgJwogICAgICAgICAgICAuICdXSEVSRSBnLmdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzfSBdLAogICAgKTsKCiAgICBteSAlU3RhdGVUcmFuc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEB7ICRTdGF0ZVRyYW5zaXRpb257ICRSb3dbMV0gfSB9LCAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiBcJVN0YXRlVHJhbnNpdGlvbjsKfQoKPWl0ZW0gU3RhdGVUcmFuc2l0aW9uVXBkYXRlKCkKClVwZGF0ZSB0aGUgbmV4dCBzdGF0ZSBvZiBhbiBleGlzdGluZyBuZXcgc3RhdGUgdHJhbnNpdGlvbi4KUmV0dXJucyB0aGUgdHJhbnNpdGlvbiBpZCBvbiBzdWNjZXNzLgoKICAgIG15ICRVcGRhdGVTdWNjZXNzID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVUcmFuc2l0aW9uVXBkYXRlKAogICAgICAgIFN0YXRlSUQgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZCB3aXRoaW4gdGhlIGdpdmVuIGNsYXNzLCBvciAwIHRvIGluZGljYXRlIHRoZSBzdGFydCBzdGF0ZQogICAgICAgIE5leHRTdGF0ZUlEICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZCB3aXRoaW4gdGhlIGdpdmVuIGNsYXNzLCBvciAwIHRvIGluZGljYXRlIGFuIGVuZCBzdGF0ZQogICAgICAgIE5ld05leHRTdGF0ZUlEID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZCB3aXRoaW4gdGhlIGdpdmVuIGNsYXNzLCBvciAwIHRvIGluZGljYXRlIGFuIGVuZCBzdGF0ZQogICAgICAgIENsYXNzICAgICAgICAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywgIyB0aGUgbmFtZSBvZiBhIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwogICAgKTsKCj1jdXQKCnN1YiBTdGF0ZVRyYW5zaXRpb25VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGlmIFN0YXRlSUQsIE5leHRTdGF0ZUlEIGFuZCBOZXdOZXh0U3RhdGVJRCBhcmUgZ2l2ZW4gKHRoZXkgY2FuIGJlIDApCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTdGF0ZUlEIE5leHRTdGF0ZUlEIE5ld05leHRTdGF0ZUlEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBjbGFzcyBpcyBnaXZlbgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHRoYXQgbm90IGJvdGggU3RhdGVJRCBhbmQgTmV4dFN0YXRlSUQgYXJlIHplcm8KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEfSAmJiAhJFBhcmFte05leHRTdGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXRlSUQgYW5kIE5leHRTdGF0ZUlEIGNhbid0IGJvdGggYmUgemVybyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBTdGF0ZUlEIGFuZCBOZXdOZXh0U3RhdGVJRCBhcmUgemVybwogICAgaWYgKCAhJFBhcmFte1N0YXRlSUR9ICYmICEkUGFyYW17TmV3TmV4dFN0YXRlSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhdGVJRCBhbmQgTmV3TmV4dFN0YXRlSUQgY2FuJ3QgYm90aCBiZSB6ZXJvISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgbG9va3VwIGhhc2ggZm9yIHN0YXRlIG5hbWUKICAgIG15ICVTdGF0ZUlEMlN0YXRlOwoKICAgICMgY2hlY2sgaWYgU3RhdGVJRCwgTmV4dFN0YXRlSUQgYW5kIE5ld05leHRTdGF0ZUlEIGJlbG9uZyB0byB0aGUgZ2l2ZW4gY2xhc3MKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU3RhdGVJRCBOZXh0U3RhdGVJRCBOZXdOZXh0U3RhdGVJRCkpIHsKCiAgICAgICAgJFN0YXRlSUQyU3RhdGV7ICRQYXJhbXskQXJndW1lbnR9IH0gPSAkU2VsZi0+U3RhdGVMb29rdXAoCiAgICAgICAgICAgIFN0YXRlSUQgPT4gJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICApOwoKICAgICAgICAjIGRvbnQgY2hlY2sgemVybyB2YWx1ZXMKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICEkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgIyBnZXQgY2xhc3MKICAgICAgICBteSAkRGF0YVJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBpZCBiZWxvbmdzIHRvIGdpdmVuIGNsYXNzCiAgICAgICAgaWYgKCAhJERhdGFSZWYgfHwgISV7JERhdGFSZWZ9IHx8ICREYXRhUmVmLT57Q2xhc3N9IG5lICRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQgJFBhcmFteyRBcmd1bWVudH0gaXMgbm90IGluIHRoZSBjbGFzcyAnJFBhcmFte0NsYXNzfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB1cGRhdGUgaWYgdGhlIG5ldyBuZXh0IHN0YXRlIGlzIHRoZSBzYW1lCiAgICByZXR1cm4gMSBpZiAkUGFyYW17TmV4dFN0YXRlSUR9ID09ICRQYXJhbXtOZXdOZXh0U3RhdGVJRH07CgogICAgIyBnZXQgdGhlIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gaWQgdGhhdCBzaG91bGQgYmUgdXBkYXRlZAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBzLmlkICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2Vfc3RhdGVfbWFjaGluZSBzICcKICAgICAgICAgICAgLiAnTEVGVCBPVVRFUiBKT0lOIGdlbmVyYWxfY2F0YWxvZyBnICcKICAgICAgICAgICAgLiAnT04gKCAocy5zdGF0ZV9pZCA9IGcuaWQgKSBPUiAocy5uZXh0X3N0YXRlX2lkID0gZy5pZCkgKSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIHMuc3RhdGVfaWQgPSA/IEFORCBzLm5leHRfc3RhdGVfaWQgPSA/ICcKICAgICAgICAgICAgLiAnQU5EIGcuZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U3RhdGVJRH0sIFwkUGFyYW17TmV4dFN0YXRlSUR9LCBcJFBhcmFte0NsYXNzfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRUcmFuc2l0aW9uSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUcmFuc2l0aW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2hlY2sgdGhhdCB0aGUgc3RhdGUgdHJhbnNpdGlvbiB0aGF0IHNob3VsZCBiZSB1cGRhdGVkIGV4aXN0cwogICAgaWYgKCAhJFRyYW5zaXRpb25JRCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3QgdXBkYXRlIHN0YXRlIHRyYW5zaXRpb24hIEEgc3RhdGUgdHJhbnNpdGlvbiB3aXRoICIKICAgICAgICAgICAgICAgIC4gIlN0YXRlSUQgJFBhcmFte1N0YXRlSUR9IGFuZCBOZXh0U3RhdGVJRCAkUGFyYW17TmV4dFN0YXRlSUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmV2ZW50IHNldHRpbmcgYW4gZW5kIHN0YXRlIHRyYW5zaXRpb24sIGlmIG90aGVyIHN0YXRlIHRyYW5zaXN0aW9ucyBleGlzdCBhbHJlYWR5CiAgICBpZiAoICEkUGFyYW17TmV3TmV4dFN0YXRlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG90aGVyIHN0YXRlIHRyYW5zaXN0aW9ucyBleGlzdCBmb3IgdGhlIGdpdmVuIFN0YXRlSUQKICAgICAgICBteSAkTmV4dFN0YXRlSURzID0gJFNlbGYtPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgU3RhdGVJRCA9PiAkUGFyYW17U3RhdGVJRH0sCiAgICAgICAgICAgIENsYXNzICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICApOwoKICAgICAgICAjIFRoZSBvbGQgc3RhdGUgdHJhbnNpdGlvbiwgd2hpY2ggaXMgdmVyaWZpZWQgdG8gZXhpc3QsIGRvZXMgbm90IGNvdW50IGluIHRoaXMgY2hlY2sKICAgICAgICBpZiAoICROZXh0U3RhdGVJRHMgJiYgc2NhbGFyIEB7JE5leHRTdGF0ZUlEc30gPiAxICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3Qgc2V0IHN0YXRlICIKICAgICAgICAgICAgICAgICAgICAuICInJFN0YXRlSUQyU3RhdGV7JFBhcmFte1N0YXRlSUR9fScgKElEOiAkUGFyYW17U3RhdGVJRH0pIGFzIGVuZCBzdGF0ZSwgIgogICAgICAgICAgICAgICAgICAgIC4gImJlY2F1c2Ugb3RoZXIgZm9sbG93aW5nIHN0YXRlcyBleGlzdCwgd2hpY2ggbXVzdCBiZSBkZWxldGVkIGZpcnN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB1cGRhdGUgc3RhdGUgdHJhbnNpdGlvbgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgY2hhbmdlX3N0YXRlX21hY2hpbmUgJwogICAgICAgICAgICAuICdTRVQgbmV4dF9zdGF0ZV9pZCA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte05ld05leHRTdGF0ZUlEfSwgXCRUcmFuc2l0aW9uSUQgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFN0YXRlTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgc3RhdGUuIElmIGEgc3RhdGUgaWQgaXMgZ2l2ZW4sCml0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN0YXRlLiBJZiBhIHN0YXRlIG5hbWUgaXMgZ2l2ZW4sCnRoZSBhcHByb3ByaWF0ZSBpZCBpcyByZXR1cm5lZC4KCiAgICBteSAkU3RhdGUgPSAkU3RhdGVNYWNoaW5lT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICBTdGF0ZUlEID0+IDEyMzQsCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwoKICAgIG15ICRTdGF0ZUlEID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMb29rdXAoCiAgICAgICAgU3RhdGUgICA9PiAnYWNjZXB0ZWQnLAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgQ2xhc3MgcGFyYW1ldGVyCiAgICBpZiAoICEkUGFyYW17Q2xhc3N9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgVGhlIFN0YXRlSUQgJzAnIGlzIGEgc3BlY2lhbCBjYXNlLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXQKICAgICMgY2FuIGluZGljYXRlICcqU1RBUlQqJyBvciAnKkVORConLiBTbyByZXR1cm4gJzAnIGluIHRoYXQgY2FzZSwKICAgICMgYW5kIGRvIG5vdCBmbG9vZCB0aGUgZXJyb3IgbG9nLgogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFBhcmFte1N0YXRlSUR9CiAgICAgICAgJiYgJFBhcmFte1N0YXRlSUR9IGVxICcwJwogICAgICAgICYmICFkZWZpbmVkICRQYXJhbXtTdGF0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICcwJzsKICAgIH0KCiAgICAjIFRoZSBTdGF0ZSAnMCcgaXMgYSBzcGVjaWFsIGNhc2UuIERlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdAogICAgIyBjYW4gaW5kaWNhdGUgJypTVEFSVConIG9yICcqRU5EKicuIFNvIHJldHVybiAnMCcgaW4gdGhhdCBjYXNlLAogICAgIyBhbmQgZG8gbm90IGZsb29kIHRoZSBlcnJvciBsb2cuCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkUGFyYW17U3RhdGV9CiAgICAgICAgJiYgJFBhcmFte1N0YXRlfSBlcSAnMCcKICAgICAgICAmJiAhZGVmaW5lZCAkUGFyYW17U3RhdGVJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICcwJzsKICAgIH0KCiAgICAjIGVpdGhlciBTdGF0ZUlEIG9yIFN0YXRlIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRH0gJiYgISRQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFN0YXRlSUQgb3IgU3RhdGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG9ubHkgb25lIHBhcmFtZXRlciBTdGF0ZSBvciBTdGF0ZUlEIGlzIGFsbG93ZWQKICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICYmICRQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFN0YXRlSUQgT1IgU3RhdGUgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBjaGFuZ2Ugc3RhdGVzIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwogICAgbXkgJVN0YXRlSUQyTmFtZSA9ICV7CiAgICAgICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkUGFyYW17Q2xhc3N9LAogICAgICAgICAgICApCiAgICAgICAgfTsKCiAgICAjIGNoZWNrIHRoZSBzdGF0ZSBoYXNoCiAgICBpZiAoICElU3RhdGVJRDJOYW1lICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IHJldHJpZXZlIGNoYW5nZSBzdGF0ZXMgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICByZXR1cm4gJFN0YXRlSUQyTmFtZXsgJFBhcmFte1N0YXRlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXZlcnNlIGtleSAtIHZhbHVlIHBhaXJzIHRvIGhhdmUgdGhlIG5hbWUgYXMga2V5cwogICAgICAgIG15ICVTdGF0ZU5hbWUySUQgPSByZXZlcnNlICVTdGF0ZUlEMk5hbWU7CgogICAgICAgIHJldHVybiAkU3RhdGVOYW1lMklEeyAkUGFyYW17U3RhdGV9IH07CiAgICB9Cn0KCj1pdGVtIFN0YXRlTGlzdCgpCgpUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBzdGF0ZXMgZm9yIGEgY2F0YWxvZyBjbGFzcy4KCiAgICBteSAkU3RhdGVMaXN0ID0gJFN0YXRlTWFjaGluZU9iamVjdC0+U3RhdGVMaXN0KAogICAgICAgIENsYXNzICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBoYXNocmVmcy4gVGhlIGVsZW1lbnQgJ0tleScgaXMgdGhlbgp0aGUgc3RhdGUgaWQgYW5kIHRoZSBlbGVtZW50ICdWYWx1ZScgaXMgdGhlIG5hbWUgb2YgdGhlIHN0YXRlLiBUaGUgYXJyYXkgZWxlbWVudHMKYXJlIHNvcnRlZCBieSBzdGF0ZSBpZC4KCiAgICBteSAkU3RhdGVMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gMTU2LAogICAgICAgICAgICBWYWx1ZSA9PiAnYXBwcm92ZWQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxNTcsCiAgICAgICAgICAgIFZhbHVlID0+ICdpbiBwcm9ncmVzcycsCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3RhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDbGFzcyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hhbmdlIHN0YXRlIGxpc3QKICAgIG15ICRTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICkgfHwge307CgogICAgIyB0byBzdG9yZSBhbiBhcnJheSBvZiBoYXNoIHJlZnMKICAgIG15IEBBcnJheUhhc2hSZWY7CgogICAgIyBhc3NlbWJsZSB0aGUgYXJyYXkgb2YgaGFzaCByZWZzIHdpdGggYWxsIHN0YXRlcwogICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICV7JFN0YXRlTGlzdH0gKSB7CiAgICAgICAgcHVzaCBAQXJyYXlIYXNoUmVmLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRTdGF0ZUlELAogICAgICAgICAgICBWYWx1ZSA9PiAkU3RhdGVMaXN0LT57JFN0YXRlSUR9LAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwp9CgoxOwoKPWJlZ2luIEludGVybmFsOgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMSAkICREYXRlOiAyMDEwLzAxLzMwIDIwOjQ1OjE3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyLnBtIC0gYWxsIHdvcmtvcmRlciBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Xb3JrT3JkZXIucG0sdiAxLjExNCAyMDEwLzA3LzAzIDAwOjM2OjM5IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHM7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGU7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTE0ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlciAtIHdvcmtvcmRlciBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3Igd29ya29yZGVycyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIHNldCB0aGUgZGVidWcgZmxhZwogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpDYWNoZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZpcnR1YWxGUy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgZ2V0IHRoZSBjYWNoZSBUVEwgKGluIHNlY29uZHMpCiAgICAkU2VsZi0+e0NhY2hlVFRMfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpDYWNoZVRUTCcpICogNjA7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyAgICAgPT4gJ0lUU01Xb3JrT3JkZXI6OkV2ZW50TW9kdWxlJywKICAgICAgICBCYXNlT2JqZWN0ID0+ICdXb3JrT3JkZXJPYmplY3QnLAogICAgICAgIE9iamVjdHMgICAgPT4gewogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFdvcmtPcmRlckFkZCgpCgpBZGQgYSBuZXcgd29ya29yZGVyLgpJbnRlcm5hbGx5IGZpcnN0IGEgbWluaW1hbCB3b3Jrb3JkZXIgaXMgY3JlYXRlZCwKdGhlbiBXb3JrT3JkZXJVcGRhdGUoKSBpcyBjYWxsZWQgZm9yIHNldHRpbmcgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuCgogICAgbXkgJFdvcmtPcmRlcklEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCm9yCgogICAgbXkgJFdvcmtPcmRlcklEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQWRkKAogICAgICAgIENoYW5nZUlEICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgV29ya09yZGVyVGl0bGUgICAgID0+ICdSZXBsYWNlbWVudCBvZiBtYWlsIHNlcnZlcicsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbnN0cnVjdGlvbiAgICAgICAgPT4gJ0luc3RhbGwgdGhlIHRoZSBuZXcgc2VydmVyJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFJlcG9ydCAgICAgICAgICAgICA9PiAnSW5zdGFsbGVkIG5ldyBzZXJ2ZXIgd2l0aG91dCBwcm9ibGVtcycsICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyU3RhdGVJRCAgID0+IDE1NywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyU3RhdGUgPT4gJ3JlYWR5JwogICAgICAgIFdvcmtPcmRlclN0YXRlICAgICA9PiAncmVhZHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIFdvcmtPcmRlclN0YXRlSUQgPT4gMTU3CiAgICAgICAgV29ya09yZGVyVHlwZUlEICAgID0+IDE2MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyVHlwZSA9PiAncGlyJwogICAgICAgIFdvcmtPcmRlclR5cGUgICAgICA9PiAncmVhZHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG9yIFdvcmtPcmRlclR5cGVJRCA9PiAxNjEKICAgICAgICBXb3JrT3JkZXJBZ2VudElEICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgICA9PiAnMjAwOS0xMC0xMiAwMDowMDowMScsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUGxhbm5lZEVuZFRpbWUgICAgID0+ICcyMDA5LTEwLTE1IDE1OjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBBY3R1YWxTdGFydFRpbWUgICAgPT4gJzIwMDktMTAtMTQgMDA6MDA6MDEnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgICA9PiAnMjAwOS0wMS0yMCAwMDowMDowMScsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUGxhbm5lZEVmZm9ydCAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MSAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB3b3Jrb3JkZXIgZnJlZWtleSBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDEgPT4gJ0VhcnRoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIGZyb20gMSB0byBJVFNNV29ya09yZGVyOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBXb3JrT3JkZXJTdGF0ZSBhbmQgV29ya09yZGVyU3RhdGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclN0YXRlfSAmJiAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBXb3JrT3JkZXJTdGF0ZSBPUiBXb3JrT3JkZXJTdGF0ZUlEIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIGEgU3RhdGUgaXMgZ2l2ZW4sIHRoZW4gbG9vayB1cCB0aGUgSUQKICAgIGlmICggJFBhcmFte1dvcmtPcmRlclN0YXRlfSApIHsKICAgICAgICAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gPSAkU2VsZi0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICRQYXJhbXtXb3JrT3JkZXJTdGF0ZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIHdvcmtvcmRlciBzdGF0ZSBvdGhlcndpc2UgdGhlIHVwZGF0ZSBmYWlscwogICAgICAgICMgYXMgYm90aCBXb3JrT3JkZXJTdGF0ZSBhbmQgV29ya09yZGVyU3RhdGVJRCBleGlzdHMgdGhlbgogICAgICAgIGRlbGV0ZSAkUGFyYW17V29ya09yZGVyU3RhdGV9OwogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBXb3JrT3JkZXJUeXBlIGFuZCBXb3JrT3JkZXJUeXBlSUQgYXJlIGdpdmVuCiAgICBpZiAoICRQYXJhbXtXb3JrT3JkZXJUeXBlfSAmJiAkUGFyYW17V29ya09yZGVyVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFdvcmtPcmRlclR5cGUgT1IgV29ya09yZGVyVHlwZUlEIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIFR5cGUgaXMgZ2l2ZW4sIHRoZW4gbG9vayB1cCB0aGUgSUQKICAgIGlmICggJFBhcmFte1dvcmtPcmRlclR5cGV9ICkgewogICAgICAgICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ID0gJFNlbGYtPldvcmtPcmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgIFdvcmtPcmRlclR5cGUgPT4gJFBhcmFte1dvcmtPcmRlclR5cGV9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRoZSB3b3Jrb3JkZXIgdHlwZSBvdGhlcndpc2UgdGhlIHVwZGF0ZSBmYWlscwogICAgICAgICMgYXMgYm90aCBXb3JrT3JkZXJUeXBlIGFuZCBXb3JrT3JkZXJUeXBlSUQgZXhpc3RzIHRoZW4KICAgICAgICBkZWxldGUgJFBhcmFte1dvcmtPcmRlclR5cGV9OwogICAgfQoKICAgICMgZ2V0IGEgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGFyZ3VtZW50cyB3aGljaCBtaWdodCBjb250YWluIEhUTUwgbWFya3VwCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEluc3RydWN0aW9uIFJlcG9ydCkpIHsKCiAgICAgICAgbmV4dCBBUkdVTUVOVCBpZiAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9OwoKICAgICAgICAkUGFyYW17IiR7QXJndW1lbnR9UGxhaW4ifSA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICk7CgogICAgfQoKICAgICMgY2hlY2sgdGhlIHBhcmFtZXRlcnMKICAgIHJldHVybiBpZiAhJFNlbGYtPl9DaGVja1dvcmtPcmRlclBhcmFtcyglUGFyYW0pOwoKICAgICMgdHJpZ2dlciBXb3JrT3JkZXJBZGRQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1dvcmtPcmRlckFkZFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgc2V0IGluaXRpYWwgV29ya09yZGVyU3RhdGVJRCwgdXNlIGRlZmF1bHQgaWYgbm90IHBhc3NlZAogICAgbXkgJFdvcmtPcmRlclN0YXRlSUQgPSBkZWxldGUgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9OwogICAgaWYgKCAhJFdvcmtPcmRlclN0YXRlSUQgKSB7CgogICAgICAgICMgZ2V0IGluaXRpYWwgd29ya29yZGVyIHN0YXRlIGlkCiAgICAgICAgbXkgJE5leHRTdGF0ZUlEcyA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgICk7CiAgICAgICAgJFdvcmtPcmRlclN0YXRlSUQgPSAkTmV4dFN0YXRlSURzLT5bMF07CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBXb3JrT3JkZXJUeXBlSUQsIHVzZSBkZWZhdWx0IGlmIG5vdCBwYXNzZWQKICAgIG15ICRXb3JrT3JkZXJUeXBlSUQgPSBkZWxldGUgJFBhcmFte1dvcmtPcmRlclR5cGVJRH07CiAgICBpZiAoICEkV29ya09yZGVyVHlwZUlEICkgewoKICAgICAgICAjIHNldCBjb25maWcgb3B0aW9uCiAgICAgICAgbXkgJENvbmZpZ09wdGlvbiA9ICdJVFNNV29ya09yZGVyOjpUeXBlOjpEZWZhdWx0JzsKCiAgICAgICAgIyBnZXQgZGVmYXVsdCB3b3Jrb3JkZXIgdHlwZSBmcm9tIGNvbmZpZwogICAgICAgIG15ICREZWZhdWx0VHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCRDb25maWdPcHRpb24pOwoKICAgICAgICAjIGNoZWNrIGlmIGRlZmF1bHQgdHlwZSBleGlzdHMgaW4gZ2VuZXJhbCBjYXRhbG9nCiAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLAogICAgICAgICAgICBOYW1lICA9PiAkRGVmYXVsdFR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBoYW5kbGluZyBiZWNhdXNlIG9mIGludmFsaWQgY29uZmlnIHNldHRpbmcKICAgICAgICBpZiAoICEkSXRlbURhdGFSZWYgfHwgcmVmICRJdGVtRGF0YVJlZiBuZSAnSEFTSCcgfHwgISV7JEl0ZW1EYXRhUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBkZWZhdWx0IFdvcmtPcmRlclR5cGUgJyREZWZhdWx0VHlwZScgIgogICAgICAgICAgICAgICAgICAgIC4gImluIHN5c2NvbmZpZyBvcHRpb24gJyRDb25maWdPcHRpb24nIGlzIGludmFsaWQhIENoZWNrIHRoZSBnZW5lcmFsIGNhdGFsb2chIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVmYXVsdAogICAgICAgICRXb3JrT3JkZXJUeXBlSUQgPSAkSXRlbURhdGFSZWYtPntJdGVtSUR9OwogICAgfQoKICAgICMgZ2V0IGEgdW5pcXVlIHdvcmtvcmRlciBudW1iZXIKICAgIG15ICRXb3JrT3JkZXJOdW1iZXIgPSAkU2VsZi0+X0dldFdvcmtPcmRlck51bWJlciglUGFyYW0pOwoKICAgICMgYWRkIFdvcmtPcmRlciB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2Vfd29ya29yZGVyICcKICAgICAgICAgICAgLiAnKGNoYW5nZV9pZCwgd29ya29yZGVyX251bWJlciwgd29ya29yZGVyX3N0YXRlX2lkLCB3b3Jrb3JkZXJfdHlwZV9pZCwgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q2hhbmdlSUR9LCBcJFdvcmtPcmRlck51bWJlciwgXCRXb3JrT3JkZXJTdGF0ZUlELCBcJFdvcmtPcmRlclR5cGVJRCwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgV29ya09yZGVySUQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNoYW5nZV93b3Jrb3JkZXIgV0hFUkUgY2hhbmdlX2lkID0gPyBBTkQgd29ya29yZGVyX251bWJlciA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0sIFwkV29ya09yZGVyTnVtYmVyIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkV29ya09yZGVySUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRXb3JrT3JkZXJJRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJFdvcmtPcmRlcklEICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiV29ya09yZGVyQWRkKCkgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnV29ya09yZGVyR2V0OjpJRDo6JyAuICRXb3JrT3JkZXJJRCwKICAgICAgICAnV29ya09yZGVyTGlzdDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICdXb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0OjpDaGFuZ2VJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZVRpbWVHZXQ6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAnQ2hhbmdlR2V0OjpJRDo6JyAuICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBXb3JrT3JkZXJBZGRQb3N0LUV2ZW50CiAgICAjICh5ZXMsIHdlIHdhbnQgZG8gZG8gdGhpcyBiZWZvcmUgdGhlIFdvcmtPcmRlclVwZGF0ZSEpCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdXb3JrT3JkZXJBZGRQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgV29ya09yZGVySUQgICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFdvcmtPcmRlck51bWJlciAgPT4gJFdvcmtPcmRlck51bWJlciwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVJRCwKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkV29ya09yZGVyVHlwZUlELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHVwZGF0ZSBXb3JrT3JkZXIgd2l0aCByZW1haW5pbmcgcGFyYW1ldGVycywKICAgICMgdGhlIGFscmVhZHkgaGFuZGxlcyBwYXJhbXMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSAlUGFyYW0KICAgIG15ICRVcGRhdGVTdWNjZXNzID0gJFNlbGYtPldvcmtPcmRlclVwZGF0ZSgKICAgICAgICAlUGFyYW0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgKTsKCiAgICAjIGNoZWNrIHVwZGF0ZSBlcnJvcgogICAgaWYgKCAhJFVwZGF0ZVN1Y2Nlc3MgKSB7CgogICAgICAgICMgZGVsZXRlIHdvcmtvcmRlciBpZiBpdCBjb3VsZCBub3QgYmUgdXBkYXRlZAogICAgICAgICRTZWxmLT5Xb3JrT3JkZXJEZWxldGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkV29ya09yZGVySUQ7Cn0KCj1pdGVtIFdvcmtPcmRlclVwZGF0ZSgpCgpVcGRhdGUgYSB3b3Jrb3JkZXIuCkxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCBmcm9tIEM8V29ya09yZGVyVGl0bGU+LgpQYXNzaW5nIHVuZGVmaW5lZCB2YWx1ZXMgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkLiBBbiBleGNlcHRpb24KYXJlIHRoZSBwYXJhbWV0ZXJzIEM8UGxhbm5lZFN0YXJ0VGltZT4sIEM8UGxhbm5lZEVuZFRpbWU+LCBDPEFjdHVhbFN0YXJ0VGltZT4sIGFuZCBDPEFjdHVhbEVuZFRpbWU+LgpUaGVyZSBwYXNzaW5nIEM8dW5kZWY+IGluZGljYXRlcyB0aGF0IHRoZSB3b3Jrb3JkZXIgdGltZSBzaG91bGQgYmUgY2xlYXJlZC4KQW5vdGhlciBleGNlcHRpb24gaXMgdGhlIFdvcmtPcmRlckFnZW50SUQuIFBhc3MgdW5kZWYgZm9yIHJlbW92aW5nIHRoZSB3b3Jrb3JkZXIgYWdlbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgV29ya09yZGVySUQgICAgICAgID0+IDQsCiAgICAgICAgV29ya09yZGVyTnVtYmVyICAgID0+IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgICAgPT4gJ1JlcGxhY2VtZW50IG9mIG1haWwgc2VydmVyJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEluc3RydWN0aW9uICAgICAgICA9PiAnSW5zdGFsbCB0aGUgdGhlIG5ldyBzZXJ2ZXInLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVwb3J0ICAgICAgICAgICAgID0+ICdJbnN0YWxsZWQgbmV3IHNlcnZlciB3aXRob3V0IHByb2JsZW1zJywgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEICAgPT4gMTU3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBXb3JrT3JkZXJTdGF0ZSA9PiAncmVhZHknCiAgICAgICAgV29ya09yZGVyU3RhdGUgICAgID0+ICdyZWFkeScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyU3RhdGVJRCA9PiAxNTcKICAgICAgICBXb3JrT3JkZXJUeXBlSUQgICAgPT4gMTYxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBvciBXb3JrT3JkZXJUeXBlID0+ICdwaXInCiAgICAgICAgV29ya09yZGVyVHlwZSAgICAgID0+ICdwaXInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgV29ya09yZGVyU3RhdGVJRCA9PiAxNjEKICAgICAgICBXb3JrT3JkZXJBZ2VudElEICAgPT4gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBjYW4gYmUgdW5kZWYgZm9yIHJlbW92aW5nIHRoZSB3b3Jrb3JkZXIgYWdlbnQKICAgICAgICBQbGFubmVkU3RhcnRUaW1lICAgPT4gJzIwMDktMTAtMTIgMDA6MDA6MDEnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSAndW5kZWYnIGluZGljYXRlcyBjbGVhcmluZwogICAgICAgIFBsYW5uZWRFbmRUaW1lICAgICA9PiAnMjAwOS0xMC0xNSAxNTowMDowMCcsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpICd1bmRlZicgaW5kaWNhdGVzIGNsZWFyaW5nCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICAgID0+ICcyMDA5LTEwLTE0IDAwOjAwOjAxJywgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgJ3VuZGVmJyBpbmRpY2F0ZXMgY2xlYXJpbmcKICAgICAgICBBY3R1YWxFbmRUaW1lICAgICAgPT4gJzIwMDktMDEtMjAgMDA6MDA6MDEnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSAndW5kZWYnIGluZGljYXRlcyBjbGVhcmluZwogICAgICAgIFBsYW5uZWRFZmZvcnQgICAgICA9PiAxMjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWNjb3VudGVkVGltZSAgICAgID0+IDEzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdGhlIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBpbiB0aGUgZGF0YWJhc2UKICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MSAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB3b3Jrb3JkZXIgZnJlZWtleSBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDEgPT4gJ0VhcnRoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIGZyb20gMSB0byBJVFNNV29ya09yZGVyOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICAgICAgTm9OdW1iZXJDYWxjICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwLCBpZiAxIGl0IHByZXZlbnRzIGEgcmVjYWxjdWxhdGlvbiBvZiB0aGUgd29ya29yZGVyIG51bWJlcnMKICAgICAgICBCeXBhc3NTdGF0ZU1hY2hpbmUgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAsIGlmIDEgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBiZSBieXBhc3NlZAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgKTsKCkNvbnN0cmFpbnRzOgoKQzx4eHhTdGFydFRpbWU+IGhhcyB0byBiZSBiZWZvcmUgQzx4eHhFbmRUaW1lPi4gSWYganVzdCBvbmUgb2YgdGhlIHBhcmFtZXRlciBwYWlyIGlzIHBhc3NlZAp0aGUgb3RoZXIgdGltZSBpcyByZXRyaWV2ZWQgZnJvbSBkYXRhYmFzZS4KVGhlIEM8V29ya09yZGVyU3RhdGVJRD4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzdGF0ZSBtYWNoaW5lLgoKPWN1dAoKc3ViIFdvcmtPcmRlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBXb3JrT3JkZXJTdGF0ZSBhbmQgV29ya09yZGVyU3RhdGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclN0YXRlfSAmJiAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBXb3JrT3JkZXJTdGF0ZSBPUiBXb3JrT3JkZXJTdGF0ZUlEIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdoZW4gdGhlIFN0YXRlIGlzIGdpdmVuLCB0aGVuIGxvb2sgdXAgdGhlIElECiAgICBpZiAoICRQYXJhbXtXb3JrT3JkZXJTdGF0ZX0gKSB7CiAgICAgICAgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9ID0gJFNlbGYtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAkUGFyYW17V29ya09yZGVyU3RhdGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFR5cGUgYW5kIFR5cGVJRCBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclR5cGV9ICYmICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgV29ya09yZGVyVHlwZSBPUiBXb3JrT3JkZXJUeXBlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgVHlwZSBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgaWYgKCAkUGFyYW17V29ya09yZGVyVHlwZX0gKSB7CiAgICAgICAgJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gPSAkU2VsZi0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyVHlwZSA9PiAkUGFyYW17V29ya09yZGVyVHlwZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5vcm1hbGl6ZSB0aGUgVGl0bGUsIHdoZW4gaXQgaXMgZ2l2ZW4KICAgIGlmICggJFBhcmFte1dvcmtPcmRlclRpdGxlfSAmJiAhcmVmICRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gKSB7CgogICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgICAgICRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gPX4gc3sgXEEgXHMrIH17fXhtczsKCiAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgICAgICRQYXJhbXtXb3JrT3JkZXJUaXRsZX0gPX4gc3sgXHMrIFx6IH17fXhtczsKICAgIH0KCiAgICAjIGdldCBhIHBsYWluIHRleHQgdmVyc2lvbiBvZiBhcmd1bWVudHMgd2hpY2ggbWlnaHQgY29udGFpbiBIVE1MIG1hcmt1cAogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJbnN0cnVjdGlvbiBSZXBvcnQpKSB7CgogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgJFBhcmFteyIke0FyZ3VtZW50fVBsYWluIn0gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVmYXVsdCB2YWx1ZXMgZm9yIHBsYW5uZWQgZWZmb3J0IGFuZCBhY2NvdW50ZWQgdGltZQogICAgIyB0aGlzIGF2b2lkcyBzdXBlcmZsb3VzIGhpc3RvcnkgZW50cmllcwogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhQbGFubmVkRWZmb3J0IEFjY291bnRlZFRpbWUpKSB7CgogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9IDA7CiAgICB9CgogICAgIyBjaGVjayB0aGUgZ2l2ZW4gcGFyYW1ldGVycwogICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrV29ya09yZGVyUGFyYW1zKCVQYXJhbSk7CgogICAgIyBjaGVjayBzYW5pdHkgb2YgdGhlIG5ldyBzdGF0ZSB3aXRoIHRoZSBzdGF0ZSBtYWNoaW5lCiAgICBpZiAoICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEfSApIHsKCiAgICAgICAgIyBnZXQgd29ya29yZGVyIGlkCiAgICAgICAgbXkgJFdvcmtPcmRlcklEID0gJFBhcmFte1dvcmtPcmRlcklEfTsKCiAgICAgICAgIyBkbyBub3QgZ2l2ZSBXb3JrT3JkZXJQb3NzaWJsZVN0YXRlc0dldCgpIHRoZSBXb3JrT3JkZXJJRAogICAgICAgICMgaWYgdGhlIHN0YXRlbWFjaGluZSBzaG91bGQgYmUgYnlwYXNzZWQuCiAgICAgICAgIyBXb3JrT3JkZXJQb3NzaWJsZVN0YXRlc0dldCgpIHdpbGwgdGhlbiByZXR1cm4gYWxsIHdvcmtvcmRlciBzdGF0ZXMKICAgICAgICBpZiAoICRQYXJhbXtCeXBhc3NTdGF0ZU1hY2hpbmV9ICkgewogICAgICAgICAgICAkV29ya09yZGVySUQgPSB1bmRlZjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIHBvc3NpYmxlIG5leHQgc3RhdGVzCiAgICAgICAgbXkgJFN0YXRlTGlzdCA9ICRTZWxmLT5Xb3JrT3JkZXJQb3NzaWJsZVN0YXRlc0dldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggIWdyZXAgeyAkXy0+e0tleX0gPT0gJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9IH0gQHskU3RhdGVMaXN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzdGF0ZSAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gaXMgbm90IGEgcG9zc2libGUgbmV4dCBzdGF0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9sZCBkYXRhIHRvIGJlIGdpdmVuIHRvIF9DaGVja1dvcmtPcmRlclBhcmFtcygpIGFuZCB0aGUgcG9zdCBldmVudCBoYW5kbGVyCiAgICBteSAkV29ya09yZGVyRGF0YSA9ICRTZWxmLT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiB0aGUgdGltZXN0YW1wcyBhcmUgY29ycmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrVGltZXN0YW1wcygKICAgICAgICAlUGFyYW0sCiAgICAgICAgV29ya09yZGVyRGF0YSA9PiAkV29ya09yZGVyRGF0YSwKICAgICk7CgogICAgIyB0cmlnZ2VyIFdvcmtPcmRlclVwZGF0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyVXBkYXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB1cGRhdGUgd29ya29yZGVyIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IGZpZWxkcwogICAgcmV0dXJuIGlmICEkU2VsZi0+X1dvcmtPcmRlckZyZWVUZXh0VXBkYXRlKCVQYXJhbSk7CgogICAgIyBtYXAgdXBkYXRlIGF0dHJpYnV0ZXMgdG8gY29sdW1uIG5hbWVzCiAgICBteSAlQXR0cmlidXRlID0gKAogICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ3RpdGxlJywKICAgICAgICBXb3JrT3JkZXJOdW1iZXIgID0+ICd3b3Jrb3JkZXJfbnVtYmVyJywKICAgICAgICBJbnN0cnVjdGlvbiAgICAgID0+ICdpbnN0cnVjdGlvbicsCiAgICAgICAgUmVwb3J0ICAgICAgICAgICA9PiAncmVwb3J0JywKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICd3b3Jrb3JkZXJfc3RhdGVfaWQnLAogICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJ3dvcmtvcmRlcl90eXBlX2lkJywKICAgICAgICBXb3JrT3JkZXJBZ2VudElEID0+ICd3b3Jrb3JkZXJfYWdlbnRfaWQnLAogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJ3BsYW5uZWRfc3RhcnRfdGltZScsCiAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAncGxhbm5lZF9lbmRfdGltZScsCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnYWN0dWFsX3N0YXJ0X3RpbWUnLAogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJ2FjdHVhbF9lbmRfdGltZScsCiAgICAgICAgSW5zdHJ1Y3Rpb25QbGFpbiA9PiAnaW5zdHJ1Y3Rpb25fcGxhaW4nLAogICAgICAgIFJlcG9ydFBsYWluICAgICAgPT4gJ3JlcG9ydF9wbGFpbicsCiAgICApOwoKICAgICMgYnVpbGQgU1FMIHRvIHVwZGF0ZSB3b3Jrb3JkZXIKICAgIG15ICRTUUwgPSAnVVBEQVRFIGNoYW5nZV93b3Jrb3JkZXIgU0VUICc7CiAgICBteSBAQmluZDsKCiAgICAjIGRlZmluZSB0aGUgRGVmYXVsdFRpbWVTdGFtcAogICAgbXkgJERlZmF1bHRUaW1lU3RhbXAgPSAnOTk5OS0wMS0wMSAwMDowMDowMCc7CgogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICVBdHRyaWJ1dGUgKSB7CgogICAgICAgICMgcHJlc2VydmUgdGhlIG9sZCB2YWx1ZSwgd2hlbiB0aGUgY29sdW1uIGlzbid0IGluIGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZXhpc3RzICRQYXJhbXskQXR0cmlidXRlfTsKCiAgICAgICAgIyBhdHRyaWJ1dGUgaXMgZGVmaW5lZAogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFteyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgIyBpdCdzIG9rIGlmIHRoZSBXb3JrT3JkZXJBZ2VudElEIGlzIG5vdCBkZWZpbmVkCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdXb3JrT3JkZXJBZ2VudElEJyAmJiAhZGVmaW5lZCAkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSBOVUxMLCAiOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQgYW5kIGlzIG9uZSBvZiB0aGUgdGltZSBwYXJhbWV0ZXJzCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlID1+IG17IFxBICggQWN0dWFsIHwgUGxhbm5lZCApICggU3RhcnQgfCBFbmQgKSBUaW1lIFx6IH14bXMgKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJERlZmF1bHRUaW1lU3RhbXA7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkaXRpb24gb2YgYWNjb3VudGVkIHRpbWUKICAgIGlmICggJFBhcmFte0FjY291bnRlZFRpbWV9ICkgewoKICAgICAgICAjIGdldCBjdXJyZW50IGFjY291bnRlZCB0aW1lCiAgICAgICAgbXkgJEN1cnJlbnRBY2NvdW50ZWRUaW1lID0gJFdvcmtPcmRlckRhdGEtPntBY2NvdW50ZWRUaW1lfSB8fCAwOwoKICAgICAgICAjIGFkZCBuZXcgYWNjb3V0ZWQgdGltZSB0byBjdXJyZW50IGFjY291bnRlZCB0aW1lCiAgICAgICAgbXkgJEFjY291bnRlZFRpbWUgPSAkQ3VycmVudEFjY291bnRlZFRpbWUgKyAkUGFyYW17QWNjb3VudGVkVGltZX07CgogICAgICAgICMgZGIgcXVvdGUKICAgICAgICAkQWNjb3VudGVkVGltZSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJEFjY291bnRlZFRpbWUsICdOdW1iZXInICk7CgogICAgICAgICMgYnVpbGQgU1FMICh3aXRob3V0IGJpbmRzKQogICAgICAgICRTUUwgLj0gImFjY291bnRlZF90aW1lID0gJEFjY291bnRlZFRpbWUsICI7CiAgICB9CgogICAgIyBzZXR0aW5nIG9mIHBsYW5uZWQgZWZmb3J0CiAgICBpZiAoICRQYXJhbXtQbGFubmVkRWZmb3J0fSApIHsKCiAgICAgICAgIyBkYiBxdW90ZQogICAgICAgICRQYXJhbXtQbGFubmVkRWZmb3J0fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1BsYW5uZWRFZmZvcnR9LCAnTnVtYmVyJyApOwoKICAgICAgICAjIGJ1aWxkIFNRTCAod2l0aG91dCBiaW5kcykKICAgICAgICAkU1FMIC49ICJwbGFubmVkX2VmZm9ydCA9ICRQYXJhbXtQbGFubmVkRWZmb3J0fSwgIjsKICAgIH0KCiAgICAkU1FMIC49ICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICc7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CiAgICAkU1FMIC49ICdXSEVSRSBpZCA9ID8nOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtXb3JrT3JkZXJJRH07CgogICAgIyB1cGRhdGUgd29ya29yZGVyCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgJ1dvcmtPcmRlckdldDo6SUQ6OicgLiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgICdXb3JrT3JkZXJDaGFuZ2VFZmZvcnRzR2V0OjpDaGFuZ2VJRDo6JyAuICRXb3JrT3JkZXJEYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICdXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0OjpDaGFuZ2VJRDo6JyAuICRXb3JrT3JkZXJEYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICdDaGFuZ2VHZXQ6OklEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgPT4gJEtleSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBXb3JrT3JkZXJVcGRhdGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdXb3JrT3JkZXJVcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIE9sZFdvcmtPcmRlckRhdGEgPT4gJFdvcmtPcmRlckRhdGEsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtPcmRlckdldCgpCgpSZXR1cm4gYSBXb3JrT3JkZXIgYXMgaGFzaCByZWZlcmVuY2UuCldoZW4gdGhlIHdvcmtvcmRlciBkb2VzIG5vdCBleGlzdCwgYSBmYWxzZSB2YWx1ZSBpcyByZXR1cm5lZC4KVGhlIG9wdGlvbmFsIG9wdGlvbiBDPExvZ05vPiB0dXJucyBvZmYgbG9nZ2luZyB3aGVuIHRoZSB3b3Jrb3JkZXIgZG9lcyBub3QgZXhpc3QuCgogICAgbXkgJFdvcmtPcmRlclJlZiA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICBMb2dObyAgICAgICA9PiAxLCAgICAgICMgb3B0aW9uYWwsIHR1cm5zIG9mZiBsb2dnaW5nIHdoZW4gdGhlIHdvcmtvcmRlciBkb2VzIG5vdCBleGlzdAogICAgKTsKClRoZSByZXR1cm5lZCBoYXNoIHJlZmVyZW5jZSBjb250YWlucyBmb2xsb3dpbmcgZWxlbWVudHM6CgogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJJRH0KICAgICRXb3JrT3JkZXJ7Q2hhbmdlSUR9CiAgICAkV29ya09yZGVye1dvcmtPcmRlck51bWJlcn0KICAgICRXb3JrT3JkZXJ7V29ya09yZGVyVGl0bGV9CiAgICAkV29ya09yZGVye0luc3RydWN0aW9ufQogICAgJFdvcmtPcmRlcntJbnN0cnVjdGlvblBsYWlufQogICAgJFdvcmtPcmRlcntSZXBvcnR9CiAgICAkV29ya09yZGVye1JlcG9ydFBsYWlufQogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJTdGF0ZUlEfQogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJTdGF0ZX0gICAgICAgICAgICAgICMgZmV0Y2hlZCBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgICRXb3JrT3JkZXJ7V29ya09yZGVyU3RhdGVTaWduYWx9ICAgICAgICAjIGZldGNoZWQgZnJvbSBTeXNDb25maWcKICAgICRXb3JrT3JkZXJ7V29ya09yZGVyVHlwZUlEfQogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJUeXBlfSAgICAgICAgICAgICAgICMgZmV0Y2hlZCBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgICRXb3JrT3JkZXJ7V29ya09yZGVyQWdlbnRJRH0KICAgICRXb3JrT3JkZXJ7UGxhbm5lZFN0YXJ0VGltZX0KICAgICRXb3JrT3JkZXJ7UGxhbm5lZEVuZFRpbWV9CiAgICAkV29ya09yZGVye0FjdHVhbFN0YXJ0VGltZX0KICAgICRXb3JrT3JkZXJ7QWN0dWFsRW5kVGltZX0KICAgICRXb3JrT3JkZXJ7QWNjb3VudGVkVGltZX0KICAgICRXb3JrT3JkZXJ7UGxhbm5lZEVmZm9ydH0KICAgICRXb3JrT3JkZXJ7V29ya09yZGVyRnJlZUtleTF9ICAgICAgICAgICAjIHdvcmtvcmRlciBmcmVla2V5IGZpZWxkcyBmcm9tIDEgdG8gSVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ6Ok1heE51bWJlcgogICAgJFdvcmtPcmRlcntXb3JrT3JkZXJGcmVlVGV4dDF9ICAgICAgICAgICMgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIDEgdG8gSVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ6Ok1heE51bWJlcgogICAgJFdvcmtPcmRlcntDcmVhdGVUaW1lfQogICAgJFdvcmtPcmRlcntDcmVhdGVCeX0KICAgICRXb3JrT3JkZXJ7Q2hhbmdlVGltZX0KICAgICRXb3JrT3JkZXJ7Q2hhbmdlQnl9Cgo9Y3V0CgpzdWIgV29ya09yZGVyR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVdvcmtPcmRlckRhdGE7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1dvcmtPcmRlckdldDo6SUQ6OicgLiAkUGFyYW17V29ya09yZGVySUR9OwogICAgbXkgJENhY2hlICAgID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIGlmICgkQ2FjaGUpIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGNhY2hlCiAgICAgICAgJVdvcmtPcmRlckRhdGEgPSAleyRDYWNoZX07CiAgICB9CgogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IGRhdGEgZnJvbSBkYXRhYmFzZQogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjaGFuZ2VfaWQsIHdvcmtvcmRlcl9udW1iZXIsIHRpdGxlLCAnCiAgICAgICAgICAgICAgICAuICdpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb25fcGxhaW4sICcKICAgICAgICAgICAgICAgIC4gJ3JlcG9ydCwgcmVwb3J0X3BsYWluLCAnCiAgICAgICAgICAgICAgICAuICd3b3Jrb3JkZXJfc3RhdGVfaWQsIHdvcmtvcmRlcl90eXBlX2lkLCB3b3Jrb3JkZXJfYWdlbnRfaWQsICcKICAgICAgICAgICAgICAgIC4gJ3BsYW5uZWRfc3RhcnRfdGltZSwgcGxhbm5lZF9lbmRfdGltZSwgYWN0dWFsX3N0YXJ0X3RpbWUsIGFjdHVhbF9lbmRfdGltZSwgJwogICAgICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgJwogICAgICAgICAgICAgICAgLiAnY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgJwogICAgICAgICAgICAgICAgLiAncGxhbm5lZF9lZmZvcnQsIGFjY291bnRlZF90aW1lICcKICAgICAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17V29ya09yZGVySUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVySUR9ICAgICAgPSAkUm93WzBdOwogICAgICAgICAgICAkV29ya09yZGVyRGF0YXtDaGFuZ2VJRH0gICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlck51bWJlcn0gID0gJFJvd1syXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyVGl0bGV9ICAgPSBkZWZpbmVkICRSb3dbM10gPyAkUm93WzNdIDogJyc7CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe0luc3RydWN0aW9ufSAgICAgID0gZGVmaW5lZCAkUm93WzRdID8gJFJvd1s0XSA6ICcnOwogICAgICAgICAgICAkV29ya09yZGVyRGF0YXtJbnN0cnVjdGlvblBsYWlufSA9IGRlZmluZWQgJFJvd1s1XSA/ICRSb3dbNV0gOiAnJzsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UmVwb3J0fSAgICAgICAgICAgPSBkZWZpbmVkICRSb3dbNl0gPyAkUm93WzZdIDogJyc7CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe1JlcG9ydFBsYWlufSAgICAgID0gZGVmaW5lZCAkUm93WzddID8gJFJvd1s3XSA6ICcnOwogICAgICAgICAgICAkV29ya09yZGVyRGF0YXtXb3JrT3JkZXJTdGF0ZUlEfSA9ICRSb3dbOF07CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlclR5cGVJRH0gID0gJFJvd1s5XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyQWdlbnRJRH0gPSAkUm93WzEwXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UGxhbm5lZFN0YXJ0VGltZX0gPSAkUm93WzExXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UGxhbm5lZEVuZFRpbWV9ICAgPSAkUm93WzEyXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7QWN0dWFsU3RhcnRUaW1lfSAgPSAkUm93WzEzXTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7QWN0dWFsRW5kVGltZX0gICAgPSAkUm93WzE0XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q3JlYXRlVGltZX0gICAgICAgPSAkUm93WzE1XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q3JlYXRlQnl9ICAgICAgICAgPSAkUm93WzE2XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q2hhbmdlVGltZX0gICAgICAgPSAkUm93WzE3XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7Q2hhbmdlQnl9ICAgICAgICAgPSAkUm93WzE4XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7UGxhbm5lZEVmZm9ydH0gICAgPSAkUm93WzE5XTsKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7QWNjb3VudGVkVGltZX0gICAgPSAkUm93WzIwXTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICBpZiAoICElV29ya09yZGVyRGF0YSApIHsKICAgICAgICAgICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldvcmtPcmRlcklEICRQYXJhbXtXb3JrT3JkZXJJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgVElNRUZJRUxEOgogICAgICAgIGZvciBteSAkVGltZSAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSBBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKCiAgICAgICAgICAgIG5leHQgVElNRUZJRUxEIGlmICEkV29ya09yZGVyRGF0YXskVGltZX07CgogICAgICAgICAgICAjIGNsZWFudXAgdGltZSBzdGFtcHMgKHNvbWUgZGF0YWJhc2VzIGFyZSB1c2luZyBlLiBnLiAyMDA4LTAyLTI1IDIyOjAzOjAwLjAwMDAwMCkKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7JFRpbWV9CiAgICAgICAgICAgICAgICA9fiBzeyBcQSAoIFxkXGRcZFxkIC0gXGRcZCAtIFxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgKSBcLiAuKz8gXHogfXskMX14bXM7CgogICAgICAgICAgICAjIHJlcGxhY2UgZGVmYXVsdCB0aW1lIHZhbHVlcyB3aXRoIGVtcHR5IHN0cmluZwogICAgICAgICAgICBpZiAoICRXb3JrT3JkZXJEYXRheyRUaW1lfSBlcSAnOTk5OS0wMS0wMSAwMDowMDowMCcgKSB7CiAgICAgICAgICAgICAgICAkV29ya09yZGVyRGF0YXskVGltZX0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQVRUUklCVVRFOgogICAgICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhQbGFubmVkRWZmb3J0IEFjY291bnRlZFRpbWUpKSB7CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJFdvcmtPcmRlckRhdGF7JEF0dHJpYnV0ZX07CgogICAgICAgICAgICAjIGRvIG5vdCBzaG93IHplcm8gdmFsdWVzCiAgICAgICAgICAgIGlmICggJFdvcmtPcmRlckRhdGF7JEF0dHJpYnV0ZX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJEYXRheyRBdHRyaWJ1dGV9ID0gJyc7CiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IGRlY2ltYWwgY2hhcmFjdGVyIGZyb20gJywnIHRvICcuJyBpZiBuZWNjZXNzYXJ5CiAgICAgICAgICAgICRXb3JrT3JkZXJEYXRheyRBdHRyaWJ1dGV9ID1+IHN7LH17Ln14bXNnOwoKICAgICAgICAgICAgIyBmb3JtYXQgYXMgZGVjaW1hbCBudW1iZXIKICAgICAgICAgICAgJFdvcmtPcmRlckRhdGF7JEF0dHJpYnV0ZX0gPSBzcHJpbnRmICclLjJmJywgJFdvcmtPcmRlckRhdGF7JEF0dHJpYnV0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgZnJlZWtleSBhbmQgZnJlZXRleHQgZGF0YQogICAgICAgIG15ICRXb3JrT3JkZXJGcmVlVGV4dCA9ICRTZWxmLT5fV29ya09yZGVyRnJlZVRleHRHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJlc3VsdCB0byB3b3Jrb3JkZXIgZGF0YQogICAgICAgICVXb3JrT3JkZXJEYXRhID0gKCAlV29ya09yZGVyRGF0YSwgJXskV29ya09yZGVyRnJlZVRleHR9ICk7CgogICAgICAgICMgc2V0IGNhY2hlICh3b3Jrb3JkZXIgZGF0YSBleGlzdHMgYXQgdGhpcyBwb2ludCwgaXQgd2FzIGNoZWNrZWQgYmVmb3JlKQogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVXb3JrT3JkZXJEYXRhLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIHRoZSBuYW1lIG9mIHRoZSB3b3Jrb3JkZXIgc3RhdGUKICAgIGlmICggJFdvcmtPcmRlckRhdGF7V29ya09yZGVyU3RhdGVJRH0gKSB7CiAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyU3RhdGV9ID0gJFNlbGYtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlclN0YXRlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgdGhlIHdvcmtvcmRlciBzdGF0ZSBzaWduYWwKICAgIGlmICggJFdvcmtPcmRlckRhdGF7V29ya09yZGVyU3RhdGV9ICkgewoKICAgICAgICAjIGdldCBhbGwgd29ya29yZGVyIHN0YXRlIHNpZ25hbHMKICAgICAgICBteSAkU3RhdGVTaWduYWwgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6U3RhdGU6OlNpZ25hbCcpOwoKICAgICAgICAkV29ya09yZGVyRGF0YXtXb3JrT3JkZXJTdGF0ZVNpZ25hbH0gPSAkU3RhdGVTaWduYWwtPnsgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyU3RhdGV9IH07CiAgICB9CgogICAgIyBhZGQgdGhlIG5hbWUgb2YgdGhlIHdvcmtvcmRlciB0eXBlCiAgICBpZiAoICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlclR5cGVJRH0gKSB7CiAgICAgICAgJFdvcmtPcmRlckRhdGF7V29ya09yZGVyVHlwZX0gPSAkU2VsZi0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRXb3JrT3JkZXJEYXRhe1dvcmtPcmRlclR5cGVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXCVXb3JrT3JkZXJEYXRhOwp9Cgo9aXRlbSBXb3JrT3JkZXJMaXN0KCkKClJldHVybiBhIGxpc3Qgb2YgYWxsIHdvcmtvcmRlciBpZHMgb2YgdGhlIGdpdmVuIGNoYW5nZSBhcyBhcnJheSByZWZlcmVuY2UuClRoZSB3b3Jrb3JkZXIgaWRzIGFyZSBvcmRlcmVkIGJ5IHdvcmtvcmRlciBudW1iZXIuCgogICAgbXkgJFdvcmtPcmRlcklEc1JlZiA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gNSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQFdvcmtPcmRlcklEczsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnV29ya09yZGVyTGlzdDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9OwogICAgbXkgJENhY2hlICAgID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIGlmICgkQ2FjaGUpIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGNhY2hlCiAgICAgICAgQFdvcmtPcmRlcklEcyA9IEB7JENhY2hlfTsKICAgIH0KCiAgICAjIGdldCBkYXRhIGZyb20gZGF0YWJhc2UKICAgIGVsc2UgewoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIgaWRzCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAnU0VMRUNUIGlkIEZST00gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgICAgICAuICdXSEVSRSBjaGFuZ2VfaWQgPSA/ICcKICAgICAgICAgICAgICAgIC4gJ09SREVSIEJZIHdvcmtvcmRlcl9udW1iZXIsIGlkJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgd2hpbGUgKCBteSAoJElEKSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQFdvcmtPcmRlcklEcywgJElEOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUgb25seSBpZiB3b3Jrb3JkZXIgaWRzIGV4aXN0cwogICAgICAgIGlmIChAV29ya09yZGVySURzKSB7CgogICAgICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFxAV29ya09yZGVySURzLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcQFdvcmtPcmRlcklEczsKfQoKPWl0ZW0gV29ya09yZGVyU2VhcmNoKCkKClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgd29ya29yZGVyIGlkcy4KVGhlIGNvdW50IG9mIHJlc3VsdHMgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcGFyYW1ldGVyIEM8UmVzdWx0ID0+ICdDT1VOVCc+IGlzIHBhc3NlZC4KClRoZSBzZWFyY2ggY3JpdGVyaWEgYXJlIGxvZ2ljYWxseSBBTkQgY29ubmVjdGVkLgpXaGVuIGEgbGlzdCBpcyBwYXNzZWQgYXMgY3JpdGVyaXVtLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaXVtCmlzIGlnbm9yZWQuCgogICAgbXkgJFdvcmtPcmRlcklEc1JlZiA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclNlYXJjaCgKICAgICAgICBDaGFuZ2VJRHMgICAgICAgICA9PiBbIDEyMywgMTIyIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJOdW1iZXIgICA9PiAxMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgV29ya09yZGVyVGl0bGUgICAgPT4gJ1JlcGxhY2VtZW50IG9mIG1haWwgc2VydmVyJywgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICAgPT4gJ0luc3RhbGwgdGhlIHRoZSBuZXcgc2VydmVyJywgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVwb3J0ICAgICAgICAgICAgPT4gJ0luc3RhbGxlZCBuZXcgc2VydmVyIHdpdGhvdXQgcHJvYmxlbXMnLCAgIyAob3B0aW9uYWwpCgogICAgICAgICMgc2VhcmNoIGluIHdvcmtvcmRlciBmcmVldGV4dCBhbmQgZnJlZWtleSBmaWVsZHMKICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MSAgPT4gJ1N1bicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgd29ya29yZGVyIGZyZWVrZXkgZmllbGRzIGZyb20gMSB0byBJVFNNV29ya09yZGVyOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICAgICAgV29ya09yZGVyRnJlZVRleHQxID0+ICdFYXJ0aCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKCiAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gWyAxMSwgMTIgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyU3RhdGVzICAgPT4gWyAnY2xvc2VkJywgJ2NhbmNlbGVkJyBdLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIFdvcmtPcmRlclR5cGVJRHMgID0+IFsgMjEsIDIyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlclR5cGVzICAgID0+IFsgJ2FwcHJvdmFsJywgJ3dvcmtvcmRlcicgXSwgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiBbIDEsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDcmVhdGVCeSAgICAgICAgICA9PiBbIDUsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCeSAgICAgICAgICA9PiBbIDMsIDIsIDEgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBzZWFyY2ggaW4gdGV4dCBmaWVsZHMgb2YgY2hhbmdlIG9iamVjdAogICAgICAgIENoYW5nZU51bWJlciAgICAgICAgPT4gJ051bWJlciBvZiBjaGFuZ2UnLCAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgPT4gJ1RpdGxlIG9mIGNoYW5nZScsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZURlc2NyaXB0aW9uICAgPT4gJ0Rlc2NyaXB0aW9uIG9mIGNoYW5nZScsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENoYW5nZUp1c3RpZmljYXRpb24gPT4gJ0p1c3RpZmljYXRpb24gb2YgY2hhbmdlJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBwbGFubmVkIHN0YXJ0IHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggcGxhbm5lZCBzdGFydCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggcGxhbm5lZCBlbmQgdGltZSBhZnRlciAuLi4KICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBwbGFubmVkIGVuZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggYWN0dWFsIHN0YXJ0IHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggYWN0dWFsIHN0YXJ0IHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBhY3R1YWwgZW5kIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSAgICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggYWN0dWFsIGVuZCB0aW1lIGJlZm9yZSB0aGVuIC4uLi4KICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlICAgID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyB3b3Jrb3JkZXJzIHdpdGggY3JlYXRlZCB0aW1lIGFmdGVyIC4uLgogICAgICAgIENyZWF0ZVRpbWVOZXdlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgd29ya29yZGVycyB3aXRoIGNyZWF0ZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ3JlYXRlVGltZU9sZGVyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgd29ya29yZGVycyB3aXRoIGNoYW5nZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDaGFuZ2VUaW1lTmV3ZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIHdvcmtvcmRlcnMgd2l0aCBjaGFuZ2VkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENoYW5nZVRpbWVPbGRlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ0NoYW5nZUlEJywgJ1dvcmtPcmRlck51bWJlcicgXSwgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgZGVmYXVsdDogWyAnV29ya09yZGVySUQnIF0sCiAgICAgICAgIyAoV29ya09yZGVySUQsIENoYW5nZUlELCBXb3JrT3JkZXJOdW1iZXIsIFdvcmtPcmRlclRpdGxlCiAgICAgICAgIyBXb3JrT3JkZXJTdGF0ZUlELCBXb3JrT3JkZXJUeXBlSUQsIFdvcmtPcmRlckFnZW50SUQsCiAgICAgICAgIyBQbGFubmVkU3RhcnRUaW1lLCBQbGFubmVkRW5kVGltZSwKICAgICAgICAjIEFjdHVhbFN0YXJ0VGltZSwgQWN0dWFsRW5kVGltZSwKICAgICAgICAjIENyZWF0ZVRpbWUsIENyZWF0ZUJ5LCBDaGFuZ2VUaW1lLCBDaGFuZ2VCeSkKCiAgICAgICAgIyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBPcmRlckJ5OgogICAgICAgICMgVGhlIE9yZGVyQnlEaXJlY3Rpb24gY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBPcmRlckJ5IGF0dHJpYnV0ZS4KICAgICAgICAjIFRoZSBwYWlyaW5nIGlzIG1hZGUgYnkgdGhlIGFycmF5IGluZGljZXMuCgogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAnRG93bicsICdVcCcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyBkZWZhdWx0OiBbICdEb3duJyBdCiAgICAgICAgIyAoRG93biB8IFVwKQoKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjICgwIHwgMSkgZGVmYXVsdCAxCgogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknIHx8ICdDT1VOVCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2Ygd29ya29yZGVyIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgd29ya29yZGVycwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwoKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHZlcmlmeSB0aGF0IGFsbCBwYXNzZWQgYXJyYXkgcGFyYW1ldGVycyBjb250YWluIGFuIGFycmF5cmVmCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKAogICAgICAgIHF3KAogICAgICAgIE9yZGVyQnkKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uCiAgICAgICAgV29ya09yZGVyU3RhdGVJRHMKICAgICAgICBXb3JrT3JkZXJTdGF0ZXMKICAgICAgICBXb3JrT3JkZXJUeXBlcwogICAgICAgIFdvcmtPcmRlclR5cGVJRHMKICAgICAgICBDaGFuZ2VJRHMKICAgICAgICBXb3JrT3JkZXJBZ2VudElEcwogICAgICAgIENyZWF0ZUJ5CiAgICAgICAgQ2hhbmdlQnkKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSBbXTsKCiAgICAgICAgICAgIG5leHQgQVJHVU1FTlQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17JEFyZ3VtZW50fSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQFNRTFdoZXJlOyAgICAgICAgICAgIyBhc3NlbWJsZSB0aGUgY29uZGl0aW9ucyB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2UKICAgIG15IEBJbm5lckpvaW5UYWJsZXM7ICAgICMga2VlcCB0cmFjayBvZiB0aGUgdGFibGVzIHRoYXQgbmVlZCB0byBiZSBpbm5lciBqb2luZWQKCiAgICAjIGtlZXAgdHJhY2sgb2YgdGhlIHRhYmxlcyB0aGF0IG5lZWQgdG8gYmUgaW5uZXIgam9pbmVkIGZvciB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICBteSBASW5uZXJKb2luVGFibGVzV29ya09yZGVyRnJlZVRleHQ7CgogICAgIyBkZWZpbmUgb3JkZXIgdGFibGUKICAgIG15ICVPcmRlckJ5VGFibGUgPSAoCgogICAgICAgICMgd29ya29yZGVyIGF0dHJpYnV0ZXMKICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICd3by5jaGFuZ2VfaWQnLAogICAgICAgIFdvcmtPcmRlcklEICAgICAgPT4gJ3dvLmlkJywKICAgICAgICBXb3JrT3JkZXJOdW1iZXIgID0+ICd3by53b3Jrb3JkZXJfbnVtYmVyJywKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICd3by50aXRsZScsCiAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAnd28ud29ya29yZGVyX3N0YXRlX2lkJywKICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICd3by53b3Jrb3JkZXJfdHlwZV9pZCcsCiAgICAgICAgV29ya09yZGVyQWdlbnRJRCA9PiAnd28ud29ya29yZGVyX2FnZW50X2lkJywKICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICd3by5wbGFubmVkX3N0YXJ0X3RpbWUnLAogICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJ3dvLnBsYW5uZWRfZW5kX3RpbWUnLAogICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJ3dvLmFjdHVhbF9zdGFydF90aW1lJywKICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICd3by5hY3R1YWxfZW5kX3RpbWUnLAogICAgICAgIENyZWF0ZVRpbWUgICAgICAgPT4gJ3dvLmNyZWF0ZV90aW1lJywKICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICd3by5jcmVhdGVfYnknLAogICAgICAgIENoYW5nZVRpbWUgICAgICAgPT4gJ3dvLmNoYW5nZV90aW1lJywKICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+ICd3by5jaGFuZ2VfYnknLAoKICAgICAgICAjIGNoYW5nZSBhdHRyaWJ1dGVzCiAgICAgICAgQ2hhbmdlTnVtYmVyICAgID0+ICdjLmNoYW5nZV9udW1iZXInLAogICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnYy50aXRsZScsCiAgICAgICAgQ2hhbmdlU3RhdGVJRCAgID0+ICdjLmNoYW5nZV9zdGF0ZV9pZCcsCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+ICdjLmNoYW5nZV9tYW5hZ2VyX2lkJywKICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJ2MuY2hhbmdlX2J1aWxkZXJfaWQnLAogICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAnYy5jYXRlZ29yeV9pZCcsCiAgICAgICAgSW1wYWN0SUQgICAgICAgID0+ICdjLmltcGFjdF9pZCcsCiAgICAgICAgUHJpb3JpdHlJRCAgICAgID0+ICdjLnByaW9yaXR5X2lkJywKICAgICAgICBSZXF1ZXN0ZWRUaW1lICAgPT4gJ2MucmVxdWVzdGVkX3RpbWUnLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzCiAgICBteSAlT3JkZXJCeVNlZW47CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgaWYgKCAhJE9yZGVyQnkgfHwgISRPcmRlckJ5VGFibGV7JE9yZGVyQnl9IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAjIGZvdW5kIGFuIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5IGNvbnRhaW5zIGludmFsaWQgdmFsdWUgJyRPcmRlckJ5JyAiCiAgICAgICAgICAgICAgICAgICAgLiAnb3IgdGhlIHZhbHVlIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciB0aGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQgYXBwZWFycyBtb3JlIHRoYW4gb25jZQogICAgICAgICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gPSAxOwoKICAgICAgICAjIGpvaW4gdGhlIGNoYW5nZSB0YWJsZSwgd2hlbiBpdCBpcyBuZWVkZWQgZm9yIHRoZSBPcmRlckJ5LWNsYXVzZQogICAgICAgIGlmICggJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gPX4gbXsgXEEgY1suXSB9eG1zICkgewogICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXMsICdjJzsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicKICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgb25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAjIGZvdW5kIGFuIGVycm9yCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICAjIGNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZSBnaXZlbiBXb3JrT3JkZXJTdGF0ZUlEcyBhcmUgdmFsaWQKICAgIHJldHVybiBpZiAhJFNlbGYtPldvcmtPcmRlclN0YXRlSURzQ2hlY2soIFdvcmtPcmRlclN0YXRlSURzID0+ICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEc30gKTsKCiAgICAjIGxvb2sgdXAgYW5kIHRodXMgY2hlY2sgdGhlIFN0YXRlcwogICAgZm9yIG15ICRXb3JrT3JkZXJTdGF0ZSAoIEB7ICRQYXJhbXtXb3JrT3JkZXJTdGF0ZXN9IH0gKSB7CgogICAgICAgICMgbG9vayB1cCB0aGUgSUQgZm9yIHRoZSBuYW1lCiAgICAgICAgbXkgJFdvcmtPcmRlclN0YXRlSUQgPSAkU2VsZi0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICRXb3JrT3JkZXJTdGF0ZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIElEIHdhcyBmb3VuZCwgd2hldGhlciB0aGUgbmFtZSBleGlzdHMKICAgICAgICBpZiAoICEkV29ya09yZGVyU3RhdGVJRCApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSB3b3Jrb3JkZXIgc3RhdGUgJFdvcmtPcmRlclN0YXRlIGlzIG5vdCBrbm93biEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9IH0sICRXb3JrT3JkZXJTdGF0ZUlEOwogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gV29ya09yZGVyVHlwZUlEcyBhcmUgYWxsIHZhbGlkCiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tXb3JrT3JkZXJUeXBlSURzKCBXb3JrT3JkZXJUeXBlSURzID0+ICRQYXJhbXtXb3JrT3JkZXJUeXBlSURzfSApOwoKICAgICMgbG9vayB1cCBhbmQgdGh1cyBjaGVjayB0aGUgV29ya09yZGVyVHlwZXMKICAgIGZvciBteSAkVHlwZSAoIEB7ICRQYXJhbXtXb3JrT3JkZXJUeXBlc30gfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIElEIGZvciB0aGUgbmFtZQogICAgICAgIG15ICRUeXBlSUQgPSAkU2VsZi0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyVHlwZSA9PiAkVHlwZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIElEIHdhcyBmb3VuZCwgd2hldGhlciB0aGUgbmFtZSBleGlzdHMKICAgICAgICBpZiAoICEkVHlwZUlEICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHdvcmtvcmRlciB0eXBlICckVHlwZScgaXMgbm90IGtub3duISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte1dvcmtPcmRlclR5cGVJRHN9IH0sICRUeXBlSUQ7CiAgICB9CgogICAgIyBhZGQgc3RyaW5nIHBhcmFtcyB0byB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSAlU3RyaW5nUGFyYW1zID0gKAoKICAgICAgICAjIGluIHdvcmtvcmRlciB0YWJsZQogICAgICAgIFdvcmtPcmRlck51bWJlciA9PiAnd28ud29ya29yZGVyX251bWJlcicsCiAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICd3by50aXRsZScsCiAgICAgICAgSW5zdHJ1Y3Rpb24gICAgID0+ICd3by5pbnN0cnVjdGlvbl9wbGFpbicsCiAgICAgICAgUmVwb3J0ICAgICAgICAgID0+ICd3by5yZXBvcnRfcGxhaW4nLAoKICAgICAgICAjIGluIGNoYW5nZSB0YWJsZQogICAgICAgIENoYW5nZU51bWJlciAgICAgICAgPT4gJ2MuY2hhbmdlX251bWJlcicsCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICA9PiAnYy50aXRsZScsCiAgICAgICAgQ2hhbmdlRGVzY3JpcHRpb24gICA9PiAnYy5kZXNjcmlwdGlvbl9wbGFpbicsCiAgICAgICAgQ2hhbmdlSnVzdGlmaWNhdGlvbiA9PiAnYy5qdXN0aWZpY2F0aW9uX3BsYWluJywKICAgICk7CgogICAgIyBhZGQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyB0byAlU3RyaW5nUGFyYW1zCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKCBzb3J0IGtleXMgJVBhcmFtICkgewoKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICRBcmd1bWVudCAhfiBteyBcQSBXb3JrT3JkZXJGcmVlICggVGV4dCB8IEtleSApICggXGQrICkgXHogfXhtczsKCiAgICAgICAgbXkgJFR5cGUgICA9ICQxOwogICAgICAgIG15ICROdW1iZXIgPSAkMjsKCiAgICAgICAgIyBzZXQgdGhlIHRhYmxlIGFsaWFzIGFuZCBjb2x1bW4KICAgICAgICBpZiAoICRUeXBlIGVxICdUZXh0JyApIHsKCiAgICAgICAgICAgICMgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkCiAgICAgICAgICAgICRTdHJpbmdQYXJhbXN7JEFyZ3VtZW50fSA9ICd3ZnQnIC4gJE51bWJlciAuICcuZmllbGRfdmFsdWUnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdLZXknICkgewoKICAgICAgICAgICAgIyB3b3Jrb3JkZXIgZnJlZWtleSBmaWVsZAogICAgICAgICAgICAkU3RyaW5nUGFyYW1zeyRBcmd1bWVudH0gPSAnd2ZrJyAuICROdW1iZXIgLiAnLmZpZWxkX3ZhbHVlJzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgc3RyaW5nIHBhcmFtcyB0byBzcWwtd2hlcmUtYXJyYXkKICAgIFNUUklOR1BBUkFNOgogICAgZm9yIG15ICRTdHJpbmdQYXJhbSAoIGtleXMgJVN0cmluZ1BhcmFtcyApIHsKCiAgICAgICAgIyBjaGVjayBzdHJpbmcgcGFyYW1zIGZvciB1c2VmdWwgdmFsdWVzLCB0aGUgc3RyaW5nICcwJyBpcyBhbGxvd2VkCiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAhZXhpc3RzICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWRlZmluZWQgJFBhcmFteyRTdHJpbmdQYXJhbX07CiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAkUGFyYW17JFN0cmluZ1BhcmFtfSBlcSAnJzsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFN0cmluZ1BhcmFtfSApOwoKICAgICAgICAjIHdpbGRjYXJkcyBhcmUgdXNlZAogICAgICAgIGlmICggJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKCiAgICAgICAgICAgICMgUXVvdGUKICAgICAgICAgICAgJFBhcmFteyRTdHJpbmdQYXJhbX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskU3RyaW5nUGFyYW19LCAnTGlrZScgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSAqIHdpdGggJQogICAgICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9fiBzeyBcKisgfXslfXhtc2c7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2Ugc3RyaW5nIHBhcmFtcyB3aGljaCBjb250YWluIG9ubHkgJQogICAgICAgICAgICBuZXh0IFNUUklOR1BBUkFNIGlmICRQYXJhbXskU3RyaW5nUGFyYW19ID1+IG17IFxBICUqIFx6IH14bXM7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUigkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0pIExJS0UgTE9XRVIoJyRQYXJhbXskU3RyaW5nUGFyYW19JykiOwogICAgICAgIH0KCiAgICAgICAgIyBubyB3aWxkY2FyZHMgYXJlIHVzZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICAgICAiTE9XRVIoJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19KSA9IExPV0VSKCckUGFyYW17JFN0cmluZ1BhcmFtfScpIjsKICAgICAgICB9CgogICAgICAgICMgam9pbiB0aGUgY2hhbmdlIHRhYmxlLCB3aGVuIGl0IGlzIG5lZWRlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICAgICAgaWYgKCAkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0gPX4gbXsgXEEgY1suXSB9eG1zICkgewogICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXMsICdjJzsKICAgICAgICB9CgogICAgICAgICMgYWRkIGZpZWxkX2lkIHRvIHdoZXJlIGNsYXVzZSBmb3Igd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgICAgIGlmICggJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19ID1+IG17IFxBICggKCB3ZnQgfCB3ZmsgKSAoIFxkKyApICkgfXhtcyApIHsKCiAgICAgICAgICAgIG15ICRUYWJsZUFsaWFzID0gJDE7CiAgICAgICAgICAgIG15ICROdW1iZXIgICAgID0gJDM7CgogICAgICAgICAgICAjIGFkZCB0aGUgZmllbGQgaWQgdG8gdGhlIHdoZXJlIGNsYXVzZQogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFRhYmxlQWxpYXMgLiAnLmZpZWxkX2lkID0gJyAuICROdW1iZXI7CgogICAgICAgICAgICAjIHRoZSBjaGFuZ2Vfd29fZnJlZXRleHQgYW5kIGNoYW5nZV93b19mcmVla2V5IHRhYmxlcyBuZWVkIHRvIGJlIGpvaW5lZCwKICAgICAgICAgICAgIyB3aGVuIHRoZXkgb2NjdXIgaW4gdGhlIFdIRVJFIGNsYXVzZQogICAgICAgICAgICBwdXNoIEBJbm5lckpvaW5UYWJsZXNXb3JrT3JkZXJGcmVlVGV4dCwgJFRhYmxlQWxpYXM7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGFycmF5IHBhcmFtcwogICAgbXkgJUFycmF5UGFyYW1zID0gKAogICAgICAgIENoYW5nZUlEcyAgICAgICAgID0+ICd3by5jaGFuZ2VfaWQnLAogICAgICAgIFdvcmtPcmRlclN0YXRlSURzID0+ICd3by53b3Jrb3JkZXJfc3RhdGVfaWQnLAogICAgICAgIFdvcmtPcmRlclR5cGVJRHMgID0+ICd3by53b3Jrb3JkZXJfdHlwZV9pZCcsCiAgICAgICAgV29ya09yZGVyQWdlbnRJRHMgPT4gJ3dvLndvcmtvcmRlcl9hZ2VudF9pZCcsCiAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgPT4gJ3dvLmNyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgPT4gJ3dvLmNoYW5nZV9ieScsCiAgICApOwoKICAgICMgYWRkIGFycmF5IHBhcmFtcyB0byBzcWwtd2hlcmUtYXJyYXkKICAgIEFSUkFZUEFSQU06CiAgICBmb3IgbXkgJEFycmF5UGFyYW0gKCBrZXlzICVBcnJheVBhcmFtcyApIHsKCiAgICAgICAgIyBpZ25vcmUgZW1wdHkgbGlzdHMKICAgICAgICBuZXh0IEFSUkFZUEFSQU0gaWYgIUB7ICRQYXJhbXskQXJyYXlQYXJhbX0gfTsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH0gKSB7CiAgICAgICAgICAgICRPbmVQYXJhbSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkT25lUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgc3RyaW5nCiAgICAgICAgbXkgJEluU3RyaW5nID0gam9pbiAnLCAnLCBAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAiJEFycmF5UGFyYW1zeyRBcnJheVBhcmFtfSBJTiAoJEluU3RyaW5nKSI7CiAgICB9CgogICAgIyBjaGVjayB0aGUgdGltZSBwYXJhbXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBXSEVSRSBjbGF1c2Ugb2YgdGhlIFNFTEVDVC1TdGF0ZW1lbnQKICAgIG15ICVUaW1lUGFyYW1zID0gKAogICAgICAgIENyZWF0ZVRpbWVOZXdlckRhdGUgICAgICAgPT4gJ3dvLmNyZWF0ZV90aW1lID49JywKICAgICAgICBDcmVhdGVUaW1lT2xkZXJEYXRlICAgICAgID0+ICd3by5jcmVhdGVfdGltZSA8PScsCiAgICAgICAgQ2hhbmdlVGltZU5ld2VyRGF0ZSAgICAgICA9PiAnd28uY2hhbmdlX3RpbWUgPj0nLAogICAgICAgIENoYW5nZVRpbWVPbGRlckRhdGUgICAgICAgPT4gJ3dvLmNoYW5nZV90aW1lIDw9JywKICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICd3by5wbGFubmVkX3N0YXJ0X3RpbWUgPj0nLAogICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJ3dvLnBsYW5uZWRfc3RhcnRfdGltZSA8PScsCiAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgICA9PiAnd28ucGxhbm5lZF9lbmRfdGltZSA+PScsCiAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgICA9PiAnd28ucGxhbm5lZF9lbmRfdGltZSA8PScsCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlICA9PiAnd28uYWN0dWFsX3N0YXJ0X3RpbWUgPj0nLAogICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSAgPT4gJ3dvLmFjdHVhbF9zdGFydF90aW1lIDw9JywKICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlICAgID0+ICd3by5hY3R1YWxfZW5kX3RpbWUgPj0nLAogICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgICAgPT4gJ3dvLmFjdHVhbF9lbmRfdGltZSA8PScsCiAgICApOwogICAgVElNRVBBUkFNOgogICAgZm9yIG15ICRUaW1lUGFyYW0gKCBrZXlzICVUaW1lUGFyYW1zICkgewoKICAgICAgICBuZXh0IFRJTUVQQVJBTSBpZiAhJFBhcmFteyRUaW1lUGFyYW19OwoKICAgICAgICBpZiAoICRQYXJhbXskVGltZVBhcmFtfSAhfiBteyBcQSBcZFxkXGRcZC1cZFxkLVxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgXHogfXhtcyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbWV0ZXIgJFRpbWVQYXJhbSBoYXMgYW4gaW52YWxpZCBkYXRlIGZvcm1hdCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFteyRUaW1lUGFyYW19ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFRpbWVQYXJhbX0gKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICIkVGltZVBhcmFtc3skVGltZVBhcmFtfSAnJFBhcmFteyRUaW1lUGFyYW19JyI7CiAgICB9CgogICAgIyBkZWxldGUgdGhlIE9yZGVyQnkgcGFyYW1ldGVyIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRQYXJhbXtPcmRlckJ5fSA9IFtdOwogICAgfQoKICAgICMgYXNzZW1ibGUgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgbXkgQFNRTE9yZGVyQnk7CiAgICBteSAkQ291bnQgPSAwOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgICMgc2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbgogICAgICAgIG15ICREaXJlY3Rpb24gPSAnREVTQyc7CgogICAgICAgICMgYWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24KICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdBU0MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0RFU0MnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBTUUwKICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gJERpcmVjdGlvbiI7CiAgICB9CiAgICBjb250aW51ZSB7CiAgICAgICAgJENvdW50Kys7CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAjIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkCiAgICBpZiAoICFncmVwIHsgJF8gZXEgJ1dvcmtPcmRlcklEJyB9ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSApIHsKICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJE9yZGVyQnlUYWJsZXtXb3JrT3JkZXJJRH0gREVTQyI7CiAgICB9CgogICAgIyBhc3NlbWJsZSB0aGUgU1FMIHF1ZXJ5CiAgICBteSAkU1FMID0gJ1NFTEVDVCB3by5pZCBGUk9NIGNoYW5nZV93b3Jrb3JkZXIgd28gJzsKCiAgICAjIG1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICMgVGhlcmUgaXMgbm8gJ0dST1VQIEJZJyBTUUwtY2xhdXNlLCB0aGVyZWZvcmUgQ09VTlQoYy5pZCkgYWx3YXlzIGdpdmUgdGhlIHdhbnRlZCBjb3VudAogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTCAgICAgICAgPSAnU0VMRUNUIENPVU5UKHdvLmlkKSBGUk9NIGNoYW5nZV93b3Jrb3JkZXIgd28gJzsKICAgICAgICBAU1FMT3JkZXJCeSA9ICgpOwogICAgfQoKICAgICMgYWRkIHRoZSBqb2lucwogICAgbXkgJUxvbmdUYWJsZU5hbWUgPSAoCiAgICAgICAgYyA9PiAnY2hhbmdlX2l0ZW0nLAogICAgKTsKICAgIG15ICVUYWJsZVNlZW47CgogICAgSU5ORVJfSk9JTl9UQUJMRToKICAgIGZvciBteSAkVGFibGUgKEBJbm5lckpvaW5UYWJsZXMpIHsKCiAgICAgICAgIyBkbyBub3Qgam9pbiBhIHRhYmxlIHR3aWNlCiAgICAgICAgbmV4dCBJTk5FUl9KT0lOX1RBQkxFIGlmICRUYWJsZVNlZW57JFRhYmxlfTsKCiAgICAgICAgJFRhYmxlU2VlbnskVGFibGV9ID0gMTsKCiAgICAgICAgaWYgKCAhJExvbmdUYWJsZU5hbWV7JFRhYmxlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuY291bnRlcmVkIGludmFsaWQgaW5uZXIgam9pbiB0YWJsZSAnJFRhYmxlJyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkU1FMIC49ICJJTk5FUiBKT0lOICRMb25nVGFibGVOYW1leyRUYWJsZX0gJFRhYmxlIE9OICRUYWJsZS5pZCA9IHdvLmNoYW5nZV9pZCAiOwogICAgfQoKICAgIElOTkVSX0pPSU5fVEFCTEVfV09SS09SREVSX0ZSRUVURVhUOgogICAgZm9yIG15ICRUYWJsZSAoQElubmVySm9pblRhYmxlc1dvcmtPcmRlckZyZWVUZXh0KSB7CgogICAgICAgICMgd29ya29yZGVyIGZyZWV0ZXh0CiAgICAgICAgaWYgKCAkVGFibGUgPX4gbXsgXEEgd2Z0IH14bXMgKSB7CiAgICAgICAgICAgICRTUUwgLj0gIklOTkVSIEpPSU4gY2hhbmdlX3dvX2ZyZWV0ZXh0ICRUYWJsZSBPTiAkVGFibGUud29ya29yZGVyX2lkID0gd28uaWQgIjsKICAgICAgICB9CgogICAgICAgICMgd29ya29yZGVyIGZyZWVrZXkKICAgICAgICBlbHNpZiAoICRUYWJsZSA9fiBteyBcQSB3ZmsgfXhtcyApIHsKICAgICAgICAgICAgJFNRTCAuPSAiSU5ORVIgSk9JTiBjaGFuZ2Vfd29fZnJlZWtleSAkVGFibGUgT04gJFRhYmxlLndvcmtvcmRlcl9pZCA9IHdvLmlkICI7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHRoZSBXSEVSRSBjbGF1c2UKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICAkU1FMIC49ICdXSEVSRSAnOwogICAgICAgICRTUUwgLj0gam9pbiAnIEFORCAnLCBtYXAgeyIoICRfICkifSBAU1FMV2hlcmU7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBhZGQgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgJFNRTCAuPSAnT1JERVIgQlkgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBpZ25vcmUgdGhlIHBhcmFtZXRlciAnTGltaXQnIHdoZW4gcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFBhcmFte0xpbWl0fSA9IDE7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIHJldHVybiB0aGUgY291bnQgYXMgc2NhbGFyCiAgICByZXR1cm4gJElEc1swXSBpZiAkUmVzdWx0IGVxICdDT1VOVCc7CgogICAgcmV0dXJuIFxASURzOwp9Cgo9aXRlbSBXb3JrT3JkZXJEZWxldGUoKQoKRGVsZXRlIGEgd29ya29yZGVyLgoKVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCBsaW5rcyBhbmQgYXR0YWNobWVudHMgdG8gdGhlIHdvcmtvcmRlcgp3aXRoIHRoZSBwYXNzZWQgd29ya29yZGVyIGlkLgpBZnRlciB0aGF0IHRoZSB3b3Jrb3JkZXIgaXMgcmVtb3ZlZC4KCiAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmlnZ2VyIFdvcmtPcmRlckRlbGV0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyRGVsZXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgb2xkIHdvcmtvcmRlciBkYXRhIHRvIGJlIGdpdmVuIHRvIHBvc3QgZXZlbnQgaGFuZGxlcgogICAgbXkgJFdvcmtPcmRlckRhdGEgPSAkU2VsZi0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBsaW5rcyB0byB0aGlzIHdvcmtvcmRlcgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlQWxsKAogICAgICAgIE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIGF0dGFjaG1lbnRzIGFuZCBkZWxldGUgdGhlbQogICAgbXkgJUF0dGFjaG1lbnRzID0gJFNlbGYtPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICApOwogICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJUF0dGFjaG1lbnRzICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgIEZpbGVJRCAgICAgID0+ICRGaWxlSUQsCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRXb3JrT3JkZXJEYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIHRoZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICByZXR1cm4gaWYgISRTZWxmLT5fV29ya09yZGVyRnJlZVRleHREZWxldGUoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgdGhlIHdvcmtvcmRlcgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hhbmdlX3dvcmtvcmRlciBXSEVSRSBpZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtXb3JrT3JkZXJJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgIGZvciBteSAkS2V5ICgKICAgICAgICAnV29ya09yZGVyR2V0OjpJRDo6JyAuICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgJ1dvcmtPcmRlckxpc3Q6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQ6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ1dvcmtPcmRlckNoYW5nZVRpbWVHZXQ6OkNoYW5nZUlEOjonIC4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ0NoYW5nZUdldDo6SUQ6OicgLiAkV29ya09yZGVyRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICApCiAgICB7CgogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgS2V5ICA9PiAkS2V5LAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmlnZ2VyIFdvcmtPcmRlckRlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1dvcmtPcmRlckRlbGV0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgT2xkV29ya09yZGVyRGF0YSA9PiAkV29ya09yZGVyRGF0YSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gV29ya09yZGVyQ2hhbmdlVGltZUdldCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBQbGFubmVkU3RhcnRUaW1lIHwgUGxhbm5lZEVuZFRpbWUgfCBBY3R1YWxTdGFydFRpbWUgfCBBY3R1YWxFbmRUaW1lCm9mIGEgY2hhbmdlLCB3aGljaCB3b3VsZCBiZSB0aGUgcmVzcGVjdGl2ZSB0aW1lIG9mIHRoZSBlYXJsaWVzdCBzdGFydGluZwp3b3Jrb3JkZXIgKGZvciBzdGFydCB0aW1lcykgb3IgdGhlIGxhdGVzdCBlbmRpbmcgd29ya29yZGVyIChmb3IgZW5kIHRpbWVzKS4KCkZvciBQbGFubmVkU3RhcnRUaW1lIHwgUGxhbm5lZEVuZFRpbWUgfCBBY3R1YWxFbmRUaW1lIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZAppZiBhbnkgb2YgdGhlIHdvcmtvcmRlcnMgb2YgYSBjaGFuZ2UgaGFzIHRoZSByZXNwZWN0aXZlIHRpbWUgbm90IGRlZmluZWQuCgpUaGUgQWN0dWFsU3RhcnRUaW1lIGlzIGRlZmluZWQgd2hlbiBhbnkgb2YgdGhlIHdvcmtvcmRlcnMgb2YgYSBjaGFuZ2UgaGFzCmEgZGVmaW5lZCBBY3R1YWxTdGFydFRpbWUuCgpSZXR1cm4KCiAgICAkVGltZXtQbGFubmVkU3RhcnRUaW1lfQogICAgJFRpbWV7UGxhbm5lZEVuZFRpbWV9CiAgICAkVGltZXtBY3R1YWxTdGFydFRpbWV9CiAgICAkVGltZXtBY3R1YWxFbmRUaW1lfQoKICAgIG15ICRUaW1lUmVmID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQ2hhbmdlVGltZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAgICAgIyBUT0RPOiAoZGVjaWRlIHRoaXMgbGF0ZXIhKQogICAgICAgIE1heWJlIGFkZCB0aGlzIG5ldyBhdHRyaWJ1dGU6CgogICAgICAgICMgVGhlc2UgYXJlIFdvcmtPcmRlclR5cGVzIChUeXBlcywgbm90IFN0YXRlcyEpCiAgICAgICAgIyB3aGljaCB3b3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBjYWxjdWxhdGlvbgogICAgICAgICMgb2YgdGhlIGNoYW5nZSBzdGFydCB0aW1lLgoKICAgICAgICBFeGNsdWRlV29ya09yZGVyVHlwZXMgPT4gWyAnYXBwcm92YWwnLCAncGlyJyBdLCAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgKTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbml0aWFsaXplIHRoZSByZXR1cm4gdGltZSBoYXNoCiAgICBteSAlVGltZVJldHVybjsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnV29ya09yZGVyQ2hhbmdlVGltZUdldDo6Q2hhbmdlSUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9OwogICAgbXkgJENhY2hlICAgID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIGlmICgkQ2FjaGUpIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGNhY2hlCiAgICAgICAgJVRpbWVSZXR1cm4gPSAleyRDYWNoZX07CiAgICB9CgogICAgZWxzZSB7CgogICAgICAgICMgYnVpbGQgc3FsLCB1c2luZyBtaW4gYW5kIG1heCBmdW5jdGlvbnMKICAgICAgICBteSAkU1FMID0gJ1NFTEVDVCAnCiAgICAgICAgICAgIC4gJ01JTiggcGxhbm5lZF9zdGFydF90aW1lICksICcKICAgICAgICAgICAgLiAnTUFYKCBwbGFubmVkX2VuZF90aW1lICksICcKICAgICAgICAgICAgLiAnTUlOKCBhY3R1YWxfc3RhcnRfdGltZSApLCAnCiAgICAgICAgICAgIC4gJ01BWCggYWN0dWFsX2VuZF90aW1lICkgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV93b3Jrb3JkZXIgJwogICAgICAgICAgICAuICdXSEVSRSBjaGFuZ2VfaWQgPSA/JzsKCiAgICAgICAgIyByZXRyaWV2ZSB0aGUgcmVxdWVzdGVkIHRpbWUKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFRpbWVSZXR1cm57UGxhbm5lZFN0YXJ0VGltZX0gPSAkUm93WzBdIHx8ICcnOwogICAgICAgICAgICAkVGltZVJldHVybntQbGFubmVkRW5kVGltZX0gICA9ICRSb3dbMV0gfHwgJyc7CiAgICAgICAgICAgICRUaW1lUmV0dXJue0FjdHVhbFN0YXJ0VGltZX0gID0gJFJvd1syXSB8fCAnJzsKICAgICAgICAgICAgJFRpbWVSZXR1cm57QWN0dWFsRW5kVGltZX0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgVElNRUZJRUxEOgogICAgICAgIGZvciBteSAkVGltZSAoIGtleXMgJVRpbWVSZXR1cm4gKSB7CgogICAgICAgICAgICBuZXh0IFRJTUVGSUVMRCBpZiAhJFRpbWVSZXR1cm57JFRpbWV9OwoKICAgICAgICAgICAgIyBjbGVhbnVwIHRpbWUgc3RhbXBzIChzb21lIGRhdGFiYXNlcyBhcmUgdXNpbmcgZS4gZy4gMjAwOC0wMi0yNSAyMjowMzowMC4wMDAwMDApCiAgICAgICAgICAgICRUaW1lUmV0dXJueyRUaW1lfQogICAgICAgICAgICAgICAgPX4gc3sgXEEgKCBcZFxkXGRcZCAtIFxkXGQgLSBcZFxkIFxzIFxkXGQ6XGRcZDpcZFxkICkgXC4gLis/IFx6IH17JDF9eG1zOwoKICAgICAgICAgICAgIyBzZXQgZW1wdHkgc3RyaW5nIGlmIHRoZSBkZWZhdWx0IHRpbWUgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJFRpbWVSZXR1cm57JFRpbWV9IGVxICc5OTk5LTAxLTAxIDAwOjAwOjAwJyApIHsKICAgICAgICAgICAgICAgICRUaW1lUmV0dXJueyRUaW1lfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjYWNoZSBvbmx5IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGltZXMgaXMgZGVmaW5lZAogICAgICAgIGlmICgKICAgICAgICAgICAgJFRpbWVSZXR1cm57UGxhbm5lZFN0YXJ0VGltZX0KICAgICAgICAgICAgfHwgJFRpbWVSZXR1cm57UGxhbm5lZEVuZFRpbWV9CiAgICAgICAgICAgIHx8ICRUaW1lUmV0dXJue0FjdHVhbFN0YXJ0VGltZX0KICAgICAgICAgICAgfHwgJFRpbWVSZXR1cm57QWN0dWFsRW5kVGltZX0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXCVUaW1lUmV0dXJuLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgY2hhbmdlIGhhcyB3b3Jrb3JkZXJzIHdpdGggbm90IHlldCBkZWZpbmVkIHBsYW5uZWRfc3RhcnRfdGltZSBlbnRyaWVzCiAgICBpZiAoICRUaW1lUmV0dXJue1BsYW5uZWRTdGFydFRpbWV9ICkgewoKICAgICAgICAjIGJ1aWxkIFNRTAogICAgICAgIG15ICRTUUwgPSAnU0VMRUNUIGNvdW50KCopICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2Vfd29ya29yZGVyICcKICAgICAgICAgICAgLiAiV0hFUkUgcGxhbm5lZF9zdGFydF90aW1lID0gJzk5OTktMDEtMDEgMDA6MDA6MDAnICIKICAgICAgICAgICAgLiAnQU5EIGNoYW5nZV9pZCA9ID8nOwoKICAgICAgICAjIHJldHJpZXZlIG51bWJlciBvZiBub3QgZGVmaW5lZCBlbnRyaWVzCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NoYW5nZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRDb3VudDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ291bnQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyByZXNldCBQbGFubmVkU3RhcnRUaW1lCiAgICAgICAgaWYgKCRDb3VudCkgewogICAgICAgICAgICAkVGltZVJldHVybntQbGFubmVkU3RhcnRUaW1lfSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVUaW1lUmV0dXJuOwp9Cgo9aXRlbSBXb3JrT3JkZXJTdGF0ZUxvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIHdvcmtvcmRlciBzdGF0ZS4gSWYgYSB3b3Jrb3JkZXIgc3RhdGUgaWQgaXMgZ2l2ZW4sCml0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHdvcmtvcmRlciBzdGF0ZS4gSWYgYSB3b3Jrb3JkZXIgc3RhdGUgbmFtZSBpcyBnaXZlbiwKdGhlIGFwcHJvcHJpYXRlIGlkIGlzIHJldHVybmVkLgoKICAgIG15ICRXb3JrT3JkZXJTdGF0ZSA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gMTU3LAogICAgKTsKCiAgICBteSAkV29ya09yZGVyU3RhdGVJRCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICdyZWFkeScsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlclN0YXRlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBlaXRoZXIgV29ya09yZGVyU3RhdGVJRCBvciBXb3JrT3JkZXJTdGF0ZSBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9ICYmICEkUGFyYW17V29ya09yZGVyU3RhdGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJTdGF0ZUlEIG9yIFdvcmtPcmRlclN0YXRlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17V29ya09yZGVyU3RhdGVJRH0gJiYgJFBhcmFte1dvcmtPcmRlclN0YXRlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVyU3RhdGVJRCBPUiBXb3JrT3JkZXJTdGF0ZSAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIHdvcmtvcmRlciBzdGF0ZXMgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nCiAgICBteSAlU3RhdGVJRDJOYW1lID0gJXsKICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICAgICAgICAgKQogICAgICAgIH07CgogICAgIyBjaGVjayB0aGUgc3RhdGUgaGFzaAogICAgaWYgKCAhJVN0YXRlSUQyTmFtZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCByZXRyaWV2ZSB3b3Jrb3JkZXIgc3RhdGVzIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZy4nLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtXb3JrT3JkZXJTdGF0ZUlEfSApIHsKICAgICAgICByZXR1cm4gJFN0YXRlSUQyTmFtZXsgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXZlcnNlIGtleSAtIHZhbHVlIHBhaXJzIHRvIGhhdmUgdGhlIG5hbWUgYXMga2V5cwogICAgICAgIG15ICVTdGF0ZU5hbWUySUQgPSByZXZlcnNlICVTdGF0ZUlEMk5hbWU7CgogICAgICAgIHJldHVybiAkU3RhdGVOYW1lMklEeyAkUGFyYW17V29ya09yZGVyU3RhdGV9IH07CiAgICB9Cn0KCj1pdGVtIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHBvc3NpYmxlIHdvcmtvcmRlciBzdGF0ZXMuCklmIEM8V29ya09yZGVySUQ+IGlzIG9taXR0ZWQsIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHdvcmtvcmRlciBzdGF0ZXMgaXMgcmV0dXJuZWQuCklmIEM8V29ya09yZGVySUQ+IGlzIGdpdmVuLCB0aGUgbGlzdCBvZiBwb3NzaWJsZSBzdGF0ZXMgZm9yIHRoZSBnaXZlbgp3b3Jrb3JkZXIgaXMgcmV0dXJuZWQuCgogICAgbXkgJFdvcmtPcmRlclN0YXRlTGlzdCA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBvZiBoYXNocmVmcy4gVGhlIGVsZW1lbnQgJ0tleScgaXMgdGhlbgp0aGUgU3RhdGVJRCBhbmQgdGhlIGVsZW1lbnQgJ1ZhbHVlJyBpcyB0aGUgbmFtZSBvZiB0aGUgc3RhdGUuIFRoZSBhcnJheSBlbGVtZW50cwphcmUgc29ydGVkIGJ5IHN0YXRlIGlkLgoKICAgIG15ICRXb3JrT3JkZXJTdGF0ZUxpc3QgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxNTYsCiAgICAgICAgICAgIFZhbHVlID0+ICdhY2NlcHRlZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+IDE1NywKICAgICAgICAgICAgVmFsdWUgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJQb3NzaWJsZVN0YXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciBzdGF0ZSBsaXN0CiAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICkgfHwge307CgogICAgIyB0byBzdG9yZSBhbiBhcnJheSBvZiBoYXNoIHJlZnMKICAgIG15IEBBcnJheUhhc2hSZWY7CgogICAgIyBpZiBXb3JrT3JkZXJJRCBpcyBnaXZlbiwgb25seSB1c2UgcG9zc2libGUgbmV4dCBzdGF0ZXMgYXMgZGVmaW5lZCBpbiBzdGF0ZSBtYWNoaW5lCiAgICBpZiAoICRQYXJhbXtXb3JrT3JkZXJJRH0gKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZm9yIHN0YXRlIGxvY2sKICAgICAgICBteSAkU3RhdGVMb2NrID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25NYXRjaFN0YXRlTG9jaygKICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgIFNlbGVjdG9yICAgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICA9PiAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgYXMgZGVmYXVsdCBzdGF0ZSBjdXJyZW50IHN0YXRlIGFuZCBhbGwgcG9zc2libGUgZW5kIHN0YXRlcwogICAgICAgIG15ICRFbmRTdGF0ZUlEc1JlZiA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKAogICAgICAgICAgICBTdGF0ZUlEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgKSB8fCBbXTsKICAgICAgICBteSBATmV4dFN0YXRlSURzID0gc29ydCAoIEB7JEVuZFN0YXRlSURzUmVmfSwgJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9ICk7CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5leHQgc3RhdGVzIGlmIG5vIHN0YXRlIGxvY2sKICAgICAgICBpZiAoICEkU3RhdGVMb2NrICkgewoKICAgICAgICAgICAgIyBnZXQgdGhlIHBvc3NpYmxlIG5leHQgc3RhdGUgaWRzCiAgICAgICAgICAgIG15ICROZXh0U3RhdGVJRHNSZWYgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgICAgICkgfHwgW107CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IHdvcmtvcmRlciBzdGF0ZSBpZCB0byBsaXN0CiAgICAgICAgICAgIEBOZXh0U3RhdGVJRHMgPSBzb3J0ICggQHskTmV4dFN0YXRlSURzUmVmfSwgJFdvcmtPcmRlci0+e1dvcmtPcmRlclN0YXRlSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGFzc2VtYmxlIHRoZSBhcnJheSBvZiBoYXNoIHJlZnMgd2l0aCBvbmx5IHBvc3NpYmxlIG5leHQgc3RhdGVzCiAgICAgICAgU1RBVEVJRDoKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKEBOZXh0U3RhdGVJRHMpIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgaWQKICAgICAgICAgICAgbmV4dCBTVEFURUlEIGlmICEkU3RhdGVJRDsKCiAgICAgICAgICAgICMgc3RvcmUgaWQgYW5kIG5hbWUgaW4gdGhlIGFycmF5CiAgICAgICAgICAgIHB1c2ggQEFycmF5SGFzaFJlZiwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU3RhdGVMaXN0LT57JFN0YXRlSUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmCiAgICB9CgogICAgIyBhc3NlbWJsZSB0aGUgYXJyYXkgb2YgaGFzaCByZWZzIHdpdGggYWxsIG5leHQgc3RhdGVzCiAgICBmb3IgbXkgJFN0YXRlSUQgKCBzb3J0IGtleXMgJXskU3RhdGVMaXN0fSApIHsKICAgICAgICBwdXNoIEBBcnJheUhhc2hSZWYsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgIFZhbHVlID0+ICRTdGF0ZUxpc3QtPnskU3RhdGVJRH0sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gXEBBcnJheUhhc2hSZWY7Cn0KCj1pdGVtIFdvcmtPcmRlclR5cGVMb29rdXAoKQoKVGhpcyBtZXRob2QgZG9lcyBhIGxvb2t1cCBmb3IgYSB3b3Jrb3JkZXIgdHlwZS4gSWYgYSB3b3Jrb3JkZXIgdHlwZSBpZCBpcyBnaXZlbiwKaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd29ya29yZGVyIHR5cGUuIElmIGEgd29ya29yZGVyIHR5cGUgbmFtZSBpcyBnaXZlbiwKdGhlIGFwcHJvcHJpYXRlIGlkIGlzIHJldHVybmVkLgoKICAgIG15ICRXb3JrT3JkZXJUeXBlID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICBXb3JrT3JkZXJUeXBlSUQgPT4gMTU3LAogICAgKTsKCiAgICBteSAkV29ya09yZGVyVHlwZUlEID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICBXb3JrT3JkZXJUeXBlID0+ICdyZWFkeScsCiAgICApOwoKPWN1dAoKc3ViIFdvcmtPcmRlclR5cGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGVpdGhlciBXb3JrT3JkZXJUeXBlSUQgb3IgV29ya09yZGVyVHlwZSBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gJiYgISRQYXJhbXtXb3JrT3JkZXJUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVyVHlwZUlEIG9yIFdvcmtPcmRlclR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9ICYmICRQYXJhbXtXb3JrT3JkZXJUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVyVHlwZUlEIE9SIFdvcmtPcmRlclR5cGUgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlciB0eXBlIGZyb20gZ2VuZXJhbCBjYXRhbG9nCiAgICAjIG1hcHBpbmcgb2YgdGhlIGlkIHRvIHRoZSBuYW1lCiAgICBteSAlV29ya09yZGVyVHlwZSA9ICV7CiAgICAgICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpUeXBlJywKICAgICAgICAgICAgKQogICAgICAgIH07CgogICAgIyBjaGVjayB0aGUgd29ya29yZGVyIHR5cGVzIGhhc2gKICAgIGlmICggISVXb3JrT3JkZXJUeXBlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IHJldHJpZXZlIHdvcmtvcmRlciB0eXBlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cuJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17V29ya09yZGVyVHlwZUlEfSApIHsKICAgICAgICByZXR1cm4gJFdvcmtPcmRlclR5cGV7ICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXZlcnNlIGtleSAtIHZhbHVlIHBhaXJzIHRvIGhhdmUgdGhlIG5hbWUgYXMga2V5cwogICAgICAgIG15ICVSZXZlcnNlZFdvcmtPcmRlclR5cGUgPSByZXZlcnNlICVXb3JrT3JkZXJUeXBlOwoKICAgICAgICByZXR1cm4gJFJldmVyc2VkV29ya09yZGVyVHlwZXsgJFBhcmFte1dvcmtPcmRlclR5cGV9IH07CiAgICB9Cn0KCj1pdGVtIFdvcmtPcmRlclR5cGVMaXN0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIGFsbCB3b3Jrb3JkZXIgdHlwZXMuCgogICAgbXkgJFdvcmtPcmRlclR5cGVMaXN0ID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyVHlwZUxpc3QoCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICBEZWZhdWx0ICAgICA9PiAxLCAgICMgb3B0aW9uYWwgLSB0aGUgZGVmYXVsdCB0eXBlIGlzIHNlbGVjdGVkIHR5cGUgKGRlZmF1bHQ6IDApCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gMTIzLCAjIG9wdGlvbmFsIC0gdGhpcyBpZCBpcyBzZWxlY3RlZAogICAgKTsKClRoZSByZXR1cm4gdmFsdWUgaXMgYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgb2YgaGFzaHJlZnMuIFRoZSBFbGVtZW50ICdLZXknIGlzIHRoZW4KdGhlIFR5cGVJRCBhbmQgZGllIEVsZW1lbnQgJ1ZhbHVlJyBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZS4gVGhlIGFycmF5IGVsZW1lbnRzCmFyZSBzb3J0ZWQgYnkgdHlwZSBpZC4KCiAgICBteSAkV29ya09yZGVyVHlwZUxpc3QgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxNzEsCiAgICAgICAgICAgIFZhbHVlID0+ICd3b3Jrb3JkZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxNzIsCiAgICAgICAgICAgIFZhbHVlID0+ICdiYWNrb3V0JywKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJUeXBlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgd2hhdCB0eXBlIGlzIHNlbGVjdGVkCiAgICBteSAkU2VsZWN0ZWRJRCA9ICRQYXJhbXtTZWxlY3RlZH0gfHwgMDsKCiAgICBpZiAoICRQYXJhbXtEZWZhdWx0fSApIHsKCiAgICAgICAgIyBzZXQgY29uZmlnIG9wdGlvbgogICAgICAgIG15ICRDb25maWdPcHRpb24gPSAnSVRTTVdvcmtPcmRlcjo6VHlwZTo6RGVmYXVsdCc7CgogICAgICAgICMgZ2V0IGRlZmF1bHQgd29ya29yZGVyIHR5cGUgZnJvbSBjb25maWcKICAgICAgICBteSAkRGVmYXVsdFR5cGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkQ29uZmlnT3B0aW9uKTsKCiAgICAgICAgIyBjaGVjayBpZiBkZWZhdWx0IHR5cGUgZXhpc3RzIGluIGdlbmVyYWwgY2F0YWxvZwogICAgICAgIG15ICRJdGVtRGF0YVJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpUeXBlJywKICAgICAgICAgICAgTmFtZSAgPT4gJERlZmF1bHRUeXBlLAogICAgICAgICk7CgogICAgICAgICMgZXJyb3IgaGFuZGxpbmcgYmVjYXVzZSBvZiBpbnZhbGlkIGNvbmZpZyBzZXR0aW5nCiAgICAgICAgaWYgKCAhJEl0ZW1EYXRhUmVmIHx8IHJlZiAkSXRlbURhdGFSZWYgbmUgJ0hBU0gnIHx8ICEleyRJdGVtRGF0YVJlZn0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgZGVmYXVsdCBXb3JrT3JkZXJUeXBlICckRGVmYXVsdFR5cGUnICIKICAgICAgICAgICAgICAgICAgICAuICJpbiBzeXNjb25maWcgb3B0aW9uICckQ29uZmlnT3B0aW9uJyBpcyBpbnZhbGlkISBDaGVjayB0aGUgZ2VuZXJhbCBjYXRhbG9nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGRlZmF1bHQKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRJdGVtRGF0YVJlZi0+e0l0ZW1JRH07CiAgICB9CgogICAgIyBnZXQgd29ya29yZGVyIHR5cGUgbGlzdAogICAgbXkgJFdvcmtPcmRlclR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLAogICAgKSB8fCB7fTsKCiAgICAjIGFzc2VtYmxlIGEgYW4gYXJyYXkgb2YgaGFzaCByZWZzCiAgICBteSBAQXJyYXlIYXNoUmVmOwogICAgZm9yIG15ICRUeXBlSUQgKCBzb3J0IGtleXMgJXskV29ya09yZGVyVHlwZUxpc3R9ICkgewogICAgICAgIG15ICVTZWxlY3RlZEluZm87CgogICAgICAgIGlmICggJFNlbGVjdGVkSUQgJiYgJFNlbGVjdGVkSUQgPT0gJFR5cGVJRCApIHsKICAgICAgICAgICAgJFNlbGVjdGVkSW5mb3tTZWxlY3RlZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQXJyYXlIYXNoUmVmLCB7CiAgICAgICAgICAgIEtleSAgID0+ICRUeXBlSUQsCiAgICAgICAgICAgIFZhbHVlID0+ICRXb3JrT3JkZXJUeXBlTGlzdC0+eyRUeXBlSUR9LAogICAgICAgICAgICAlU2VsZWN0ZWRJbmZvLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIFxAQXJyYXlIYXNoUmVmOwp9Cgo9aXRlbSBQZXJtaXNzaW9uKCkKClJldHVybnMgd2hldGhlciB0aGUgYWdlbnQgQzxVc2VySUQ+IGhhcyBwZXJtaXNzaW9ucyBvZiB0aGUgdHlwZSBDPFR5cGU+Cm9uIHRoZSB3b3Jrb3JkZXIgQzxXb3JrT3JkZXJJRD4uIFRoZSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgb24gdG8KdGhlIHBlcm1pc3Npb24gbW9kdWxlcyB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcGVybWlzc2lvbiByZWdpc3RyeS4KVGhlIHN0YW5kYXJkIHBlcm1pc3Npb24gcmVnaXN0cnkgaXMgQjxJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uPiwgYnV0CnRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgcGFyYW1ldGVyIEM8UGVybWlzc2lvblJlZ2lzdHJ5Pi4KClRoZSBvcHRpb25hbCBvcHRpb24gQzxMb2dObz4gdHVybnMgb2ZmIGxvZ2dpbmcgd2hlbiBhY2Nlc3Mgd2FzIGRlbmllZC4KVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgbWV0aG9kIGlzIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBsaW5rIG9yIGFuIGFjdGlvbiBzaG91bGQgYmUgc2hvd24uCgogICAgbXkgJEFjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEyMywKICAgICAgICBUeXBlICAgICAgICAgICAgICAgPT4gJ3JvJywgICAjICdybycgYW5kICdydycgYXJlIHN1cHBvcnRlZAogICAgICAgIFdvcmtPcmRlcklEICAgICAgICA9PiA0NDQ0LAogICAgICAgIFBlcm1pc3Npb25SZWdpc3RyeSA9PiAnSVRTTVdvcmtPcmRlcjo6VGFrZVBlcm1pc3Npb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgd2l0aCBkZWZhdWx0ICdJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uJwogICAgICAgIENhY2hlZCAgICAgICAgICAgICA9PiAwLCAgICAgICMgb3B0aW9uYWwgd2l0aCBkZWZhdWx0IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXNzaW5nIHRoZSB2YWx1ZSAwIGlzIHVzZWZ1bCBpbiB0ZXN0IHNjcmlwdHMKICAgICAgICBMb2dObyAgICAgICAgICAgICAgPT4gMSwgICAgICAjIG9wdGlvbmFsLCB0dXJucyBvZmYgbG9nZ2luZyB3aGVuIGFjY2VzcyBpcyBkZW5pZWQKICAgICk7Cgo9Y3V0CgpzdWIgUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUeXBlIFVzZXJJRCBXb3JrT3JkZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgcGxhY2Ugd2hlcmUgdGhlIHBlcm1pc3Npb24gbW9kdWxlcyBhcmUgcmVnaXN0ZXJkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgcGFyYW1ldGVyCiAgICBteSAkUmVnaXN0cnkgPSAkUGFyYW17UGVybWlzc2lvblJlZ2lzdHJ5fSB8fCAnSVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbic7CgogICAgIyBydW4gdGhlIHJlbGV2YW50IHBlcm1pc3Npb24gbW9kdWxlcwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJFJlZ2lzdHJ5KSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1vZHVsZXMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkUmVnaXN0cnkpIH07CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJU1vZHVsZXMgKSB7CgogICAgICAgICAgICAjIGxvZyB0cnkgb2YgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUcnkgdG8gbG9hZCBtb2R1bGU6ICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG9iamVjdAogICAgICAgICAgICBteSAkTW9kdWxlT2JqZWN0ID0gJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICAgICAgRW5jb2RlT2JqZWN0ICAgID0+ICRTZWxmLT57RW5jb2RlT2JqZWN0fSwKICAgICAgICAgICAgICAgIExvZ09iamVjdCAgICAgICA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCiAgICAgICAgICAgICAgICBNYWluT2JqZWN0ICAgICAgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICAgICAgICAgIFRpbWVPYmplY3QgICAgICA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LAogICAgICAgICAgICAgICAgREJPYmplY3QgICAgICAgID0+ICRTZWxmLT57REJPYmplY3R9LAogICAgICAgICAgICAgICAgVXNlck9iamVjdCAgICAgID0+ICRTZWxmLT57VXNlck9iamVjdH0sCiAgICAgICAgICAgICAgICBHcm91cE9iamVjdCAgICAgPT4gJFNlbGYtPntHcm91cE9iamVjdH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFzayBmb3IgdGhlIG9waW5pb24gb2YgdGhlIFBlcm1pc3Npb24gbW9kdWxlCiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkTW9kdWxlT2JqZWN0LT5SdW4oJVBhcmFtKTsKCiAgICAgICAgICAgICMgR3JhbnQgb3ZlcmFsbCBwZXJtaXNzaW9uLAogICAgICAgICAgICAjIHdoZW4gdGhlIG1vZHVsZSBncmFudGVkIGEgc3VmZmljaWVudCBwZXJtaXNzaW9uLgogICAgICAgICAgICBpZiAoICRBY2Nlc3MgJiYgJE1vZHVsZXN7JE1vZHVsZX0tPntHcmFudGVkfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gPiAwICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiR3JhbnRlZCAnJFBhcmFte1R5cGV9JyBhY2Nlc3MgZm9yICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlVzZXJJRDogJFBhcmFte1VzZXJJRH0gb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiV29ya09yZGVySUQgJyRQYXJhbXtXb3JrT3JkZXJJRH0nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gInRocm91Z2ggJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9IChubyBtb3JlIGNoZWNrcykhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ3JhbnQgcGVybWlzc2lvbgogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgRGVueSBvdmVyYWxsIHBlcm1pc3Npb24sCiAgICAgICAgICAgICMgd2hlbiB0aGUgbW9kdWxlIGRlbmllZCBhIHJlcXVpcmVkIHBlcm1pc3Npb24uCiAgICAgICAgICAgIGlmICggISRBY2Nlc3MgJiYgJE1vZHVsZXN7JE1vZHVsZX0tPntSZXF1aXJlZH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkRlbmllZCAnJFBhcmFte1R5cGV9JyBhY2Nlc3MgZm9yICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIlVzZXJJRDogJFBhcmFte1VzZXJJRH0gb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiV29ya09yZGVySUQgJyRQYXJhbXtXb3JrT3JkZXJJRH0nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gImJlY2F1c2UgJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9IGlzIHJlcXVpcmVkISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGRlbnkgcGVybWlzc2lvbgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRGVueSBhY2Nlc3Mgd2hlbiBuZWl0aGVyIGEgJ0dyYW50ZWQnLUNoZWNrIG5vciBhICdSZXF1aXJlZCctQ2hlY2sgaGFzIHJlYWNoZWQgYSBjb25jbHVzaW9uLgogICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQZXJtaXNzaW9uIGRlbmllZCAoVXNlcklEOiAkUGFyYW17VXNlcklEfSAnJFBhcmFte1R5cGV9JyAiCiAgICAgICAgICAgICAgICAuICJvbiBXb3JrT3JkZXJJRDogJFBhcmFte1dvcmtPcmRlcklEfSkhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gV29ya09yZGVyU3RhdGVJRHNDaGVjaygpCgpDaGVjayB3aGV0aGVyIGFsbCBvZiB0aGUgZ2l2ZW4gd29ya29yZGVyIHN0YXRlIGlkcyBhcmUgdmFsaWQuClRoZSBtZXRob2QgaXMgcHVibGljIGFzIGl0IGlzIHVzZWQgaW4gTDxLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Q2hhbmdlU2VhcmNoPi4KCiAgICBteSAkT2sgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJTdGF0ZUlEc0NoZWNrKAogICAgICAgIFdvcmtPcmRlclN0YXRlSURzID0+IFsgMjUgXSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyU3RhdGVJRHNDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJTdGF0ZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte1dvcmtPcmRlclN0YXRlSURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlIHBhcmFtIFdvcmtPcmRlclN0YXRlSURzIG11c3QgYmUgYW4gQVJSQVkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBXb3JrT3JkZXJTdGF0ZUlEcyBiZWxvbmdzIHRvIGNvcnJlY3QgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICBmb3IgbXkgJFN0YXRlSUQgKCBAeyAkUGFyYW17V29ya09yZGVyU3RhdGVJRHN9IH0gKSB7CiAgICAgICAgbXkgJFN0YXRlID0gJFNlbGYtPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTdGF0ZUlELAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdGF0ZSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzdGF0ZSBpZCAkU3RhdGVJRCBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtPcmRlckF0dGFjaG1lbnRBZGQoKQoKQWRkIGFuIGF0dGFjaG1lbnQgdG8gdGhlIGdpdmVuIGNoYW5nZS4KCiAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRBZGQoCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gMTIzLAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywgICAgICAgICAjIHRoZSBXb3JrT3JkZXJJRCBiZWNvbWVzIHBhcnQgb2YgdGhlIGZpbGUgcGF0aAogICAgICAgIEZpbGVuYW1lICAgID0+ICdmaWxlbmFtZScsCiAgICAgICAgQ29udGVudCAgICAgPT4gJ2NvbnRlbnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBXb3JrT3JkZXJBdHRhY2htZW50QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDaGFuZ2VJRCBXb3JrT3JkZXJJRCBGaWxlbmFtZSBDb250ZW50IENvbnRlbnRUeXBlIFVzZXJJRCApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgd3JpdGUgdG8gdmlydHVhbCBmcwogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1ZpcnR1YWxGU09iamVjdH0tPldyaXRlKAogICAgICAgIEZpbGVuYW1lICAgID0+ICJXb3JrT3JkZXIvJFBhcmFte1dvcmtPcmRlcklEfS8kUGFyYW17RmlsZW5hbWV9IiwKICAgICAgICBNb2RlICAgICAgICA9PiAnYmluYXJ5JywKICAgICAgICBDb250ZW50ICAgICA9PiBcJFBhcmFte0NvbnRlbnR9LAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQ29udGVudElEICAgPT4gJFBhcmFte0NvbnRlbnRJRH0sCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRQYXJhbXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgIyB0cmlnZ2VyIEF0dGFjaG1lbnRBZGQtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyQXR0YWNobWVudEFkZFBvc3QnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgYWRkIGF0dGFjaG1lbnQgZm9yIHdvcmtvcmRlciAkUGFyYW17V29ya09yZGVySUR9IiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoKQoKRGVsZXRlIHRoZSBnaXZlbiBmaWxlIGZyb20gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbS4KCiAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gMTIzNDUsCiAgICAgICAgV29ya09yZGVySUQgPT4gNTEyMywKICAgICAgICBGaWxlSUQgICAgICA9PiAxMjM0LCAgICAgIyBpZGVudGlmaWVzIHRoZSBhdHRhY2htZW50CiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyQXR0YWNobWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2hhbmdlSUQgV29ya09yZGVySUQgRmlsZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIGF0dGFjaG1lbnRzCiAgICBteSAlQXR0YWNobWVudHMgPSAkU2VsZi0+e1ZpcnR1YWxGU09iamVjdH0tPlNlYXJjaCgKICAgICAgICBGaWxlSUQgPT4gJFBhcmFte0ZpbGVJRH0sCiAgICApOwoKICAgICMgZ2V0IGZpbGVuYW1lCiAgICBteSAkRmlsZW5hbWUgPSAkQXR0YWNobWVudHN7ICRQYXJhbXtGaWxlSUR9IH07CgogICAgIyBkZWxldGUgZmlsZQogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1ZpcnR1YWxGU09iamVjdH0tPkRlbGV0ZSgKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICApOwoKICAgICRGaWxlbmFtZSA9fiBzeyBcQSBXb3JrT3JkZXIgLyBcZCsgLyB9e314bXM7CgogICAgIyBjaGVjayBmb3IgZXJyb3IKICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAjIHRyaWdnZXIgQXR0YWNobWVudERlbGV0ZVBvc3QtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyQXR0YWNobWVudERlbGV0ZVBvc3QnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgZGVsZXRlIGF0dGFjaG1lbnQgJFBhcmFte0ZpbGVJRH0hIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBXb3JrT3JkZXJBdHRhY2htZW50R2V0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgb25lIHNwZWNpZmljIGF0dGFjaG1lbnQuCgogICAgbXkgJEF0dGFjaG1lbnQgPSAkV29ya09yZGVyT2JqZWN0LT5Xb3JrT3JkZXJBdHRhY2htZW50R2V0KAogICAgICAgIEZpbGVJRCA9PiAxMjMsCiAgICApOwoKcmV0dXJucwoKICAgIHsKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEFsbFByZWZlcmVuY2VzID0+ICd0ZXN0JywKICAgICAgICB9LAogICAgICAgIEZpbGVuYW1lICAgID0+ICd0ZXN0LnR4dCcsCiAgICAgICAgQ29udGVudCAgICAgPT4gJ2hhbGxvJywKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgRmlsZXNpemUgICAgPT4gJzEyMyBLQnl0ZXMnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgIH0KCj1jdXQKCnN1YiBXb3JrT3JkZXJBdHRhY2htZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGaWxlSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBGaWxlSUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIGF0dGFjaG1lbnRzCiAgICBteSAlQXR0YWNobWVudHMgPSAkU2VsZi0+e1ZpcnR1YWxGU09iamVjdH0tPlNlYXJjaCgKICAgICAgICBGaWxlSUQgPT4gJFBhcmFte0ZpbGVJRH0sCiAgICApOwoKICAgICMgZ2V0IGZpbGVuYW1lCiAgICBteSAkRmlsZW5hbWUgPSAkQXR0YWNobWVudHN7ICRQYXJhbXtGaWxlSUR9IH07CgogICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgaWYgKCAhJEZpbGVuYW1lICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkUGFyYW17RmlsZUlEfSkhIE1heSBiZSBhbiBhdHRhY2shISEiLAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGEgZm9yIGF0dGFjaG1lbnQKICAgIG15ICVBdHRhY2htZW50RGF0YSA9ICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fS0+UmVhZCgKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgTW9kZSAgICAgPT4gJ2JpbmFyeScsCiAgICApOwoKICAgICMgcmVtb3ZlIGV4dHJhIGluZm9ybWF0aW9uIGZyb20gZmlsZW5hbWUKICAgICggbXkgJE5hbWVEaXNwbGF5ZWQgPSAkRmlsZW5hbWUgKSA9fiBzeyBcQSBXb3JrT3JkZXIgLyBcZCsgLyB9e314bXM7CgogICAgbXkgJEF0dGFjaG1lbnRJbmZvID0gewogICAgICAgICVBdHRhY2htZW50RGF0YSwKICAgICAgICBGaWxlbmFtZSAgICA9PiAkTmFtZURpc3BsYXllZCwKICAgICAgICBDb250ZW50ICAgICA9PiAkeyAkQXR0YWNobWVudERhdGF7Q29udGVudH0gfSwKICAgICAgICBDb250ZW50VHlwZSA9PiAkQXR0YWNobWVudERhdGF7UHJlZmVyZW5jZXN9LT57Q29udGVudFR5cGV9LAogICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICBGaWxlSUQgICAgICA9PiAkUGFyYW17RmlsZUlEfSwKICAgICAgICBGaWxlc2l6ZSAgICA9PiAkQXR0YWNobWVudERhdGF7UHJlZmVyZW5jZXN9LT57RmlsZXNpemV9LAogICAgfTsKCiAgICByZXR1cm4gJEF0dGFjaG1lbnRJbmZvOwp9Cgo9aXRlbSBXb3JrT3JkZXJBdHRhY2htZW50TGlzdCgpCgpSZXR1cm5zIGEgaGFzaCB3aXRoIGFsbCBhdHRhY2htZW50cyBvZiB0aGUgZ2l2ZW4gd29ya29yZGVyLiBUaGUgZmlsZSBpZCBpcyB0aGUga2V5CmFuZCB0aGUgZmlsZW5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBoYXNoLgoKICAgIG15ICVBdHRhY2htZW50cyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywKICAgICk7CgpyZXR1cm5zCgogICAgMTIzID0+ICdmaWxlbmFtZS50eHQnLAogICAgNDM1ID0+ICdvdGhlcl9maWxlLnBkZicsCgo9Y3V0CgpzdWIgV29ya09yZGVyQXR0YWNobWVudExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgV29ya09yZGVySUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIGF0dGFjaG1lbnRzCiAgICBteSAlQXR0YWNobWVudHMgPSAkU2VsZi0+e1ZpcnR1YWxGU09iamVjdH0tPlNlYXJjaCgKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgZm9yIG15ICRGaWxlSUQgKCBrZXlzICVBdHRhY2htZW50cyApIHsKCiAgICAgICAgIyByZW1vdmUgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSBmaWxlbmFtZQogICAgICAgICRBdHRhY2htZW50c3skRmlsZUlEfSA9fiBzeyBcQSBXb3JrT3JkZXIgLyBcZCsgLyB9e314bXM7CiAgICB9CgogICAgcmV0dXJuICVBdHRhY2htZW50czsKfQoKPWl0ZW0gV29ya09yZGVyQXR0YWNobWVudEV4aXN0cygpCgpDaGVja3MgaWYgYSBmaWxlIHdpdGggYSBnaXZlbiBmaWxlbmFtZSBleGlzdHMuCgogICAgbXkgJEV4aXN0cyA9ICRXb3JrT3JkZXJPYmplY3QtPldvcmtPcmRlckF0dGFjaG1lbnRFeGlzdHMoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3Rlc3QudHh0JywKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyQXR0YWNobWVudEV4aXN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmlsZW5hbWUgV29ya09yZGVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT57VmlydHVhbEZTT2JqZWN0fS0+RmluZCgKICAgICAgICBGaWxlbmFtZSA9PiAnV29ya09yZGVyLycgLiAkUGFyYW17V29ya09yZGVySUR9IC4gJy8nIC4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFdvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQoKQoKcmV0dXJucyB0aGUgY29tYmluZWQgZWZmb3J0cyBvZiB0aGUgd29ya29yZGVycyBmb3IgdGhlIGdpdmVuIGNoYW5nZQoKICAgIG15ICRDaGFuZ2VFZmZvcnRzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyQ2hhbmdlRWZmb3J0c0dldCgKICAgICAgICBDaGFuZ2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyQ2hhbmdlRWZmb3J0c0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoQ2hhbmdlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEF0dHJpYnV0ZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgaW5pdGlhbGl6ZSB0aGUgcmV0dXJuIHRpbWUgaGFzaAogICAgbXkgJUNoYW5nZUVmZm9ydHM7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1dvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQ6OkNoYW5nZUlEOjonIC4gJFBhcmFte0NoYW5nZUlEfTsKICAgIG15ICRDYWNoZSAgICA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBpZiAoJENhY2hlKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjYWNoZQogICAgICAgICVDaGFuZ2VFZmZvcnRzID0gJXskQ2FjaGV9OwoKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGJ1aWxkIHNxbCwgdXNpbmcgbWluIGFuZCBtYXggZnVuY3Rpb25zCiAgICAgICAgbXkgJFNRTCA9ICdTRUxFQ1QgJwogICAgICAgICAgICAuICdTVU0oIHBsYW5uZWRfZWZmb3J0ICksIFNVTSggYWNjb3VudGVkX3RpbWUgKSAnCiAgICAgICAgICAgIC4gJ0ZST00gY2hhbmdlX3dvcmtvcmRlciAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNoYW5nZV9pZCA9ID8nOwoKICAgICAgICAjIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgdGltZQogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQ2hhbmdlRWZmb3J0c3tQbGFubmVkRWZmb3J0fSA9ICRSb3dbMF0gfHwgJyc7CiAgICAgICAgICAgICRDaGFuZ2VFZmZvcnRze0FjY291bnRlZFRpbWV9ID0gJFJvd1sxXSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoUGxhbm5lZEVmZm9ydCBBY2NvdW50ZWRUaW1lKSkgewoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgIyBkbyBub3Qgc2hvdyB6ZXJvIHZhbHVlcwogICAgICAgICAgICBpZiAoICRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9ID09IDAgKSB7CiAgICAgICAgICAgICAgICAkQ2hhbmdlRWZmb3J0c3skQXR0cmlidXRlfSA9ICcnOwogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29udmVydCBkZWNpbWFsIGNoYXJhY3RlciBmcm9tICcsJyB0byAnLicgaWYgbmVjY2Vzc2FyeQogICAgICAgICAgICAkQ2hhbmdlRWZmb3J0c3skQXR0cmlidXRlfSA9fiBzeyx9ey59eG1zZzsKCiAgICAgICAgICAgICMgZm9ybWF0IGFzIGRlY2ltYWwgbnVtYmVyCiAgICAgICAgICAgICRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9ID0gc3ByaW50ZiAnJS4yZicsICRDaGFuZ2VFZmZvcnRzeyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUgb25seSBpZiBQbGFubmVkRWZmb3J0IG9yIEFjY291bnRlZFRpbWUgaXMgZGVmaW5lZAogICAgICAgIGlmICggJENoYW5nZUVmZm9ydHN7UGxhbm5lZEVmZm9ydH0gfHwgJENoYW5nZUVmZm9ydHN7QWNjb3VudGVkVGltZX0gKSB7CgogICAgICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFwlQ2hhbmdlRWZmb3J0cywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVDaGFuZ2VFZmZvcnRzOwp9Cgo9aXRlbSBXb3JrT3JkZXJHZXRDb25maWd1cmVkRnJlZVRleHRGaWVsZHMoKQoKUmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBudW1iZXJzIG9mIGFsbCBjb25maWd1cmVkIHdvcmtvcmRlciBmcmVla2V5IGFuZCBmcmVldGV4dCBmaWVsZHMKCiAgICBteSBAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzID0gJFdvcmtPcmRlck9iamVjdC0+V29ya09yZGVyR2V0Q29uZmlndXJlZEZyZWVUZXh0RmllbGRzKCk7Cgo9Y3V0CgpzdWIgV29ya09yZGVyR2V0Q29uZmlndXJlZEZyZWVUZXh0RmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBsb29rdXAgY2FjaGVkIHJlc3VsdAogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzfQogICAgICAgICYmIHJlZiAkU2VsZi0+e0NvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkc30gZXEgJ0FSUkFZJwogICAgICAgICYmIEB7ICRTZWxmLT57Q29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzfSB9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiBAeyAkU2VsZi0+e0NvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkc30gfTsKICAgIH0KCiAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzCiAgICBteSAkTWF4TnVtYmVyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXInKTsKCiAgICAjIGdldCBhbGwgY29uZmlndXJlZCB3b3Jrb3JkZXIgZnJlZWtleSBhbmQgZnJlZXRleHQgbnVtYmVycwogICAgbXkgQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcyA9ICgpOwogICAgRlJFRVRFWFROVU1CRVI6CiAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gJE1heE51bWJlciApIHsKCiAgICAgICAgIyBjaGVjayB3b3Jrb3JkZXIgZnJlZWtleSBjb25maWcKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnV29ya09yZGVyRnJlZUtleScgLiAkTnVtYmVyICkgKSB7CiAgICAgICAgICAgIHB1c2ggQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcywgJE51bWJlcjsKICAgICAgICAgICAgbmV4dCBGUkVFVEVYVE5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgd29ya29yZGVyIGZyZWV0ZXh0IGNvbmZpZwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdXb3JrT3JkZXJGcmVlVGV4dCcgLiAkTnVtYmVyICkgKSB7CiAgICAgICAgICAgIHB1c2ggQENvbmZpZ3VyZWRXb3JrT3JkZXJGcmVlVGV4dEZpZWxkcywgJE51bWJlcjsKICAgICAgICAgICAgbmV4dCBGUkVFVEVYVE5VTUJFUjsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSByZXN1bHQKICAgICRTZWxmLT57Q29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzfSA9IFxAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzOwoKICAgIHJldHVybiBAQ29uZmlndXJlZFdvcmtPcmRlckZyZWVUZXh0RmllbGRzOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfQ2hlY2tXb3JrT3JkZXJUeXBlSURzKCkKCmNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHdvcmtvcmRlciB0eXBlIGlkcyBhcmUgYWxsIHZhbGlkCgogICAgbXkgJE9rID0gJFdvcmtPcmRlck9iamVjdC0+X0NoZWNrV29ya09yZGVyVHlwZUlEcygKICAgICAgICBXb3JrT3JkZXJUeXBlSURzID0+IFsgMiwgNTAwIF0sCiAgICApOwoKPWN1dAoKc3ViIF9DaGVja1dvcmtPcmRlclR5cGVJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlclR5cGVJRHN9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJUeXBlSURzIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtXb3JrT3JkZXJUeXBlSURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGhlIHBhcmFtIFdvcmtPcmRlclR5cGVJRHMgbXVzdCBiZSBhbiBBUlJBWSByZWZlcmVuY2UhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBXb3JrT3JkZXJUeXBlSURzIGJlbG9uZ3MgdG8gY29ycmVjdCBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKICAgIGZvciBteSAkVHlwZUlEICggQHsgJFBhcmFte1dvcmtPcmRlclR5cGVJRHN9IH0gKSB7CiAgICAgICAgbXkgJFR5cGUgPSAkU2VsZi0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRUeXBlSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFR5cGUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgdHlwZSBpZCAkVHlwZUlEIGlzIG5vdCB2YWxpZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0dldFdvcmtPcmRlck51bWJlcigpCgpHZXQgYSBuZXcgdW51c2VkIHdvcmtvcmRlciBudW1iZXIgZm9yIHRoZSBnaXZlbiBjaGFuZ2UuClRoZSBoaWdoZXN0IGN1cnJlbnQgd29ya29yZGVyIG51bWJlciBmb3IgdGhlIGdpdmVuIGNoYW5nZSBpcwpsb29rZWQgdXAgYW5kIGluY3JlbWVudGVkIGJ5IG9uZS4KCiAgICBteSAkV29ya09yZGVyTnVtYmVyID0gJFdvcmtPcmRlck9iamVjdC0+X0dldFdvcmtPcmRlck51bWJlcigKICAgICAgICBDaGFuZ2VJRCA9PiAyLAogICAgKTsKCj1jdXQKCnN1YiBfR2V0V29ya09yZGVyTnVtYmVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDaGFuZ2VJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoYW5nZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIGxhcmdlc3Qgd29ya29yZGVyIG51bWJlcgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBNQVgod29ya29yZGVyX251bWJlcikgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV93b3Jrb3JkZXIgJwogICAgICAgICAgICAuICdXSEVSRSBjaGFuZ2VfaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2hhbmdlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0LCBkZWZhdWx0IHRvIDAgd2hlbiB0aGVyZSBhcmUgbm8gd29ya29yZGVycyB5ZXQKICAgIG15ICRXb3JrT3JkZXJOdW1iZXI7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSApIHsKICAgICAgICAkV29ya09yZGVyTnVtYmVyID0gJFJvd1swXTsKICAgIH0KICAgICRXb3JrT3JkZXJOdW1iZXIgfHw9IDA7CgogICAgIyBpbmNyZW1lbnQgbnVtYmVyIHRvIGdldCBhIG5vbi1leGlzdGVudCB3b3Jrb3JkZXIgbnVtYmVyCiAgICAkV29ya09yZGVyTnVtYmVyKys7CgogICAgcmV0dXJuICRXb3JrT3JkZXJOdW1iZXI7Cn0KCj1pdGVtIF9DaGVja1dvcmtPcmRlclBhcmFtcygpCgpDaGVja3MgdGhlIHBhcmFtcyB0byBXb3JrT3JkZXJBZGQoKSBhbmQgV29ya09yZGVyVXBkYXRlKCkuClRoZXJlIGFyZSBubyByZXF1aXJlZCBwYXJhbWV0ZXJzLgpUaGUgdmFsdWUgZm9yIEM8V29ya09yZGVyQWdlbnRJRD4gY2FuIGJlIHVuZGVmaW5lZC4KCiAgICBteSAkT2sgPSAkV29ya09yZGVyT2JqZWN0LT5fQ2hlY2tXb3JrT3JkZXJQYXJhbXMoCiAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJOdW1iZXIgICAgPT4gNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlclRpdGxlICAgICA9PiAnUmVwbGFjZW1lbnQgb2YgbWFpbCBzZXJ2ZXInLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICAgID0+ICdJbnN0YWxsIHRoZSA8Yj5uZXc8L2I+IHNlcnZlcicsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJbnN0cnVjdGlvblBsYWluICAgPT4gJ0luc3RhbGwgdGhlIG5ldyBzZXJ2ZXInLCAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFJlcG9ydCAgICAgICAgICAgICA9PiAnSW5zdGFsbGVkIG5ldyBzZXJ2ZXIgPGI+d2l0aG91dDwvYj4gcHJvYmxlbXMnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVwb3J0UGxhaW4gICAgICAgID0+ICdJbnN0YWxsZWQgbmV3IHNlcnZlciB3aXRob3V0IHByb2JsZW1zJywgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEICAgPT4gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFdvcmtPcmRlclR5cGVJRCAgICA9PiAxMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyQWdlbnRJRCAgID0+IDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgdW5kZWYgaXMgYWxsb3dlZAogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgICA9PiAnMjAwOS0xMC0wMSAxMDozMzowMCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWN0dWFsU3RhcnRUaW1lICAgID0+ICcyMDA5LTEwLTAxIDEwOjMzOjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBQbGFubmVkRW5kVGltZSAgICAgPT4gJzIwMDktMTAtMDEgMTA6MzM6MDAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgICA9PiAnMjAwOS0xMC0wMSAxMDozMzowMCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgV29ya09yZGVyRnJlZUtleTEgID0+ICdTdW4nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgd29ya29yZGVyIGZyZWVrZXkgZmllbGRzIGZyb20gMSB0byBJVFNNV29ya09yZGVyOjpGcmVlVGV4dDo6TWF4TnVtYmVyCiAgICAgICAgV29ya09yZGVyRnJlZVRleHQxID0+ICdFYXJ0aCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBmcm9tIDEgdG8gSVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ6Ok1heE51bWJlcgoKICAgICk7CgpUaGVzZSBzdHJpbmcgcGFyYW1ldGVycyBoYXZlIGxlbmd0aCBjb25zdHJhaW50czoKCiAgICBQYXJhbWV0ZXIgICAgICAgIHwgbWF4LiBsZW5ndGgKICAgIC0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tCiAgICBXb3JrT3JkZXJUaXRsZSAgICAgIHwgIDI1MCBjaGFyYWN0ZXJzCiAgICBJbnN0cnVjdGlvbiAgICAgICAgIHwgMzgwMCBjaGFyYWN0ZXJzCiAgICBJbnN0cnVjdGlvblBsYWluICAgIHwgMzgwMCBjaGFyYWN0ZXJzCiAgICBSZXBvcnQgICAgICAgICAgICAgIHwgMzgwMCBjaGFyYWN0ZXJzCiAgICBSZXBvcnRQbGFpbiAgICAgICAgIHwgMzgwMCBjaGFyYWN0ZXJzCiAgICBXb3JrT3JkZXJGcmVlS2V5WFggIHwgIDI1MCBjaGFyYWN0ZXJzCiAgICBXb3JrT3JkZXJGcmVlVGV4dFhYIHwgIDI1MCBjaGFyYWN0ZXJzCgo9Y3V0CgpzdWIgX0NoZWNrV29ya09yZGVyUGFyYW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0aGUgc3RyaW5nIGFuZCBpZCBwYXJhbWV0ZXJzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKAogICAgICAgIHF3KAogICAgICAgIFdvcmtPcmRlclRpdGxlCiAgICAgICAgSW5zdHJ1Y3Rpb24KICAgICAgICBJbnN0cnVjdGlvblBsYWluCiAgICAgICAgUmVwb3J0CiAgICAgICAgUmVwb3J0UGxhaW4KICAgICAgICBXb3JrT3JkZXJBZ2VudElECiAgICAgICAgV29ya09yZGVyU3RhdGVJRAogICAgICAgIFdvcmtPcmRlclR5cGVJRAogICAgICAgIFdvcmtPcmRlck51bWJlcgogICAgICAgIENoYW5nZUlECiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBwYXJhbXMgYXJlIG5vdCByZXF1aXJlZAogICAgICAgIG5leHQgQVJHVU1FTlQgaWYgIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fTsKCiAgICAgICAgIyBjaGVjayBpZiBwYXJhbSBpcyBub3QgZGVmaW5lZAogICAgICAgIGlmICggJEFyZ3VtZW50IGVxICdXb3JrT3JkZXJBZ2VudElEJyAmJiAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKCiAgICAgICAgICAgICMgV29ya09yZGVyQWdlbnRJRCBjYW4gYmUgdW5kZWZpbmVkCiAgICAgICAgfQogICAgICAgIGVsc2lmICggIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgZGVmaW5lZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHBhcmFtIGlzIG5vdCBhIHJlZmVyZW5jZQogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICcnICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0bid0IGJlIGEgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRpdGxlCiAgICAgICAgaWYgKCAkQXJndW1lbnQgZXEgJ1dvcmtPcmRlclRpdGxlJyAmJiBsZW5ndGgoICRQYXJhbXskQXJndW1lbnR9ICkgPiAyNTAgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgc2hvcnRlciB0aGFuIDI1MCBjaGFyYWN0ZXJzISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXJndW1lbnQgICAgZXEgJ0luc3RydWN0aW9uJwogICAgICAgICAgICB8fCAkQXJndW1lbnQgZXEgJ0luc3RydWN0aW9uUGxhaW4nCiAgICAgICAgICAgIHx8ICRBcmd1bWVudCBlcSAnUmVwb3J0JwogICAgICAgICAgICB8fCAkQXJndW1lbnQgZXEgJ1JlcG9ydFBsYWluJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGxlbmd0aCggJFBhcmFteyRBcmd1bWVudH0gKSA+IDM4MDAgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgc2hvcnRlciB0aGFuIDM4MDAgY2hhcmFjdGVycyEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRpbWUgZm9ybWF0cwogICAgT1BUSU9OOgogICAgZm9yIG15ICRPcHRpb24gKHF3KFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgQWN0dWFsU3RhcnRUaW1lIEFjdHVhbEVuZFRpbWUpKSB7CiAgICAgICAgbmV4dCBPUFRJT04gaWYgISRQYXJhbXskT3B0aW9ufTsKCiAgICAgICAgcmV0dXJuIGlmICRQYXJhbXskT3B0aW9ufSAhfiBteyBcQSBcZFxkXGRcZC1cZFxkLVxkXGQgXHMgXGRcZDpcZFxkOlxkXGQgXHogfXhtczsKICAgIH0KCiAgICAjIGNoZWNrIHdvcmtvcmRlciBhZ2VudAogICAgaWYgKCBleGlzdHMgJFBhcmFte1dvcmtPcmRlckFnZW50SUR9ICYmIGRlZmluZWQgJFBhcmFte1dvcmtPcmRlckFnZW50SUR9ICkgewoKICAgICAgICAjIFdvcmtPcmRlckFnZW50IG11c3QgYmUgYW4gYWdlbnQKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJBZ2VudElEfSwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgV29ya09yZGVyQWdlbnQgJFBhcmFte1dvcmtPcmRlckFnZW50SUR9IGlzIG5vdCBhIHZhbGlkIHVzZXIgaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHRoZSBmcmVla2V5IGFuZCBmcmVldGV4dCBwYXJhbWV0ZXJzCiAgICBmb3IgbXkgJFR5cGUgKCAnV29ya09yZGVyRnJlZUtleScsICdXb3JrT3JkZXJGcmVlVGV4dCcgKSB7CgogICAgICAgICMgY2hlY2sgYWxsIHBvc3NpYmxlIGZyZWV0ZXh0IGZpZWxkcwogICAgICAgIE5VTUJFUjoKICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXInKSApIHsKCiAgICAgICAgICAgICMgYnVpbGQgYXJndW1lbnQsIGUuZy4gV29ya09yZGVyRnJlZUtleTEKICAgICAgICAgICAgbXkgJEFyZ3VtZW50ID0gJFR5cGUgLiAkTnVtYmVyOwoKICAgICAgICAgICAgIyBwYXJhbXMgYXJlIG5vdCByZXF1aXJlZAogICAgICAgICAgICBuZXh0IE5VTUJFUiBpZiAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiBwYXJhbSBpcyBub3QgZGVmaW5lZAogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0IGJlIGRlZmluZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgcGFyYW0gaXMgbm90IGEgcmVmZXJlbmNlCiAgICAgICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICcnICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAnJEFyZ3VtZW50JyBtdXN0bid0IGJlIGEgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBmcmVldGV4dCBmaWVsZHMKICAgICAgICAgICAgaWYgKCBsZW5ndGgoICRQYXJhbXskQXJndW1lbnR9ICkgPiAyNTAgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgcGFyYW1ldGVyICckQXJndW1lbnQnIG11c3QgYmUgc2hvcnRlciB0aGFuIDI1MCBjaGFyYWN0ZXJzISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgZ2l2ZW4gV29ya09yZGVyU3RhdGVJRCBpcyB2YWxpZAogICAgaWYgKCBleGlzdHMgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPldvcmtPcmRlclN0YXRlSURzQ2hlY2soCiAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSURzID0+IFsgJFBhcmFte1dvcmtPcmRlclN0YXRlSUR9IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGdpdmVuIFdvcmtPcmRlclR5cGVJRCBpcyB2YWxpZAogICAgaWYgKCBleGlzdHMgJFBhcmFte1dvcmtPcmRlclR5cGVJRH0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrV29ya09yZGVyVHlwZUlEcygKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEcyA9PiBbICRQYXJhbXtXb3JrT3JkZXJUeXBlSUR9IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0NoZWNrVGltZXN0YW1wcygpCgpDaGVja3MgdGhlIGNvbnN0cmFpbnRzIG9mIHRpbWVzdGFtcHM6IHh4eFN0YXJ0VGltZSBtdXN0IGJlIGJlZm9yZSB4eHhFbmRUaW1lCgogICAgbXkgJE9rID0gJFdvcmtPcmRlck9iamVjdC0+X0NoZWNrVGltZXN0YW1wcygKICAgICAgICBXb3JrT3JkZXJEYXRhICAgID0+ICRXb3JrT3JkZXJEYXRhLAogICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMTAtMTIgMDA6MDA6MDEnLCAgICAgIyAob3B0aW9uYWwpIG9yIHVuZGVmCiAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0xNSAxNTowMDowMCcsICAgICAjIChvcHRpb25hbCkgb3IgdW5kZWYKICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTEwLTE0IDAwOjAwOjAxJywgICAgICMgKG9wdGlvbmFsKSBvciB1bmRlZgogICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMDEtMjAgMDA6MDA6MDEnLCAgICAgIyAob3B0aW9uYWwpIG9yIHVuZGVmCiAgICApOwoKSWYgUGxhbm5lZFN0YXJ0VGltZSBpcyBnaXZlbiwgUGxhbm5lZEVuZFRpbWUgaGFzIHRvIGJlIGdpdmVuLCB0b28gLSBhbmQgdmljZSB2ZXJzYS4KSWYgQWN0dWFsU3RhcnRUaW1lIGlzIGdpdmVuIEFjdHVhbEVuZFRpbWUgaXMgb3B0aW9uYWwuCkJ1dCBpZiBBY3R1YWxFbmRUaW1lIGlzIGdpdmVuIHRoZW4gQWN0dWFsU3RhcnRUaW1lIGhhcyB0byBiZSBnaXZlbiwgdG9vLgpXb3JrT3JkZXJEYXRhIGlzIG9ubHkgcGFzc2VkIGZvciBpbXByb3ZpbmcgdGhlIHBlcmZvcm1hbmNlLgoKPWN1dAoKc3ViIF9DaGVja1RpbWVzdGFtcHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoV29ya09yZGVyRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERlZmF1bHRUaW1lU3RhbXAgPSAnOTk5OS0wMS0wMSAwMDowMDowMCc7CgogICAgIyBjaGVjayB0aW1lcwogICAgVFlQRToKICAgIGZvciBteSAkVHlwZSAocXcoQWN0dWFsIFBsYW5uZWQpKSB7CgogICAgICAgICMgY2hlY2sgb25seSB3aGVuIGEgc3RhcnQgb3IgYSBlbmQgdGltZSBpcyBnaXZlbgogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17ICRUeXBlIC4gJ1N0YXJ0VGltZScgfSAmJiAhZXhpc3RzICRQYXJhbXsgJFR5cGUgLiAnRW5kVGltZScgfSApIHsKICAgICAgICAgICAgbmV4dCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgIyBmb3IgdGhlIGxvZyBtZXNzYWdlcwogICAgICAgIG15ICRUeXBlTGMgPSBsYyAkVHlwZTsKCiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICcnOwogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17ICRUeXBlIC4gJ1N0YXJ0VGltZScgfSApIHsKCiAgICAgICAgICAgICMgaWYgYSB0aW1lIGlzIG5vdCBnaXZlbiwgZ2V0IGl0IGZyb20gdGhlIHdvcmtvcmRlcgogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFBhcmFte1dvcmtPcmRlckRhdGF9LT57ICRUeXBlIC4gJ1N0YXJ0VGltZScgfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRUeXBlIC4gJ1N0YXJ0VGltZScgfSApIHsKCiAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlIGZvciBjbGVhcmluZyB0aGUgdGltZQogICAgICAgICAgICAkU3RhcnRUaW1lID0gJERlZmF1bHRUaW1lU3RhbXA7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggISRQYXJhbXsgJFR5cGUgLiAnU3RhcnRUaW1lJyB9ICkgewoKICAgICAgICAgICAgIyBpZiBhIHRpbWUgaXMgbm90IGdpdmVuLCBnZXQgaXQgZnJvbSB0aGUgd29ya29yZGVyCiAgICAgICAgICAgICRTdGFydFRpbWUgPSAkUGFyYW17V29ya09yZGVyRGF0YX0tPnsgJFR5cGUgLiAnU3RhcnRUaW1lJyB9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXsgJFR5cGUgLiAnU3RhcnRUaW1lJyB9IGVxICREZWZhdWx0VGltZVN0YW1wICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHZhbHVlICRTdGFydFRpbWUgaXMgaW52YWxpZCBmb3IgdGhlICRUeXBlTGMgc3RhcnQgdGltZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFBhcmFteyAkVHlwZSAuICdTdGFydFRpbWUnIH07CiAgICAgICAgfQoKICAgICAgICBteSAkRW5kVGltZSA9ICcnOwogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17ICRUeXBlIC4gJ0VuZFRpbWUnIH0gKSB7CgogICAgICAgICAgICAjIGlmIGEgdGltZSBpcyBub3QgZ2l2ZW4sIGdldCBpdCBmcm9tIHRoZSB3b3Jrb3JkZXIKICAgICAgICAgICAgJEVuZFRpbWUgPSAkUGFyYW17V29ya09yZGVyRGF0YX0tPnsgJFR5cGUgLiAnRW5kVGltZScgfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRUeXBlIC4gJ0VuZFRpbWUnIH0gKSB7CgogICAgICAgICAgICAjIHNwZWNpYWwgY2FzZSBmb3IgY2xlYXJpbmcgdGhlIHRpbWUKICAgICAgICAgICAgJEVuZFRpbWUgPSAkRGVmYXVsdFRpbWVTdGFtcDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhJFBhcmFteyAkVHlwZSAuICdFbmRUaW1lJyB9ICkgewoKICAgICAgICAgICAgIyBpZiBhIHRpbWUgaXMgbm90IGdpdmVuLCBnZXQgaXQgZnJvbSB0aGUgd29ya29yZGVyCiAgICAgICAgICAgICRFbmRUaW1lID0gJFBhcmFte1dvcmtPcmRlckRhdGF9LT57ICRUeXBlIC4gJ0VuZFRpbWUnIH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFteyAkVHlwZSAuICdFbmRUaW1lJyB9IGVxICREZWZhdWx0VGltZVN0YW1wICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHZhbHVlICRFbmRUaW1lIGlzIGludmFsaWQgZm9yIHRoZSAkVHlwZUxjIGVuZCB0aW1lISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFBhcmFteyAkVHlwZSAuICdFbmRUaW1lJyB9OwogICAgICAgIH0KCiAgICAgICAgIyBkb24ndCBjaGVjayBhY3R1YWwgc3RhcnQgdGltZSB3aGVuIHRoZSB3b3Jrb3JkZXIgaGFzIG5vdCBlbmRlZCB5ZXQKICAgICAgICBpZiAoICRUeXBlIGVxICdBY3R1YWwnICYmICRTdGFydFRpbWUgJiYgISRFbmRUaW1lICkgewogICAgICAgICAgICBuZXh0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICAjIHRoZSBjaGVjayBmYWlscyBpZiBub3QgYm90aCAoc3RhcnQgYW5kIGVuZCkgdGltZXMgYXJlIHByZXNlbnQKICAgICAgICBpZiAoICEkU3RhcnRUaW1lIHx8ICEkRW5kVGltZSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRUeXBlIHN0YXJ0IHRpbWUgYW5kICRUeXBlTGMgZW5kIHRpbWUgbXVzdCBiZSBnaXZlbiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBvcmRlcmluZyBvZiB0aGUgdGltZXMsIG9ubHkgaW4gdGhlIG5vbi1kZWZhdWx0LWNhc2UKICAgICAgICBpZiAoICRTdGFydFRpbWUgbmUgJERlZmF1bHRUaW1lU3RhbXAgJiYgJEVuZFRpbWUgbmUgJERlZmF1bHRUaW1lU3RhbXAgKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgbm9uLWRpZ2l0IGNoYXJhY3RlcnMKICAgICAgICAgICAgJFN0YXJ0VGltZSA9fiBzeyBcRCB9e314bXNnOwogICAgICAgICAgICAkRW5kVGltZSAgID1+IHN7IFxEIH17fXhtc2c7CgogICAgICAgICAgICAjIHN0YXJ0IHRpbWUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gZW5kIHRpbWUKICAgICAgICAgICAgaWYgKCAkU3RhcnRUaW1lID49ICRFbmRUaW1lICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJFR5cGVMYyBzdGFydCB0aW1lICckU3RhcnRUaW1lJyBtdXN0IGJlIGJlZm9yZSB0aGUgJFR5cGVMYyBlbmQgdGltZSAnJEVuZFRpbWUnISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfV29ya09yZGVyRnJlZVRleHRHZXQoKQoKR2V0cyB0aGUgZnJlZXRleHQgYW5kIGZyZWVrZXkgZmllbGRzIG9mIGEgd29ya29yZGVyIGFzIGEgaGFzaCByZWZlcmVuY2UuCgogICAgbXkgJFdvcmtPcmRlckZyZWVUZXh0ID0gJFdvcmtPcmRlck9iamVjdC0+X1dvcmtPcmRlckZyZWVUZXh0R2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybnM6CgogICAgJFdvcmtPcmRlckZyZWVUZXh0ID0gewogICAgICAgIFdvcmtPcmRlckZyZWVLZXkxICA9PiAnU3VuJywgICAjIHdvcmtvcmRlciBmcmVla2V5IGZpZWxkcyBmcm9tIDEgdG8gSVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ6Ok1heE51bWJlcgogICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MSA9PiAnRWFydGgnLCAjIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgIH0KCj1jdXQKCnN1YiBfV29ya09yZGVyRnJlZVRleHRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFdvcmtPcmRlcklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBdHRyaWJ1dGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHdvcmtvcmRlciBmcmVla2V5IGFuZCBmcmVldGV4dCBkYXRhCiAgICBteSAlRGF0YTsKCiAgICAjIGdldCB3b3Jrb3JkZXIgZnJlZWtleSBhbmQgZnJlZXRleHQgZGF0YQogICAgZm9yIG15ICRUeXBlICggJ1dvcmtPcmRlckZyZWVLZXknLCAnV29ya09yZGVyRnJlZVRleHQnICkgewoKICAgICAgICAjIHByZXNldCBldmVyeSBmcmVldGV4dCBmaWVsZCB3aXRoIGVtcHR5IHN0cmluZwogICAgICAgIGZvciBteSAkTnVtYmVyICggMSAuLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6RnJlZVRleHQ6Ok1heE51bWJlcicpICkgewogICAgICAgICAgICAkRGF0YXsgJFR5cGUgLiAkTnVtYmVyIH0gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRhYmxlIG5hbWUKICAgICAgICBteSAkVGFibGVOYW1lID0gJyc7CiAgICAgICAgaWYgKCAkVHlwZSBlcSAnV29ya09yZGVyRnJlZVRleHQnICkgewogICAgICAgICAgICAkVGFibGVOYW1lID0gJ2NoYW5nZV93b19mcmVldGV4dCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlckZyZWVLZXknICkgewogICAgICAgICAgICAkVGFibGVOYW1lID0gJ2NoYW5nZV93b19mcmVla2V5JzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBmaWVsZF9pZCwgZmllbGRfdmFsdWUnCiAgICAgICAgICAgICAgICAuICcgRlJPTSAnIC4gJFRhYmxlTmFtZQogICAgICAgICAgICAgICAgLiAnIFdIRVJFIHdvcmtvcmRlcl9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtXb3JrT3JkZXJJRH0gXSwKICAgICAgICApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIG15ICRGaWVsZCA9ICRUeXBlIC4gJFJvd1swXTsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFJvd1sxXTsKICAgICAgICAgICAgJERhdGF7JEZpZWxkfSA9IGRlZmluZWQgJFZhbHVlID8gJFZhbHVlIDogJyc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIF9Xb3JrT3JkZXJGcmVlVGV4dFVwZGF0ZSgpCgpVcGRhdGVzIHRoZSBmcmVldGV4dCBhbmQgZnJlZWtleSBmaWVsZHMgb2YgYSB3b3Jrb3JkZXIuClBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGRlbGV0ZXMgdGhlIGZyZWV0ZXh0IGZpZWxkLgoKICAgIG15ICRTdWNjZXNzID0gJFdvcmtPcmRlck9iamVjdC0+X1dvcmtPcmRlckZyZWVUZXh0VXBkYXRlKAogICAgICAgIFdvcmtPcmRlcklEICAgICAgICA9PiAxMjMsCiAgICAgICAgV29ya09yZGVyRnJlZUtleTEgID0+ICdTdW4nLCAgICMgKG9wdGlvbmFsKSB3b3Jrb3JkZXIgZnJlZWtleSBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDEgPT4gJ0VhcnRoJywgIyAob3B0aW9uYWwpIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgZnJvbSAxIHRvIElUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXIKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1dvcmtPcmRlckZyZWVUZXh0VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGUgZ2l2ZW4gcGFyYW1ldGVycwogICAgcmV0dXJuIGlmICEkU2VsZi0+X0NoZWNrV29ya09yZGVyUGFyYW1zKCVQYXJhbSk7CgogICAgIyBzdG9yZSB0aGUgZ2l2ZW4gZnJlZWtleSBhbmQgZnJlZXRleHQgaWRzCiAgICBteSBARnJlZUtleUZpZWxkSURzOwogICAgbXkgQEZyZWVUZXh0RmllbGRJRHM7CiAgICBmb3IgbXkgJFR5cGUgKCAnV29ya09yZGVyRnJlZUtleScsICdXb3JrT3JkZXJGcmVlVGV4dCcgKSB7CgogICAgICAgICMgY2hlY2sgYWxsIHBvc3NpYmxlIGZyZWV0ZXh0IGZpZWxkcwogICAgICAgIE5VTUJFUjoKICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01Xb3JrT3JkZXI6OkZyZWVUZXh0OjpNYXhOdW1iZXInKSApIHsKCiAgICAgICAgICAgICMgYnVpbGQgYXJndW1lbnQsIGUuZy4gV29ya09yZGVyRnJlZUtleTEKICAgICAgICAgICAgbXkgJEFyZ3VtZW50ID0gJFR5cGUgLiAkTnVtYmVyOwoKICAgICAgICAgICAgIyBwYXJhbXMgYXJlIG5vdCByZXF1aXJlZAogICAgICAgICAgICBuZXh0IE5VTUJFUiBpZiAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9OwoKICAgICAgICAgICAgIyBhbGwgY2hlY2tzIHdlcmUgZG9uZSBiZWZvcmUsIHNvIGhlcmUgd2UgYXJlIHNhZmUgYW5kIHN0b3JlIHRoZSBpZHMKICAgICAgICAgICAgaWYgKCAkVHlwZSBlcSAnV29ya09yZGVyRnJlZUtleScgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBGcmVlS2V5RmllbGRJRHMsICROdW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkVHlwZSBlcSAnV29ya09yZGVyRnJlZVRleHQnICkgewogICAgICAgICAgICAgICAgcHVzaCBARnJlZVRleHRGaWVsZElEcywgJE51bWJlcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgbXkgJFR5cGUgKCAnV29ya09yZGVyRnJlZUtleScsICdXb3JrT3JkZXJGcmVlVGV4dCcgKSB7CgogICAgICAgICMgc2V0IHRhYmxlIG5hbWUgYW5kIGFycmF5cyBvZiBmaWVsZCBpZHMKICAgICAgICBteSAkVGFibGVOYW1lOwogICAgICAgIG15IEBGaWVsZElEczsKICAgICAgICBpZiAoICRUeXBlIGVxICdXb3JrT3JkZXJGcmVlS2V5JyApIHsKICAgICAgICAgICAgJFRhYmxlTmFtZSA9ICdjaGFuZ2Vfd29fZnJlZWtleSc7CiAgICAgICAgICAgIEBGaWVsZElEcyAgPSBARnJlZUtleUZpZWxkSURzOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUeXBlIGVxICdXb3JrT3JkZXJGcmVlVGV4dCcgKSB7CiAgICAgICAgICAgICRUYWJsZU5hbWUgPSAnY2hhbmdlX3dvX2ZyZWV0ZXh0JzsKICAgICAgICAgICAgQEZpZWxkSURzICA9IEBGcmVlVGV4dEZpZWxkSURzOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgYWxsIGdpdmVuIHdvcmtvcmRlciBmcmVla2V5IGFuZCBmcmVldGV4dCBmaWVsZHMKICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKEBGaWVsZElEcykgewoKICAgICAgICAgICAgIyBjaGVjayBpZiBlbnRyeSBleGlzdHMgZm9yIHRoaXMgY29tYmluYXRpb24KICAgICAgICAgICAgIyBvZiB3b3Jrb3JkZXJfaWQsIGZpZWxkX2lkIGFuZCB0eXBlIChXb3JrT3JkZXJGcmVlS2V5IG9yIFdvcmtPcmRlckZyZWVUZXh0KQogICAgICAgICAgICBteSAkSUQ7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSAnIC4gJFRhYmxlTmFtZQogICAgICAgICAgICAgICAgICAgIC4gJyBXSEVSRSB3b3Jrb3JkZXJfaWQgPSA/ICcKICAgICAgICAgICAgICAgICAgICAuICcgQU5EIGZpZWxkX2lkID0gPyAnLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17V29ya09yZGVySUR9LCBcJEZpZWxkSUQgXSwKICAgICAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICAkSUQgPSAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBuZXcgdmFsdWUgZnJvbSBwYXJhbWV0ZXIKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFteyAkVHlwZSAuICRGaWVsZElEIH07CgogICAgICAgICAgICAjIGVudHJ5IGV4aXN0cyBhbmQgbmVlZHMgYW4gdXBkYXRlCiAgICAgICAgICAgIGlmICggJElEICYmICRWYWx1ZSBuZSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFICcgLiAkVGFibGVOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyBTRVQgZmllbGRfdmFsdWUgPSA/JwogICAgICAgICAgICAgICAgICAgICAgICAuICcgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRWYWx1ZSwgXCRJRCBdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBlbnRyeSBleGlzdHMgYnV0IG5ldyB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgZWxzaWYgKCAkSUQgJiYgJFZhbHVlIGVxICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSAnIC4gJFRhYmxlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAuICcgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRJRCBdLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBlbnRyeSBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IGVudHJ5CiAgICAgICAgICAgIGVsc2lmICggISRJRCAmJiAkVmFsdWUgbmUgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPICcgLiAkVGFibGVOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAod29ya29yZGVyX2lkLCBmaWVsZF9pZCwgZmllbGRfdmFsdWUpJwogICAgICAgICAgICAgICAgICAgICAgICAuICcgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17V29ya09yZGVySUR9LCBcJEZpZWxkSUQsIFwkVmFsdWUgXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgIEtleSAgPT4gJ1dvcmtPcmRlckdldDo6SUQ6OicgLiAkUGFyYW17V29ya09yZGVySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1dvcmtPcmRlckZyZWVUZXh0RGVsZXRlKCkKCkRlbGV0ZXMgYWxsIGZyZWV0ZXh0IGFuZCBmcmVla2V5IGZpZWxkcyBvZiBhIHdvcmtvcmRlci4KCiAgICBteSAkU3VjY2VzcyA9ICRXb3JrT3JkZXJPYmplY3QtPl9Xb3JrT3JkZXJGcmVlVGV4dERlbGV0ZSgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1dvcmtPcmRlckZyZWVUZXh0RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhXb3JrT3JkZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXR0cmlidXRlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgZm9yIG15ICRUeXBlICggJ1dvcmtPcmRlckZyZWVLZXknLCAnV29ya09yZGVyRnJlZVRleHQnICkgewoKICAgICAgICAjIHNldCB0YWJsZSBuYW1lCiAgICAgICAgbXkgJFRhYmxlTmFtZTsKICAgICAgICBpZiAoICRUeXBlIGVxICdXb3JrT3JkZXJGcmVlS2V5JyApIHsKICAgICAgICAgICAgJFRhYmxlTmFtZSA9ICdjaGFuZ2Vfd29fZnJlZWtleSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFR5cGUgZXEgJ1dvcmtPcmRlckZyZWVUZXh0JyApIHsKICAgICAgICAgICAgJFRhYmxlTmFtZSA9ICdjaGFuZ2Vfd29fZnJlZXRleHQnOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgZW50cmllcyBmcm9tIGRhdGFiYXNlCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gJyAuICRUYWJsZU5hbWUKICAgICAgICAgICAgICAgIC4gJyBXSEVSRSB3b3Jrb3JkZXJfaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17V29ya09yZGVySUR9IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlTWFuYWdlbWVudCcsCiAgICAgICAgS2V5ICA9PiAnV29ya09yZGVyR2V0OjpJRDo6JyAuICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTE0ICQgJERhdGU6IDIwMTAvMDcvMDMgMDA6MzY6MzkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9Ob3RpZmljYXRpb24ucG0gLSBsaWIgZm9yIG5vdGlmaWNhdGlvbnMgaW4gY2hhbmdlIG1hbmFnZW1lbnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE5vdGlmaWNhdGlvbi5wbSx2IDEuNDEgMjAxMC8wNS8yMSAxMDoyMjoxMiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIpOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40MSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok5vdGlmaWNhdGlvbiAtIG5vdGlmaWNhdGlvbiBmdW5jdGlvbnMgZm9yIGNoYW5nZSBtYW5hZ2VtZW50Cgo9aGVhZDEgU1lOT1BTSVMKClRoaXMgbW9kdWxlIGlzIG1hbmFnaW5nIG5vdGlmaWNhdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG5vdGlmaWNhdGlvbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6Tm90aWZpY2F0aW9uOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJE5vdGlmaWNhdGlvbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb24tPm5ldygKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWJ1ZyBmbGFnCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Tm90aWZpY2F0aW9uT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb24tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U2VuZG1haWxPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBkbyB3ZSB1c2UgcmljaHRleHQKICAgICRTZWxmLT57UmljaFRleHR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgICMgc2V0IHVwIGVtcHR5IGNhY2hlIGZvciBfTm90aWZpY2F0aW9uR2V0KCkKICAgICRTZWxmLT57Tm90aWZpY2F0aW9uQ2FjaGV9ID0ge307CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyAgICAgPT4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50Tm90aWZpY2F0aW9uOjpFdmVudE1vZHVsZScsCiAgICAgICAgQmFzZU9iamVjdCA9PiAnQ2hhbmdlT2JqZWN0JywKICAgICAgICBPYmplY3RzICAgID0+IHsKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBOb3RpZmljYXRpb25TZW5kKCkKClNlbmQgdGhlIG5vdGlmaWNhdGlvbiB0byBjdXN0b21lcnMgYW5kL29yIGFnZW50cy4KCiAgICBteSAkU3VjY2VzcyA9ICROb3RpZmljYXRpb25PYmplY3QtPk5vdGlmaWNhdGlvblNlbmQoCiAgICAgICAgQWdlbnRJRHMgICAgPT4gWyAxLCAyLCAzLCBdCiAgICAgICAgQ3VzdG9tZXJJRHMgPT4gWyAxLCAyLCAzLCBdLAogICAgICAgIFR5cGUgICAgICAgID0+ICdDaGFuZ2UnLCAgICAgICAgICAjIENoYW5nZXxXb3JrT3JkZXIKICAgICAgICBFdmVudCAgICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICBEYXRhICAgICAgICA9PiB7ICVDaGFuZ2VEYXRhIH0sICAgIyBDaGFuZ2V8V29ya09yZGVyfExpbmsgZGF0YQogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uU2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUeXBlIEV2ZW50IFVzZXJJRCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZvciBjb252ZW5pZW5jZQogICAgbXkgJEV2ZW50ID0gJFBhcmFte0V2ZW50fTsKCiAgICAjIG5lZWQgYXQgbGVhc3QgQWdlbnRJRHMgb3IgQ3VzdG9tZXJJRHMKICAgIGlmICggISRQYXJhbXtBZ2VudElEc30gJiYgISRQYXJhbXtDdXN0b21lcklEc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGF0IGxlYXN0IEFnZW50SURzIG9yIEN1c3RvbWVySURzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBBZ2VudElEcyBhbmQgQ3VzdG9tZXJJRHMgaGF2ZSB0byBiZSBhcnJheSByZWZlcmVuY2VzCiAgICBmb3IgbXkgJElES2V5IChxdyhBZ2VudElEcyBDdXN0b21lcklEcykpIHsKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFteyRJREtleX0gJiYgcmVmICRQYXJhbXskSURLZXl9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkSURLZXkgaGFzIHRvIGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgc2VuZGluZyBvZiBub3RpZmljYXRpb24gaGFzIGJlZW4gdHVybmVkIG9mZgogICAgcmV0dXJuIDEgaWYgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpTZW5kTm90aWZpY2F0aW9ucycpOwoKICAgICMgd2UgbmVlZCB0byBnZXQgdGhlIGl0ZW1zIGZvciByZXBsYWNlbWVudHMKICAgIG15ICRDaGFuZ2UgICAgPSB7fTsKICAgIG15ICRXb3JrT3JkZXIgPSB7fTsKICAgIG15ICRMaW5rICAgICAgPSB7fTsKCiAgICAjIHN0YXJ0IHdpdGggd29ya29yZGVyLCBhcyB0aGUgY2hhbmdlIGlkIG1pZ2h0IGJlIHRha2VuIGZyb20gdGhlIHdvcmtvcmRlcgogICAgaWYgKCAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0gKSB7CgogICAgICAgIGlmICggJEV2ZW50IGVxICdXb3JrT3JkZXJEZWxldGUnICkgewoKICAgICAgICAgICAgIyB0aGUgd29ya29yZGVyIGlzIGFscmVhZHkgZGVsZXRlZCwKICAgICAgICAgICAgIyBzbyB3ZSBkaXNwbGF5IHRoZSBvbGQgZGF0YQogICAgICAgICAgICAkV29ya09yZGVyID0gJFBhcmFte0RhdGF9LT57T2xkV29ya09yZGVyRGF0YX07CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBnZXQgZnJlc2ggZGF0YQogICAgICAgICAgICAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFRoZSBldmVudCAnV29ya09yZGVyQWRkJyBpcyBhIHNwZWNpYWwgY2FzZSwgYXMgdGhlIHdvcmtvcmRlcgogICAgICAgICMgaXMgbm90IGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgeWV0LiBTbyBhbHNvIHRha2UKICAgICAgICAjIHRoZSBwYXJhbXMgZm9yIFdvcmtPcmRlckFkZCgpIGludG8gYWNjb3VudC4KICAgICAgICAjIFdvcmtPcmRlckdldCgpIG11c3Qgc3RpbGwgYmUgY2FsbGVkLCBhcyBpdCBwcm92aWRlcyB0cmFuc2xhdGlvbgogICAgICAgICMgZm9yIHNvbWUgSURzIHRoYXQgd2VyZSBzZXQgaW4gV29ya09yZGVyQWRkKCkuCiAgICAgICAgaWYgKCAkRXZlbnQgZXEgJ1dvcmtPcmRlckFkZCcgKSB7CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAleyRXb3JrT3JkZXJ9ICkgewogICAgICAgICAgICAgICAgJFdvcmtPcmRlci0+eyRBdHRyaWJ1dGV9IHx8PSAkUGFyYW17RGF0YX0tPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH0gKSB7CgogICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEgZm9yIHRoZSB3b3Jrb3JkZXIgYWdlbnQKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57V29ya09yZGVyQWdlbnR9ID0gewogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGluZmVyIHRoZSBjaGFuZ2UgaWQgZnJvbSB0aGUgd29ya29yZGVyCiAgICAgICAgaWYgKCAkV29ya09yZGVyLT57Q2hhbmdlSUR9ICkgewogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0gPSAkV29ya09yZGVyLT57Q2hhbmdlSUR9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSApIHsKCiAgICAgICAgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgVGhlIGV2ZW50ICdDaGFuZ2VBZGQnIGlzIGEgc3BlY2lhbCBjYXNlLCBhcyB0aGUgY2hhbmdlCiAgICAgICAgIyBpcyBub3QgY29tcGxldGVseSBpbml0aWFsaXplZCB5ZXQuIFNvIGFsc28gdGFrZQogICAgICAgICMgdGhlIHBhcmFtcyBmb3IgQ2hhbmdlQWRkKCkgaW50byBhY2NvdW50LgogICAgICAgICMgQ2hhbmdlR2V0KCkgbXVzdCBzdGlsbCBiZSBjYWxsZWQsIGFzIGl0IHByb3ZpZGVzIHRyYW5zbGF0aW9uCiAgICAgICAgIyBmb3Igc29tZSBJRHMgdGhhdCB3ZXJlIHNldCBpbiBDaGFuZ2VBZGQoKS4KICAgICAgICBpZiAoICRFdmVudCBlcSAnQ2hhbmdlQWRkJyApIHsKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICV7JENoYW5nZX0gKSB7CiAgICAgICAgICAgICAgICAkQ2hhbmdlLT57JEF0dHJpYnV0ZX0gfHw9ICRQYXJhbXtEYXRhfS0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9ICkgewogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDaGFuZ2VCdWlsZGVyfSA9IHsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDaGFuZ2UtPntDaGFuZ2VNYW5hZ2VySUR9ICkgewogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDaGFuZ2VNYW5hZ2VyfSA9IHsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ2hhbmdlLT57Q2hhbmdlTWFuYWdlcklEfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgZm9yIGxpbmsgZXZlbnRzIHRoZXJlIGlzIHNvbWUgaW5mbyBhYm91dCB0aGUgbGluawogICAgaWYgKCAkRXZlbnQgPX4gbXsgXEEgKD86IENoYW5nZSB8IFdvcmtPcmRlciApIExpbmsgKD86IEFkZCB8IERlbGV0ZSApIH14bXMgKSB7CiAgICAgICAgJExpbmsgPSB7CiAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkUGFyYW17RGF0YX0tPntTb3VyY2VPYmplY3R9LAogICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJFBhcmFte0RhdGF9LT57VGFyZ2V0T2JqZWN0fSwKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e1N0YXRlfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e1R5cGV9LAogICAgICAgICAgICBPYmplY3QgICAgICAgPT4gJFBhcmFte0RhdGF9LT57T2JqZWN0fSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICVBZ2VudHNTZW50OwoKICAgIEFHRU5USUQ6CiAgICBmb3IgbXkgJEFnZW50SUQgKCBAeyAkUGFyYW17QWdlbnRJRHN9IH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgbm90aWZpY2F0aW9uIHdhcyBhbHJlYWR5IHNlbnQgdG8gdGhpcyBhZ2VudAogICAgICAgIG5leHQgQUdFTlRJRCBpZiAkQWdlbnRzU2VudHskQWdlbnRJRH07CgogICAgICAgICMgVXNlciBpbmZvIGZvciBwcmVmZXJlZCBsYW5ndWFnZSBhbmQgbWFjcm8gcmVwbGFjZW1lbnQKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJEFnZW50SUQsCiAgICAgICAgKTsKICAgICAgICBteSAkUHJlZmVycmVkTGFuZ3VhZ2UKICAgICAgICAgICAgPSAkVXNlcntVc2VyTGFuZ3VhZ2V9IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwoKICAgICAgICBteSAkTm90aWZpY2F0aW9uS2V5CiAgICAgICAgICAgID0gJFByZWZlcnJlZExhbmd1YWdlIC4gJzo6QWdlbnQ6OicgLiAkUGFyYW17VHlwZX0gLiAnOjonIC4gJFBhcmFte0V2ZW50fTsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIChjYWNoZSB8fCBkYXRhYmFzZSkKICAgICAgICBteSAkTm90aWZpY2F0aW9uID0gJFNlbGYtPl9Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbktleSA9PiAkTm90aWZpY2F0aW9uS2V5LAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJE5vdGlmaWNhdGlvbjsKCiAgICAgICAgIyByZXBsYWNlIG90cnMgbWFjcm9zCiAgICAgICAgJE5vdGlmaWNhdGlvbi0+e0JvZHl9ID0gJFNlbGYtPl9Ob3RpZmljYXRpb25SZXBsYWNlTWFjcm9zKAogICAgICAgICAgICBUeXBlICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICBUZXh0ICAgICAgPT4gJE5vdGlmaWNhdGlvbi0+e0JvZHl9LAogICAgICAgICAgICBSZWNpcGllbnQgPT4geyVVc2VyfSwKICAgICAgICAgICAgUmljaFRleHQgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIENoYW5nZSAgICA9PiAkQ2hhbmdlLAogICAgICAgICAgICBXb3JrT3JkZXIgPT4gJFdvcmtPcmRlciwKICAgICAgICAgICAgTGluayAgICAgID0+ICRMaW5rLAogICAgICAgICAgICBEYXRhICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgICk7CgogICAgICAgICROb3RpZmljYXRpb24tPntTdWJqZWN0fSA9ICRTZWxmLT5fTm90aWZpY2F0aW9uUmVwbGFjZU1hY3JvcygKICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgVGV4dCAgICAgID0+ICROb3RpZmljYXRpb24tPntTdWJqZWN0fSwKICAgICAgICAgICAgUmVjaXBpZW50ID0+IHslVXNlcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgQ2hhbmdlICAgID0+ICRDaGFuZ2UsCiAgICAgICAgICAgIFdvcmtPcmRlciA9PiAkV29ya09yZGVyLAogICAgICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgICAgIERhdGEgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgdXJscyBhbmQgdmVyaWZ5IHRvIGJlIGZ1bGwgaHRtbCBkb2N1bWVudAogICAgICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAkTm90aWZpY2F0aW9uLT57Qm9keX0gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPkxpbmtRdW90ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9uLT57Qm9keX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTm90aWZpY2F0aW9uLT57Qm9keX0gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICROb3RpZmljYXRpb24tPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIFN0cmluZyAgPT4gJE5vdGlmaWNhdGlvbi0+e0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZW5kIG5vdGlmaWNhdGlvbgogICAgICAgICRTZWxmLT57U2VuZG1haWxPYmplY3R9LT5TZW5kKAogICAgICAgICAgICBGcm9tID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJOYW1lJykgLiAnIDwnCiAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpIC4gJz4nLAogICAgICAgICAgICBUbyAgICAgICA9PiAkVXNlcntVc2VyRW1haWx9LAogICAgICAgICAgICBTdWJqZWN0ICA9PiAkTm90aWZpY2F0aW9uLT57U3ViamVjdH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICROb3RpZmljYXRpb24tPntDb250ZW50VHlwZX0gfHwgJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBDaGFyc2V0ICA9PiAkTm90aWZpY2F0aW9uLT57Q2hhcnNldH0sCiAgICAgICAgICAgIEJvZHkgICAgID0+ICROb3RpZmljYXRpb24tPntCb2R5fSwKICAgICAgICAgICAgTG9vcCAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgZXZlbnQgdHlwZQogICAgICAgIG15ICRUeXBlOwogICAgICAgIGlmICggJEV2ZW50ID1+IG17IFxBIChDaGFuZ2V8QWN0aW9uRXhlY3V0ZSkgfXhtcyApIHsKICAgICAgICAgICAgJFR5cGUgPSAnQ2hhbmdlJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRXZlbnQgPX4gbXsgXEEgV29ya09yZGVyIH14bXMgKSB7CiAgICAgICAgICAgICRUeXBlID0gJ1dvcmtPcmRlcic7CiAgICAgICAgfQoKICAgICAgICAjIHRyaWdnZXIgTm90aWZpY2F0aW9uU2VudC1FdmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICRUeXBlIC4gJ05vdGlmaWNhdGlvblNlbnRQb3N0JywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBFdmVudFR5cGUgICA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICBUbyAgICAgICAgICA9PiAkVXNlcntVc2VyRW1haWx9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJEFnZW50c1NlbnR7JEFnZW50SUR9ID0gMTsKICAgIH0KCiAgICBteSAlQ3VzdG9tZXJzU2VudDsKCiAgICBDVVNUT01FUklEOgogICAgZm9yIG15ICRDdXN0b21lcklEICggQHsgJFBhcmFte0N1c3RvbWVySURzfSB9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSBzZW50IHRvIGN1c3RvbWVyCiAgICAgICAgbmV4dCBDVVNUT01FUklEIGlmICRDdXN0b21lcnNTZW50eyRDdXN0b21lcklEfTsKCiAgICAgICAgIyBVc2VyIGluZm8gZm9yIHByZWZlcmVkIGxhbmd1YWdlIGFuZCBtYWNybyByZXBsYWNlbWVudAogICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgKTsKICAgICAgICBteSAkUHJlZmVycmVkTGFuZ3VhZ2UKICAgICAgICAgICAgPSAkQ3VzdG9tZXJVc2Vye1VzZXJMYW5ndWFnZX0gfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CgogICAgICAgIG15ICROb3RpZmljYXRpb25LZXkKICAgICAgICAgICAgPSAkUHJlZmVycmVkTGFuZ3VhZ2UgLiAnOjpDdXN0b21lcjo6JyAuICRQYXJhbXtUeXBlfSAuICc6OicgLiAkUGFyYW17RXZlbnR9OwoKICAgICAgICAjIGdldCBub3RpZmljYXRpb24gKGNhY2hlIHx8IGRhdGFiYXNlKQogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkU2VsZi0+X05vdGlmaWNhdGlvbkdldCgKICAgICAgICAgICAgTm90aWZpY2F0aW9uS2V5ID0+ICROb3RpZmljYXRpb25LZXksCiAgICAgICAgKTsKCiAgICAgICAgIyByZXBsYWNlIG90cnMgbWFjcm9zCiAgICAgICAgJE5vdGlmaWNhdGlvbi0+e0JvZHl9ID0gJFNlbGYtPl9Ob3RpZmljYXRpb25SZXBsYWNlTWFjcm9zKAogICAgICAgICAgICBUeXBlICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICBUZXh0ICAgICAgPT4gJE5vdGlmaWNhdGlvbi0+e0JvZHl9LAogICAgICAgICAgICBSZWNpcGllbnQgPT4geyVDdXN0b21lclVzZXJ9LAogICAgICAgICAgICBSaWNoVGV4dCAgPT4gJFNlbGYtPntSaWNoVGV4dH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgQ2hhbmdlICAgID0+ICRDaGFuZ2UsCiAgICAgICAgICAgIFdvcmtPcmRlciA9PiAkV29ya09yZGVyLAogICAgICAgICAgICBMaW5rICAgICAgPT4gJExpbmssCiAgICAgICAgICAgIERhdGEgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgJE5vdGlmaWNhdGlvbi0+e1N1YmplY3R9ID0gJFNlbGYtPl9Ob3RpZmljYXRpb25SZXBsYWNlTWFjcm9zKAogICAgICAgICAgICBUeXBlICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICBUZXh0ICAgICAgPT4gJE5vdGlmaWNhdGlvbi0+e1N1YmplY3R9LAogICAgICAgICAgICBSZWNpcGllbnQgPT4geyVDdXN0b21lclVzZXJ9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIENoYW5nZSAgICA9PiAkQ2hhbmdlLAogICAgICAgICAgICBXb3JrT3JkZXIgPT4gJFdvcmtPcmRlciwKICAgICAgICAgICAgTGluayAgICAgID0+ICRMaW5rLAogICAgICAgICAgICBEYXRhICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgICk7CgogICAgICAgICMgc2VuZCBub3RpZmljYXRpb24KICAgICAgICAkU2VsZi0+e1NlbmRtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICAgICAgRnJvbSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyTmFtZScpIC4gJyA8JwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyRW1haWwnKSAuICc+JywKICAgICAgICAgICAgVG8gICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9LAogICAgICAgICAgICBTdWJqZWN0ICA9PiAkTm90aWZpY2F0aW9uLT57U3ViamVjdH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICROb3RpZmljYXRpb24tPntDb250ZW50VHlwZX0gfHwgJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBDaGFyc2V0ICA9PiAkTm90aWZpY2F0aW9uLT57Q2hhcnNldH0sCiAgICAgICAgICAgIEJvZHkgICAgID0+ICROb3RpZmljYXRpb24tPntCb2R5fSwKICAgICAgICAgICAgTG9vcCAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHRyaWdnZXIgTm90aWZpY2F0aW9uU2VudC1FdmVudAogICAgICAgIG15ICgkVHlwZSkgPSAkRXZlbnQgPX4gbXsgKFdvcmtPcmRlcnxDaGFuZ2UpIH14bXM7CiAgICAgICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICAgICAgRXZlbnQgPT4gJFR5cGUgLiAnTm90aWZpY2F0aW9uU2VudFBvc3QnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIEV2ZW50VHlwZSAgID0+ICRFdmVudCwKICAgICAgICAgICAgICAgIFRvICAgICAgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRDdXN0b21lcnNTZW50eyRDdXN0b21lcklEfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE5vdGlmaWNhdGlvblJ1bGVHZXQoKQoKR2V0IGluZm8gYWJvdXQgYSBzaW5nbGUgbm90aWZpY2F0aW9uIHJ1bGUKCiAgICBteSAkTm90aWZpY2F0aW9uUnVsZSA9ICROb3RpZmljYXRpb25PYmplY3QtPk5vdGlmaWNhdGlvblJ1bGVHZXQoCiAgICAgICAgSUQgPT4gMTIzLAogICAgKTsKCnJldHVybnMKCiAgICB7CiAgICAgICAgSUQgICAgICAgICAgID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ2EgZGVzY3JpcHRpdmUgbmFtZScsCiAgICAgICAgQXR0cmlidXRlICAgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgRXZlbnRJRCAgICAgID0+IDEsCiAgICAgICAgRXZlbnQgICAgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICA9PiAnZGVzY3JpcHRpb24gd2hhdCB0aGUgcnVsZSBkb2VzJywKICAgICAgICBSdWxlICAgICAgICAgPT4gJ3JlamVjdGVkJywKICAgICAgICBSZWNpcGllbnRzICAgPT4gWyAnQ2hhbmdlQnVpbGRlcicsICdDaGFuZ2VNYW5hZ2VyJywgJ0NoYW5nZUNBQkN1c3RvbWVycycgXSwKICAgICAgICBSZWNpcGllbnRJRHMgPT4gWyAyLCAzLCA3IF0sCiAgICB9Cgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uUnVsZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZG8gc3FsIHF1ZXJ5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNuLmlkLCBjbi5uYW1lLCBpdGVtX2F0dHJpYnV0ZSwgZXZlbnRfaWQsIGNodC5uYW1lLCAnCiAgICAgICAgICAgIC4gJ2NuLnZhbGlkX2lkLCBjbi5jb21tZW50cywgbm90aWZpY2F0aW9uX3J1bGUgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9ub3RpZmljYXRpb24gY24sIGNoYW5nZV9oaXN0b3J5X3R5cGUgY2h0ICcKICAgICAgICAgICAgLiAnV0hFUkUgZXZlbnRfaWQgPSBjaHQuaWQgQU5EIGNuLmlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggbm90aWZpY2F0aW9uIHJ1bGUKICAgIG15ICVOb3RpZmljYXRpb25SdWxlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAlTm90aWZpY2F0aW9uUnVsZSA9ICgKICAgICAgICAgICAgSUQgICAgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBBdHRyaWJ1dGUgICAgPT4gZGVmaW5lZCAkUm93WzJdID8gJFJvd1syXSA6ICcnLAogICAgICAgICAgICBFdmVudElEICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgUnVsZSAgICAgICAgID0+IGRlZmluZWQgJFJvd1s3XSA/ICRSb3dbN10gOiAnJywKICAgICAgICAgICAgUmVjaXBpZW50cyAgID0+IHVuZGVmLAogICAgICAgICAgICBSZWNpcGllbnRJRHMgPT4gdW5kZWYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhZGRpdGlvbmFsIGluZm8KICAgIGlmICglTm90aWZpY2F0aW9uUnVsZSkgewoKICAgICAgICAjIGdldCByZWNpcGllbnRzCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgZ3JwLmlkLCBncnAubmFtZSAnCiAgICAgICAgICAgICAgICAuICdGUk9NIGNoYW5nZV9ub3RpZmljYXRpb25fZ3JwcyBncnAsIGNoYW5nZV9ub3RpZmljYXRpb25fcmVjIHIgJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgZ3JwLmlkID0gci5ncm91cF9pZCBBTkQgci5ub3RpZmljYXRpb25faWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkTm90aWZpY2F0aW9uUnVsZXtJRH0gXSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHJlY2lwaWVudHMKICAgICAgICBteSBAUmVjaXBpZW50czsKICAgICAgICBteSBAUmVjaXBpZW50SURzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudElEcywgJFJvd1swXTsKICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50cywgICAkUm93WzFdOwogICAgICAgIH0KCiAgICAgICAgJE5vdGlmaWNhdGlvblJ1bGV7UmVjaXBpZW50c30gICA9IFxAUmVjaXBpZW50czsKICAgICAgICAkTm90aWZpY2F0aW9uUnVsZXtSZWNpcGllbnRJRHN9ID0gXEBSZWNpcGllbnRJRHM7CiAgICB9CgogICAgcmV0dXJuIFwlTm90aWZpY2F0aW9uUnVsZTsKfQoKPWl0ZW0gTm90aWZpY2F0aW9uUnVsZUFkZCgpCgpBZGQgYSBub3RpZmljYXRpb24gcnVsZS4gUmV0dXJucyB0aGUgSUQgb2YgdGhlIHJ1bGUuCgogICAgbXkgJElEID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZUFkZCgKICAgICAgICBOYW1lICAgICAgICAgPT4gJ2EgZGVzY3JpcHRpdmUgbmFtZScsCiAgICAgICAgQXR0cmlidXRlICAgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgRXZlbnRJRCAgICAgID0+IDEsCiAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICAgID0+ICdkZXNjcmlwdGlvbiB3aGF0IHRoZSBydWxlIGRvZXMnLAogICAgICAgIFJ1bGUgICAgICAgICA9PiAncmVqZWN0ZWQnLAogICAgICAgIFJlY2lwaWVudElEcyA9PiBbIDIsIDMsIDcgXSwKICAgICk7Cgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uUnVsZUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBFdmVudElEIFZhbGlkSUQgUmVjaXBpZW50SURzKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgUmVjaXBpZW50SURzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlCiAgICBpZiAoIHJlZiAkUGFyYW17UmVjaXBpZW50SURzfSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUmVjaXBpZW50SURzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzYXZlIG5vdGlmaWNhdGlvbiBydWxlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9ub3RpZmljYXRpb24gKG5hbWUsIGV2ZW50X2lkLCB2YWxpZF9pZCwgJwogICAgICAgICAgICAuICdpdGVtX2F0dHJpYnV0ZSwgY29tbWVudHMsIG5vdGlmaWNhdGlvbl9ydWxlKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgPywgPywgPywgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LCAgICAgIFwkUGFyYW17RXZlbnRJRH0sIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17QXR0cmlidXRlfSwgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtSdWxlfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBJRCBvZiBydWxlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGlkIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbiBXSEVSRSBuYW1lID0gPyBBTkQgZXZlbnRfaWQgPSA/IEFORCB2YWxpZF9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgaXRlbV9hdHRyaWJ1dGUgPSA/IEFORCBjb21tZW50cyA9ID8gQU5EIG5vdGlmaWNhdGlvbl9ydWxlID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sICAgICAgXCRQYXJhbXtFdmVudElEfSwgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtBdHRyaWJ1dGV9LCBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1J1bGV9LAogICAgICAgIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCBJRAogICAgbXkgJFJ1bGVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJ1bGVJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIGlmICEkUnVsZUlEOwoKICAgICMgaW5zZXJ0IHJlY2lwaWVudHMKICAgIGZvciBteSAkUmVjaXBpZW50SUQgKCBAeyAkUGFyYW17UmVjaXBpZW50SURzfSB9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNoYW5nZV9ub3RpZmljYXRpb25fcmVjIChub3RpZmljYXRpb25faWQsIGdyb3VwX2lkKSBWQUxVRVMgKD8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUnVsZUlELCBcJFJlY2lwaWVudElEIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFJ1bGVJRDsKfQoKPWl0ZW0gTm90aWZpY2F0aW9uUnVsZVVwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIG5vdGlmaWNhdGlvbiBydWxlCgogICAgbXkgJFN1Y2Nlc3MgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5Ob3RpZmljYXRpb25SdWxlVXBkYXRlKAogICAgICAgIElEICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdhIGRlc2NyaXB0aXZlIG5hbWUnLAogICAgICAgIEF0dHJpYnV0ZSAgICA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgIEV2ZW50SUQgICAgICA9PiAxLAogICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICA9PiAnZGVzY3JpcHRpb24gd2hhdCB0aGUgcnVsZSBkb2VzJywKICAgICAgICBSdWxlICAgICAgICAgPT4gJ3JlamVjdGVkJywKICAgICAgICBSZWNpcGllbnRJRHMgPT4gWyAyLCAzLCA3IF0sCiAgICApOwoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvblJ1bGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KElEIE5hbWUgRXZlbnRJRCBWYWxpZElEIFJlY2lwaWVudElEcykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFJlY2lwaWVudElEcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZQogICAgaWYgKCByZWYgJFBhcmFte1JlY2lwaWVudElEc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1JlY2lwaWVudElEcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2F2ZSBub3RpZmljYXRpb24gcnVsZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgY2hhbmdlX25vdGlmaWNhdGlvbiAnCiAgICAgICAgICAgIC4gJ1NFVCBuYW1lID0gPywgZXZlbnRfaWQgPSA/LCB2YWxpZF9pZCA9ID8sIGl0ZW1fYXR0cmlidXRlID0gPywgJwogICAgICAgICAgICAuICdjb21tZW50cyA9ID8sIG5vdGlmaWNhdGlvbl9ydWxlID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LCAgICAgIFwkUGFyYW17RXZlbnRJRH0sIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17QXR0cmlidXRlfSwgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtSdWxlfSwKICAgICAgICAgICAgXCRQYXJhbXtJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBkZWxldGUgb2xkIHJlY2lwaWVudCBlbnRyaWVzCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uX3JlYyBXSEVSRSBub3RpZmljYXRpb25faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7CgogICAgIyBpbnNlcnQgcmVjaXBpZW50cwogICAgZm9yIG15ICRSZWNpcGllbnRJRCAoIEB7ICRQYXJhbXtSZWNpcGllbnRJRHN9IH0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY2hhbmdlX25vdGlmaWNhdGlvbl9yZWMgKG5vdGlmaWNhdGlvbl9pZCwgZ3JvdXBfaWQpIFZBTFVFUyAoPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0sIFwkUmVjaXBpZW50SUQgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBOb3RpZmljYXRpb25SdWxlTGlzdCgpCgpyZXR1cm5zIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIElEcyBvZiBhbGwgZXhpc3Rpbmcgbm90aWZpY2F0aW9uIHJ1bGVzCgogICAgbXkgJExpc3QgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5Ob3RpZmljYXRpb25SdWxlTGlzdCgpOwoKcmV0dXJucwoKICAgIFsgMSwgMiwgMyBdCgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uUnVsZUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGRvIHNxbCBxdWVyeSwKICAgICMgc29ydCBpbiBhIHVzZXJmcmllbmRseSBmYXNoaW9uCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbiAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGV2ZW50X2lkLCBpdGVtX2F0dHJpYnV0ZSwgbm90aWZpY2F0aW9uX3J1bGUnLAogICAgKTsKCiAgICAjIGZldGNoIElEcwogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBASURzLCAkUm93WzBdLAogICAgfQoKICAgIHJldHVybiBcQElEczsKfQoKPWl0ZW0gTm90aWZpY2F0aW9uUnVsZVNlYXJjaCgpCgpSZXR1cm5zIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIElEcyBvZiBhbGwgbWF0Y2hpbmcgbm90aWZpY2F0aW9uIHJ1bGVzLgpUaGUgb25seSB2YWxpZCBzZWFyY2ggcGFyYW1ldGVyIGlzIHRoZSBFdmVudElELgoKICAgIG15ICROb3RpZmljYXRpb25SdWxlSURzID0gJE5vdGlmaWNhdGlvbk9iamVjdC0+Tm90aWZpY2F0aW9uUnVsZVNlYXJjaCgKICAgICAgICBFdmVudElEID0+IDQsICAgICMgb3B0aW9uYWwsIHByaW1hcnkga2V5IGluIGNoYW5nZV9oaXN0b3J5X3R5cGUKICAgICAgICBWYWxpZCAgID0+IDEsICAgICMgb3B0aW9uYWwsIGRlZmF1bHQgaXMgMQogICAgKTsKCnJldHVybnMKCiAgICBbIDEsIDIsIDMgXQoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvblJ1bGVTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVmFsaWQgPSBkZWZpbmVkICRQYXJhbXtWYWxpZH0gPyAkUGFyYW17VmFsaWR9IDogMTsKCiAgICBteSBAU1FMV2hlcmU7ICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCiAgICBteSBAU1FMQmluZDsgICAgICMgcGFyYW1ldGVycyBmb3IgdGhlIFdIRVJFIGNsYXVzZQoKICAgICMgZm9yIG5vdyB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgc2VhcmNoIHBhcmFtCiAgICBpZiAoICRQYXJhbXtFdmVudElEfSApIHsKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJ2NuLmV2ZW50X2lkID0gPyc7CiAgICAgICAgcHVzaCBAU1FMQmluZCwgIFwkUGFyYW17RXZlbnRJRH07CiAgICB9CgogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uIGNuICc7CgogICAgIyBhZGQgdGhlIFdIRVJFIGNsYXVzZQogICAgaWYgKEBTUUxXaGVyZSkgewogICAgICAgICRTUUwgLj0gJ1dIRVJFICc7CiAgICAgICAgJFNRTCAuPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICcgJzsKICAgIH0KCiAgICAjIGFkZCB2YWxpZCBvcHRpb24KICAgIGlmICgkVmFsaWQpIHsKICAgICAgICAkU1FMIC49ICdBTkQgY24udmFsaWRfaWQgSU4gKCcgLiBqb2luKCAnLCAnLCAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKSApIC4gJykgJzsKICAgIH0KCiAgICAjIGFkZCB0aGUgT1JERVIgQlkgY2xhdXNlCiAgICAkU1FMIC49ICdPUkRFUiBCWSBjbi5pZCAnOwoKICAgICMgZG8gc3FsIHF1ZXJ5CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAU1FMQmluZCwKICAgICk7CgogICAgIyBmZXRjaCBJRHMKICAgIG15IEBJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXSwKICAgIH0KCiAgICByZXR1cm4gXEBJRHM7Cn0KCj1pdGVtIFJlY2lwaWVudExvb2t1cCgpCgpSZXR1cm5zIHRoZSBJRCB3aGVuIHlvdSBwYXNzIHRoZSByZWNpcGllbnQgbmFtZSBhbmQgcmV0dXJucyB0aGUgbmFtZSBpZiB5b3UKcGFzcyB0aGUgcmVjaXBpZW50IElELgoKICAgIG15ICRJRCA9ICROb3RpZmljYXRpb25PYmplY3QtPlJlY2lwaWVudExvb2t1cCgKICAgICAgICBOYW1lID0+ICdDaGFuZ2VCdWlsZGVyJywKICAgICk7CgogICAgbXkgJE5hbWUgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5SZWNpcGllbnRMb29rdXAoCiAgICAgICAgSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBSZWNpcGllbnRMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0lEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgSUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte0lEfSAmJiAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBJRCBvciBOYW1lIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRldGVybWluZSBzcWwgc3RhdGVtZW50IGFuZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15ICRTUUw7CiAgICBteSBAQmluZHM7CiAgICBpZiAoICRQYXJhbXtJRH0gKSB7CiAgICAgICAgJFNRTCAgID0gJ1NFTEVDVCBuYW1lIEZST00gY2hhbmdlX25vdGlmaWNhdGlvbl9ncnBzIFdIRVJFIGlkID0gPyc7CiAgICAgICAgQEJpbmRzID0gKCBcJFBhcmFte0lEfSApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNRTCAgID0gJ1NFTEVDVCBpZCBGUk9NIGNoYW5nZV9ub3RpZmljYXRpb25fZ3JwcyBXSEVSRSBuYW1lID0gPyc7CiAgICAgICAgQEJpbmRzID0gKCBcJFBhcmFte05hbWV9ICk7CiAgICB9CgogICAgIyBkbyBzcWwgcXVlcnkKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmRzLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHZhbHVlCiAgICBteSAkVmFsdWU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRWYWx1ZSA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWl0ZW0gUmVjaXBpZW50TGlzdCgpCgpyZXR1cm5zIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIGhhc2hyZWZlcmVuY2VzLiBUaGUga2V5IG9mIHRoZSBoYXNocmVmZXJlbmNlIGlzIHRoZSBpZApvZiBhbiByZWNpcGllbnQgYW5kIHRoZSBuYW1lIGlzIHRoZSB2YWx1ZS4KCiAgICBteSAkTGlzdCA9ICROb3RpZmljYXRpb25PYmplY3QtPlJlY2lwaWVudExpc3QoKTsKCnJldHVybnMKCiAgICBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAxLAogICAgICAgICAgICBWYWx1ZSA9PiAnQ2hhbmdlQnVpbGRlcicKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gMiwKICAgICAgICAgICAgVmFsdWUgPT4gJ0NoYW5nZU1hbmFnZXInCiAgICAgICAgfSwKICAgIF0KCj1jdXQKCnN1YiBSZWNpcGllbnRMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBkbyBTUUwgcXVlcnkKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBjaGFuZ2Vfbm90aWZpY2F0aW9uX2dycHMgT1JERVIgQlkgbmFtZScsCiAgICApOwoKICAgICMgZmV0Y2ggcmVjaXBpZW50cwogICAgbXkgQFJlY2lwaWVudHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSApIHsKICAgICAgICBteSAkUmVjaXBpZW50ID0gewogICAgICAgICAgICBLZXkgICA9PiAkUm93WzBdLAogICAgICAgICAgICBWYWx1ZSA9PiAkUm93WzFdLAogICAgICAgIH07CiAgICAgICAgcHVzaCBAUmVjaXBpZW50cywgJFJlY2lwaWVudDsKICAgIH0KCiAgICByZXR1cm4gXEBSZWNpcGllbnRzOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfTm90aWZpY2F0aW9uR2V0KCkKCkdldCB0aGUgbm90aWZpY2F0aW9uIHRlbXBsYXRlIGZyb20gY2FjaGUgb3IgZnJvbSB0aGUgTm90aWZpY2F0aW9uT2JqZWN0LgpBbHNvIGNvbnZlcnQgdG8gbm90aWZpY2F0aW9uIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IHR5cGUuCgogICAgbXkgJE5vdGlmaWNhdGlvbiA9ICROb3RpZmljYXRpb25PYmplY3QtPl9Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgTm90aWZpY2F0aW9uS2V5ID0+ICdlbjo6QWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyVXBkYXRlJywKICAgICk7Cgo9Y3V0CgpzdWIgX05vdGlmaWNhdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5vdGlmaWNhdGlvbktleSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkTm90aWZpY2F0aW9uS2V5ID0gJFBhcmFte05vdGlmaWNhdGlvbktleX07CgogICAgIyBjaGVjayB0aGUgY2FjaGUKICAgIGlmICggJFNlbGYtPntOb3RpZmljYXRpb25DYWNoZX0tPnskTm90aWZpY2F0aW9uS2V5fSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntOb3RpZmljYXRpb25DYWNoZX0tPnskTm90aWZpY2F0aW9uS2V5fTsKICAgIH0KCiAgICAjIGdldCBmcm9tIGRhdGFiYXNlCiAgICBteSAlTm90aWZpY2F0aW9uRGF0YSA9ICRTZWxmLT57Tm90aWZpY2F0aW9uT2JqZWN0fS0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgIE5hbWUgPT4gJE5vdGlmaWNhdGlvbktleSwKICAgICk7CgogICAgIyBubyBub3RpZmljYXRpb24gZm91bmQKICAgIGlmICggISVOb3RpZmljYXRpb25EYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGZpbmQgbm90aWZpY2F0aW9uIGZvciAkTm90aWZpY2F0aW9uS2V5IiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICYmICROb3RpZmljYXRpb25EYXRhe0NvbnRlbnRUeXBlfSA9fiBteyB0ZXh0L3BsYWluIH14bXNpICkgewogICAgICAgICROb3RpZmljYXRpb25EYXRhe0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICROb3RpZmljYXRpb25EYXRhe0JvZHl9ICAgICAgICA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbkRhdGF7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGVsc2lmICggISRTZWxmLT57UmljaFRleHR9ICYmICROb3RpZmljYXRpb25EYXRhe0NvbnRlbnRUeXBlfSA9fiBteyB0ZXh0L2h0bWwgfXhtc2kgKSB7CiAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGF7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICROb3RpZmljYXRpb25EYXRhe0JvZHl9ICAgICAgICA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICROb3RpZmljYXRpb25EYXRhe0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjYWNoZSBkYXRhCiAgICAkU2VsZi0+e05vdGlmaWNhdGlvbkNhY2hlfS0+eyROb3RpZmljYXRpb25LZXl9ID0gXCVOb3RpZmljYXRpb25EYXRhOwoKICAgICMgcmV0dXJuIGRhdGEKICAgIHJldHVybiBcJU5vdGlmaWNhdGlvbkRhdGE7Cn0KCj1pdGVtIF9Ob3RpZmljYXRpb25SZXBsYWNlTWFjcm9zKCkKClRoaXMgbWV0aG9kIHJlcGxhY2VzIGFsbCB0aGUgPE9UUlNfeHh4eD4gbWFjcm9zIGluIG5vdGlmaWNhdGlvbiB0ZXh0LgoKICAgIG15ICRDbGVhblRleHQgPSAkTm90aWZpY2F0aW9uT2JqZWN0LT5fTm90aWZpY2F0aW9uUmVwbGFjZU1hY3JvcygKICAgICAgICBUeXBlICAgICAgPT4gJ0NoYW5nZScsICAgICMgQ2hhbmdlfFdvcmtPcmRlcgogICAgICAgIFRleHQgICAgICA9PiAnU29tZSA8T1RSU19DT05GSUdfRlFETj4gdGV4dCcsCiAgICAgICAgUmljaFRleHQgID0+IDEsICAgICAgICAgICMgb3B0aW9uYWwsIGlzIFRleHQgcmljaHRleHQgb3Igbm90LiBkZWZhdWx0IDAKICAgICAgICBSZWNpcGllbnQgPT4geyVVc2VyfSwKICAgICAgICBEYXRhICAgICAgPT4gewogICAgICAgICAgICBDaGFuZ2VCdWlsZGVyID0+IHsKICAgICAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ1RvbScsCiAgICAgICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdUZXN0ZXInLAogICAgICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAndHRAb3Rycy5jb20nLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlICAgID0+ICRDaGFuZ2UsCiAgICAgICAgV29ya09yZGVyID0+ICRXb3JrT3JkZXIsCiAgICAgICAgTGluayAgICAgID0+ICRMaW5rLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfTm90aWZpY2F0aW9uUmVwbGFjZU1hY3JvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBUZXh0IERhdGEgVXNlcklEIENoYW5nZSBXb3JrT3JkZXIgTGluaykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUZXh0ID0gJFBhcmFte1RleHR9OwoKICAgICMgZGV0ZXJtaW5lIHdoYXQgIm1hY3JvIiBkZWxpbWl0ZXJzIGFyZSB1c2VkCiAgICBteSAkU3RhcnQgPSAnPCc7CiAgICBteSAkRW5kICAgPSAnPic7CgogICAgIyB3aXRoIHJpY2h0ZXh0IGVuYWJsZWQsIHRoZSBkZWxpbWl0ZXJzIGNoYW5nZQogICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICRTdGFydCA9ICcmbHQ7JzsKICAgICAgICAkRW5kICAgPSAnJmd0Oyc7CiAgICAgICAgJFRleHQgPX4gc3sgKFxufFxyKSB9e314bXNnOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgbXkgJFRhZyA9ICRTdGFydCAuICdPVFJTX0NPTkZJR18nOwogICAgJFRleHQgPX4gc3sgJFRhZyAoLis/KSAkRW5kIH17JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJDEpfWVneDsKCiAgICAjIGNsZWFudXAKICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmQgfXstfWdpOwoKICAgICRUYWcgPSAkU3RhcnQgLiAnT1RSU19BZ2VudF8nOwogICAgbXkgJFRhZzIgPSAkU3RhcnQgLiAnT1RSU19DVVJSRU5UXyc7CiAgICBteSAlQ3VycmVudFVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSggVXNlcklEID0+ICRQYXJhbXtVc2VySUR9ICk7CgogICAgIyBodG1sIHF1b3Rpbmcgb2YgY29udGVudAogICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJUN1cnJlbnRVc2VyICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAhJEN1cnJlbnRVc2VyeyRLZXl9OwogICAgICAgICAgICAkQ3VycmVudFVzZXJ7JEtleX0gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ3VycmVudFVzZXJ7JEtleX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpdAogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBrZXlzICVDdXJyZW50VXNlciApIHsKICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkQ3VycmVudFVzZXJ7JEtleX07CiAgICAgICAgJFRleHQgPX4gc3sgJFRhZyAkS2V5ICRFbmQgfXskQ3VycmVudFVzZXJ7JEtleX19Z3htc2k7CiAgICAgICAgJFRleHQgPX4gc3sgJFRhZzIgJEtleSAkRW5kIH17JEN1cnJlbnRVc2VyeyRLZXl9fWd4bXNpOwogICAgfQoKICAgICMgcmVwbGFjZSBvdGhlciBuZWVkZWQgc3R1ZmYKICAgICRUZXh0ID1+IHN7ICRTdGFydCBPVFJTX0ZJUlNUX05BTUUgJEVuZCB9eyRDdXJyZW50VXNlcntVc2VyRmlyc3RuYW1lfX1neG1zOwogICAgJFRleHQgPX4gc3sgJFN0YXJ0IE9UUlNfTEFTVF9OQU1FICRFbmQgfXskQ3VycmVudFVzZXJ7VXNlckxhc3RuYW1lfX1neG1zOwoKICAgICMgY2xlYW51cAogICAgJFRleHQgPX4gc3sgJFRhZyAuKz8gJEVuZH17LX14bXNnaTsKICAgICRUZXh0ID1+IHN7ICRUYWcyIC4rPyAkRW5kfXstfXhtc2dpOwoKICAgICMgZ2V0IGFuZCBwcmVwYXJlIHJlYWxuYW1lCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UUlNfQ1VTVE9NRVJfUkVBTE5BTUUnOwogICAgJFRleHQgPX4gc3skVGFnJEVuZH17LX1nOwoKICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RSU19DVVNUT01FUl9EQVRBXy4uLgogICAgJFRhZyAgPSAkU3RhcnQgLiAnT1RSU19DVVNUT01FUl8nOwogICAgJFRhZzIgPSAkU3RhcnQgLiAnT1RSU19DVVNUT01FUl9EQVRBXyc7CgogICAgIyBjbGVhbnVwIGFsbCBub3QgbmVlZGVkIDxPVFJTX0NVU1RPTUVSX0RBVEFfIHRhZ3MKICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmQgfXstfXhtc2dpOwogICAgJFRleHQgPX4gc3sgJFRhZzIgLis/ICRFbmR9ey19eG1zZ2k7CgogICAgIyByZXBsYWNlIDxPVFJTX0NIQU5HRV8uLi4gdGFncwogICAgewogICAgICAgIG15ICRUYWcgICAgICAgID0gJFN0YXJ0IC4gJ09UUlNfQ0hBTkdFXyc7CiAgICAgICAgbXkgJUNoYW5nZURhdGEgPSAleyAkUGFyYW17Q2hhbmdlfSB9OwoKICAgICAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAlQ2hhbmdlRGF0YSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkQ2hhbmdlRGF0YXskS2V5fTsKICAgICAgICAgICAgICAgICRDaGFuZ2VEYXRheyRLZXl9ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDaGFuZ2VEYXRheyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIGl0CiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAlQ2hhbmdlRGF0YSApIHsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgIWRlZmluZWQgJENoYW5nZURhdGF7JEtleX07CiAgICAgICAgICAgICRUZXh0ID1+IHN7ICRUYWcgJEtleSAkRW5kIH17JENoYW5nZURhdGF7JEtleX19Z3htc2k7CiAgICAgICAgfQoKICAgICAgICAjIGNsZWFudXAKICAgICAgICAkVGV4dCA9fiBzeyAkVGFnIC4rPyAkRW5kfXstfWd4bXNpOwogICAgfQoKICAgICMgcmVwbGFjZSA8T1RSU19XT1JLT1JERVJfLi4uIHRhZ3MKICAgIHsKICAgICAgICBteSAkVGFnICAgICAgICAgICA9ICRTdGFydCAuICdPVFJTX1dPUktPUkRFUl8nOwogICAgICAgIG15ICVXb3JrT3JkZXJEYXRhID0gJXsgJFBhcmFte1dvcmtPcmRlcn0gfTsKCiAgICAgICAgIyBodG1sIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJVdvcmtPcmRlckRhdGEgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJFdvcmtPcmRlckRhdGF7JEtleX07CiAgICAgICAgICAgICAgICAkV29ya09yZGVyRGF0YXskS2V5fSA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkV29ya09yZGVyRGF0YXskS2V5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSBpdAogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJVdvcmtPcmRlckRhdGEgKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRXb3JrT3JkZXJEYXRheyRLZXl9OwogICAgICAgICAgICAkVGV4dCA9fiBzeyAkVGFnICRLZXkgJEVuZCB9eyRXb3JrT3JkZXJEYXRheyRLZXl9fWd4bXNpOwogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbnVwCiAgICAgICAgJFRleHQgPX4gc3sgJFRhZyAuKz8gJEVuZH17LX1neG1zaTsKICAgIH0KCiAgICAjIHJlcGxhY2UgPE9UUlNfQ09ORElUSU9OLi4uIHRhZ3MKICAgIHsKICAgICAgICBteSAkVGFnICA9ICRTdGFydCAuICdPVFJTX0NPTkRJVElPTl8nOwogICAgICAgIG15ICVEYXRhID0gJXsgJFBhcmFte0RhdGF9IH07CgogICAgICAgICMgaHRtbCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICVEYXRhICkgewogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISREYXRheyRLZXl9OwogICAgICAgICAgICAgICAgJERhdGF7JEtleX0gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7JEtleX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlcGxhY2UgaXQKICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICVEYXRhICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkRGF0YXskS2V5fTsKICAgICAgICAgICAgJFRleHQgPX4gc3sgJFRhZyAkS2V5ICRFbmQgfXskRGF0YXskS2V5fX1neG1zaTsKICAgICAgICB9CgogICAgICAgICMgY2xlYW51cAogICAgICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmR9ey19Z3htc2k7CiAgICB9CgogICAgIyByZXBsYWNlIDxPVFJTX0xJTktfLi4uIHRhZ3MKICAgIHsKICAgICAgICBteSAkVGFnICAgICAgPSAkU3RhcnQgLiAnT1RSU19MSU5LXyc7CiAgICAgICAgbXkgJUxpbmtEYXRhID0gJXsgJFBhcmFte0xpbmt9IH07CgogICAgICAgICMgaHRtbCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICVMaW5rRGF0YSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkTGlua0RhdGF7JEtleX07CiAgICAgICAgICAgICAgICAkTGlua0RhdGF7JEtleX0gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExpbmtEYXRheyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIGl0CiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAlTGlua0RhdGEgKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRMaW5rRGF0YXskS2V5fTsKICAgICAgICAgICAgJFRleHQgPX4gc3sgJFRhZyAkS2V5ICRFbmQgfXskTGlua0RhdGF7JEtleX19Z3htc2k7CiAgICAgICAgfQoKICAgICAgICAjIGNsZWFudXAKICAgICAgICAkVGV4dCA9fiBzeyAkVGFnIC4rPyAkRW5kfXstfWd4bXNpOwogICAgfQoKICAgICMgcmVwbGFjZSBleHRlbmRlZCA8T1RSU19DSEFOR0VfLi4uIHRhZ3MKICAgIG15ICVJbmZvSGFzaCA9ICV7ICRQYXJhbXtEYXRhfSB9OwoKICAgIGZvciBteSAkT2JqZWN0IChxdyhDaGFuZ2VCdWlsZGVyIENoYW5nZU1hbmFnZXIgV29ya09yZGVyQWdlbnQpKSB7CiAgICAgICAgbXkgJFRhZyA9ICRTdGFydCAuIHVjICdPVFJTXycgLiAkT2JqZWN0IC4gJ18nOwoKICAgICAgICBpZiAoIGV4aXN0cyAkSW5mb0hhc2h7JE9iamVjdH0gJiYgcmVmICRJbmZvSGFzaHskT2JqZWN0fSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICAgICBLRVk6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEluZm9IYXNoeyRPYmplY3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRJbmZvSGFzaHskT2JqZWN0fS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgICRJbmZvSGFzaHskT2JqZWN0fS0+eyRLZXl9ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkSW5mb0hhc2h7JE9iamVjdH0tPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlcGxhY2UgaXQKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJEluZm9IYXNoeyRPYmplY3R9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkSW5mb0hhc2h7JE9iamVjdH0tPnskS2V5fTsKICAgICAgICAgICAgICAgICRUZXh0ID1+IHN7ICRUYWcgJEtleSAkRW5kIH17JEluZm9IYXNoeyRPYmplY3R9LT57JEtleX19Z3htc2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2xlYW51cAogICAgICAgICRUZXh0ID1+IHN7ICRUYWcgLis/ICRFbmR9ey19Z3htc2k7CiAgICB9CgogICAgIyBnZXQgcmVjaXBpZW50IGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RSU18uLi4KICAgICRUYWcgPSAkU3RhcnQgLiAnT1RSU18nOwogICAgaWYgKCAkUGFyYW17UmVjaXBpZW50fSApIHsKCiAgICAgICAgIyBodG1sIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte1JlY2lwaWVudH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkUGFyYW17UmVjaXBpZW50fS0+eyRLZXl9OwogICAgICAgICAgICAgICAgJFBhcmFte1JlY2lwaWVudH0tPnskS2V5fSA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17UmVjaXBpZW50fS0+eyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIGl0CiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17UmVjaXBpZW50fSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkUGFyYW17UmVjaXBpZW50fS0+eyRLZXl9OwogICAgICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17UmVjaXBpZW50fS0+eyRLZXl9OwogICAgICAgICAgICAkVGV4dCA9fiBzeyAkVGFnICRLZXkgJEVuZCB9eyRWYWx1ZX1neG1zaTsKICAgICAgICB9CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkVGV4dCA9fiBzeyAkVGFnIC4rPyAkRW5kfXstfWd4bXNpOwoKICAgIHJldHVybiAkVGV4dDsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQyIFRoZSBmb2xsb3dpbmcgcGxhY2Vob2xkZXJzIGNhbiBiZSB1c2VkIGluIENoYW5nZTo6eHh4IG5vdGlmaWNhdGlvbnMKCj1oZWFkMyBDPE9UUlNfQ0hBTkdFX3h4eD4KCndpdGggdGhlIHN1YnNlcXVlbnQgdmFsdWVzIGZvciB4eHg6CgogICAgQ2hhbmdlSUQKICAgICAgICBUaGUgSUQgb2YgdGhlIGNoYW5nZQogICAgQ2hhbmdlTnVtYmVyCiAgICAgICAgVGhlIG51bWJlciBvZiB0aGUgY2hhbmdlCiAgICBDaGFuZ2VTdGF0ZUlECiAgICAgICAgVGhlIElEIG9mIHRoZSBjaGFuZ2Ugc3RhdGUKICAgIENoYW5nZVN0YXRlCiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNoYW5nZSBzdGF0ZSAoZS5nLiByZXF1ZXN0ZWQsIGFwcHJvdmVkKQogICAgQ2hhbmdlU3RhdGVTaWduYWwKICAgIENoYW5nZVRpdGxlCiAgICAgICAgVGhlIGNoYW5nZSB0aXRsZQogICAgRGVzY3JpcHRpb24KICAgICAgICBUaGUgIm9yaWdpbmFsIiBkZXNjcmlwdGlvbi4gUGxlYXNlIG5vdGU6IElmIHJpY2h0ZXh0IGZlYXR1cmUgaXMgZW5hYmxlZCwKICAgICAgICB0aGlzIGNvbnRhaW5zIEhUTUwgbWFya3VwLiBTbyB0aGlzIGNhbiBiZSB1c2VkIHRvIHNlbmQgSFRNTCBub3RpZmljYXRpb25zLgogICAgRGVzY3JpcHRpb25QbGFpbgogICAgICAgIFRoaXMgaXMgdGhlIHBsYWluIGRlc2NyaXB0aW9uIHdpdGhvdXQgYW55IEhUTUwgbWFya3VwLiBUaGlzIGlzIGJldHRlciBmb3IgcGxhaW4gbm90aWZpY2F0aW9ucy4KICAgIEp1c3RpZmljYXRpb24KICAgICAgICBUaGUgc2FtZSBhcyBmb3IgRGVzY3JpcHRpb24gYXBwbGllcyBoZXJlLgogICAgSnVzdGlmaWNhdGlvblBsYWluCiAgICAgICAgU2VlIERlc2NyaXB0aW9uUGxhaW4uCiAgICBDaGFuZ2VCdWlsZGVySUQKICAgICAgICBDaGFuZ2UgYnVpbGRlciBJRAogICAgQ2hhbmdlTWFuYWdlcklECiAgICAgICAgQ2hhbmdlIG1hbmFnZXIgSUQKICAgIENhdGVnb3J5SUQKICAgICAgICBJRCBvZiBjaGFuZ2VzJyBjYXRlZ29yeS4KICAgIENhdGVnb3J5CiAgICAgICAgTmFtZSBvZiBjaGFuZ2VzJyBjYXRlZ29yeS4KICAgIEltcGFjdElECiAgICAgICAgSUQgb2YgY2hhbmdlcycgaW1wYWN0LgogICAgSW1wYWN0CiAgICAgICAgTmFtZSBvZiBjaGFuZ2VzJyBpbXBhY3QuCiAgICBQcmlvcml0eUlECiAgICAgICAgSUQgb2YgY2hhbmdlcycgcHJpb3JpdHkuCiAgICBQcmlvcml0eQogICAgICAgIE5hbWUgb2YgY2hhbmdlcycgcHJpb3JpdHkuCiAgICBXb3JrT3JkZXJDb3VudAogICAgICAgIE51bWJlciBvZiBhbGwgd29yayBvcmRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGNoYW5nZS4KICAgIFJlcXVlc3RlZFRpbWUKICAgICAgICBUaGUgdGltZSB0aGUgY3VzdG9tZXIgd2FudCB0aGUgY2hhbmdlIHRvIGJlIGZpbmlzaGVkLgogICAgUGxhbm5lZEVmZm9ydAogICAgICAgIFN1bSBvZiB0aGUgcGxhbm5lZCBlZmZvcnRzIChjYWxjdWxhdGVkIGZyb20gdGhlIHdvcmtvcmRlcnMpLgogICAgQWNjb3VudGVkVGltZQogICAgICAgIEFjY291bnRlZCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCiAgICBQbGFubmVkU3RhcnRUaW1lCiAgICAgICAgUGxhbm5lZCBzdGFydCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCiAgICBQbGFubmVkRW5kVGltZQogICAgICAgIFBsYW5uZWQgZW5kIHRpbWUgb2YgdGhlIGNoYW5nZSAoY2FsY3VsYXRlZCBmcm9tIHRoZSB3b3Jrb3JkZXJzKS4KICAgIEFjdHVhbFN0YXJ0VGltZQogICAgICAgIEFjdHVhbCBzdGFydCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCiAgICBBY3R1YWxFbmRUaW1lCiAgICAgICAgQWN0dWFsIGVuZCB0aW1lIG9mIHRoZSBjaGFuZ2UgKGNhbGN1bGF0ZWQgZnJvbSB0aGUgd29ya29yZGVycykuCgo9aGVhZDMgQzxPVFJTX0NIQU5HRUJVSUxERVJfeHh4PiwgQzxPVFJTX0NIQU5HRU1BTkFHRVJfeHh4PiwgQzxPVFJTX1dPUktPUkRFUkFHRU5UX3h4eD4KCndpdGggdGhlIHN1YnNlcXVlbnQgdmFsdWVzIGZvciB4eHg6CgogICAgVXNlckZpcnN0bmFtZQogICAgICAgIEZpcnN0bmFtZSBvZiB0aGUgcGVyc29uLgogICAgVXNlckxhc3RuYW1lCiAgICAgICAgTGFzdG5hbWUgb2YgdGhlIHBlcnNvbi4KICAgIFVzZXJFbWFpbAogICAgICAgIEVtYWlsIGFkZHJlc3Mgb2YgdGhlIHBlcnNvbi4KCj1oZWFkMyBDPE9UUlNfV09SS09SREVSX3h4eD4KCndpdGggdGhlIHN1YnNlcXVlbnQgdmFsdWVzIGZvciB4eHg6CgogICAgV29ya09yZGVySUQKICAgICAgICBJRCBvZiB0aGUgd29ya29yZGVyCiAgICBDaGFuZ2VJRAogICAgICAgIElEIG9mIHRoZSBjaGFuZ2UgdGhlIHdvcmtvcmRlciBiZWxvbmdzIHRvLgogICAgV29ya09yZGVyTnVtYmVyCiAgICAgICAgV29ya29yZGVyIG51bWJlcgogICAgV29ya09yZGVyVGl0bGUKICAgICAgICBUaXRsZSBvZiB0aGUgd29ya29yZGVyCiAgICBJbnN0cnVjdGlvbgogICAgICAgIFNlZSBDaGFuZ2UgcGxhY2Vob2xkZXJzIC0+IERlc2NyaXB0aW9uCiAgICBJbnN0cnVjdGlvblBsYWluCiAgICAgICAgU2VlIENoYW5nZSBwbGFjZWhvbGRlcnMgLT4gRGVzY3JpcHRpb25QbGFpbgogICAgUmVwb3J0CiAgICAgICAgU2VlIENoYW5nZSBwbGFjZWhvbGRlcnMgLT4gRGVzY3JpcHRpb24KICAgIFJlcG9ydFBsYWluCiAgICAgICAgU2VlIENoYW5nZSBwbGFjZWhvbGRlcnMgLT4gRGVzY3JpcHRpb25QbGFpbgogICAgV29ya09yZGVyU3RhdGVJRAogICAgICAgIElEIG9mIHRoZSB3b3Jrb3JkZXIgc3RhdGUuCiAgICBXb3JrT3JkZXJTdGF0ZQogICAgICAgIE5hbWUgb2YgdGhlIHdvcmtvcmRlciBzdGF0ZS4KICAgIFdvcmtPcmRlclN0YXRlU2lnbmFsCiAgICBXb3JrT3JkZXJUeXBlSUQKICAgICAgICBJRCBvZiB0aGUgd29ya29yZGVyIHR5cGUuCiAgICBXb3JrT3JkZXJUeXBlCiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHdvcmsgb3JkZXIgdHlwZS4KICAgIFdvcmtPcmRlckFnZW50SUQKICAgICAgICBUaGUgSUQgb2YgdGhlIHdvcmtvcmRlciBhZ2VudC4KICAgIFBsYW5uZWRTdGFydFRpbWUKICAgICAgICBUaGUgcGxhbm5lZCBzdGFydCB0aW1lIGZvciB0aGUgd29ya29yZGVyLgogICAgUGxhbm5lZEVuZFRpbWUKICAgICAgICBUaGUgcGxhbm5lZCBlbmQgdGltZSBmb3IgdGhlIHdvcmtvcmRlci4KICAgIEFjdHVhbFN0YXJ0VGltZQogICAgICAgIFdoZW4gZGlkIHRoZSB3b3Jrb3JkZXIgYWN0dWFsbHkgc3RhcnQuCiAgICBBY3R1YWxFbmRUaW1lCiAgICAgICAgV2hlbiBkaWQgdGhlIHdvcmtvcmRlciBhY3R1YWxseSBlbmQuCiAgICBBY2NvdW50ZWRUaW1lCiAgICAgICAgVGhlIHNvIGZhciBhY2NvdW50ZWQgdGltZSBmb3IgdGhlIHNpbmdsZSB3b3Jrb3JkZXIKICAgIFBsYW5uZWRFZmZvcnQKICAgICAgICBUaGlzIGlzIHRoZSBlZmZvcnQgcGxhbm5lZCBmb3IgdGhlIHNpbmdsZSB3b3Jrb3JkZXIuCgo9aGVhZDMgQzxPVFJTX0xJTktfeHh4PgoKd2l0aCB0aGUgc3Vic2VxdWVudCB2YWx1ZXMgZm9yIHh4eDoKCiAgICBPYmplY3QKICAgICAgICBvdGhlciBvYmplY3Qgb2YgdGhlIGxpbmsKICAgIFNvdXJjZU9iamVjdAogICAgICAgIG90aGVyIG9iamVjdCBvZiB0aGUgbGluaywgd2hlbiB0aGUgb3RoZXIgb2JqZWN0IGlzIHRoZSBzb3VyY2UKICAgIFRhcmdldE9iamVjdAogICAgICAgIG90aGVyIG9iamVjdCBvZiB0aGUgbGluaywgd2hlbiB0aGUgb3RoZXIgb2JqZWN0IGlzdCB0aGUgdGFyZ2V0CiAgICBTdGF0ZQogICAgICAgIFN0YXRlIG9mIHRoZSBsaW5rCiAgICBUeXBlCiAgICAgICAgVHlwZSBvZiB0aGUgbGluawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQxICQgJERhdGU6IDIwMTAvMDUvMjEgMTA6MjI6MTIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS5wbSAtIGFsbCB0ZW1wbGF0ZSBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRlbXBsYXRlLnBtLHYgMS41NSAyMDEwLzA2LzI5IDEyOjU2OjMxIHNiIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlM7CnVzZSBEYXRhOjpEdW1wZXI7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNTUgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZSAtIHRlbXBsYXRlIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIGZvciB0ZW1wbGF0ZXMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVGVtcGxhdGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWJ1ZyBmbGFnCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmlydHVhbEZTT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnICAgICA9PiAnSVRTTVRlbXBsYXRlOjpFdmVudE1vZHVsZScsCiAgICAgICAgQmFzZU9iamVjdCA9PiAnVGVtcGxhdGVPYmplY3QnLAogICAgICAgIE9iamVjdHMgICAgPT4gewogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFRlbXBsYXRlQWRkKCkKCkFkZCBhIG5ldyB0ZW1wbGF0ZS4KCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1RoZSB0ZW1wbGF0ZSBuYW1lJywKICAgICAgICBDb250ZW50ICAgICAgICA9PiAnW3sgQ2hhbmdlQWRkID0+IHsgLi4uIH0gfV0nLCAgICMgYSBzZXJpYWxpemVkIGNoYW5nZSwgd29ya29yZGVyLCAuLi4KICAgICAgICBDb21tZW50ICAgICAgICA9PiAnQSBjb21tZW50JywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFRlbXBsYXRlVHlwZSAgID0+ICdJVFNNQ2hhbmdlJywgICAgICAgICAgICAgICAgICAgIyBhbHRlcm5hdGl2ZWx5OiBUZW1wbGF0ZVR5cGVJRAogICAgICAgIFRlbXBsYXRlVHlwZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbHRlcm5hdGl2ZWx5OiBUZW1wbGF0ZVR5cGUKICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFRlbXBsYXRlVHlwZSBhbmQgVGVtcGxhdGVUeXBlSUQgYXJlIGdpdmVuCiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGV9ICYmICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBUZW1wbGF0ZVR5cGUgT1IgVGVtcGxhdGVUeXBlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgd2hlbiB0aGUgdGVtcGxhdGUgdHlwZSBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVUeXBlSUR9ID0gJFNlbGYtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRQYXJhbXtUZW1wbGF0ZVR5cGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbnRlbnQgTmFtZSBUZW1wbGF0ZVR5cGVJRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB3aGV0aGVyIGEgdGVtcGxhdGUgd2l0aCB0aGlzIG5hbWUgYW5kIHR5cGUgYWxyZWFkeSBleGlzdHMKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNoYW5nZV90ZW1wbGF0ZSBXSEVSRSBuYW1lID0gPyBBTkQgdHlwZV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRUZW1wbGF0ZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyBhIHRlbXBsYXRlIHdpdGggdGhpcyBuYW1lIGV4aXN0cyBhbHJlYWR5CiAgICBpZiAoJFRlbXBsYXRlSUQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkEgdGVtcGxhdGUgd2l0aCB0aGUgbmFtZSAnJFBhcmFte05hbWV9JyBhbmQgdGhlIHR5cGUgJyRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0nIGFscmVhZHkgZXhpc3RzISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlQWRkUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdUZW1wbGF0ZUFkZFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgYWRkIG5ldyB0ZW1wbGF0ZSB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjaGFuZ2VfdGVtcGxhdGUgJwogICAgICAgICAgICAuICcobmFtZSwgY29tbWVudHMsIGNvbnRlbnQsIHR5cGVfaWQsIHZhbGlkX2lkLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtDb21tZW50fSwgXCRQYXJhbXtDb250ZW50fSwgXCRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBjaGFuZ2VfdGVtcGxhdGUgV0hFUkUgbmFtZSA9ID8gQU5EIHR5cGVfaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VGVtcGxhdGVUeXBlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRlbXBsYXRlIGNvdWxkIGJlIGFkZGVkCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlQWRkKCkgZmFpbGVkIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlQWRkUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVGVtcGxhdGVBZGRQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBUT0RPOiBhbGwgYXR0YWNobWVudHMgaW4gdGhlIHRlbXBsYXRlIHNob3VsZCBiZSBjb3BpZWQKICAgICMgaW4gdGhlIHZpcnR1YWwgZnMuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhbgogICAgIyBhdHRhY2htZW50IGlzIGRlbGV0ZWQgYWZ0ZXIgdGVtcGxhdGUgY3JlYXRpb24gYW5kIHRoZXJlZm9yZQogICAgIyBubyBsb25nZXIgYXZhaWxhYmxlLgoKICAgIHJldHVybiAkVGVtcGxhdGVJRDsKfQoKPWl0ZW0gVGVtcGxhdGVVcGRhdGUoKQoKVXBkYXRlIGEgdGVtcGxhdGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzNCwKICAgICAgICBOYW1lICAgICAgID0+ICdUaGUgdGVtcGxhdGUgbmFtZScsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENvbW1lbnQgICAgPT4gJ0EgY29tbWVudCcsICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ29udGVudCAgPT4gJ1t7IENoYW5nZUFkZCA9PiB7IC4uLiB9IH1dJywgICAjIChvcHRpb25hbCkgYSBzZXJpYWxpemVkIGNoYW5nZSwgd29ya29yZGVyLCAuLi4KICAgICAgICBWYWxpZElEICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFR5cGVJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlVXBkYXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdUZW1wbGF0ZVVwZGF0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBtYXAgdXBkYXRlIGF0dHJpYnV0ZXMgdG8gY29sdW1uIG5hbWVzCiAgICBteSAlQXR0cmlidXRlID0gKAogICAgICAgIE5hbWUgICAgPT4gJ25hbWUnLAogICAgICAgIENvbW1lbnQgPT4gJ2NvbW1lbnRzJywKICAgICAgICBDb250ZW50ID0+ICdjb250ZW50JywKICAgICAgICBWYWxpZElEID0+ICd2YWxpZF9pZCcsCiAgICAgICAgVHlwZUlEICA9PiAndHlwZV9pZCcsCiAgICApOwoKICAgICMgYnVpbGQgU1FMIHRvIHVwZGF0ZSB0ZW1wbGF0ZQogICAgbXkgJFNRTCA9ICdVUERBVEUgY2hhbmdlX3RlbXBsYXRlIFNFVCAnOwogICAgbXkgQEJpbmQ7CgogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICVBdHRyaWJ1dGUgKSB7CgogICAgICAgICMgcHJlc2VydmUgdGhlIG9sZCB2YWx1ZSwgd2hlbiB0aGUgY29sdW1uIGlzbid0IGluIGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZXhpc3RzICRQYXJhbXskQXR0cmlidXRlfTsKCiAgICAgICAgIyBwYXJhbSBjaGVja2luZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNvIHRoaXMgaXMgc2FmZQogICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17JEF0dHJpYnV0ZX07CiAgICB9CgogICAgIyBhZGQgY2hhbmdlIHRpbWUgYW5kIGNoYW5nZSB1c2VyCiAgICAkU1FMIC49ICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICc7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CgogICAgIyBzZXQgbWF0Y2hpbmcgb2YgU1FMIHN0YXRlbWVudAogICAgJFNRTCAuPSAnV0hFUkUgaWQgPSA/JzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VGVtcGxhdGVJRH07CgogICAgIyB1cGRhdGUgdGVtcGxhdGUKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyB0cmlnZ2VyIFRlbXBsYXRlVXBkYXRlUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVGVtcGxhdGVVcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIE9sZFRlbXBsYXRlRGF0YSA9PiAkVGVtcGxhdGVEYXRhLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgVE9ETzogYWxsIGF0dGFjaG1lbnRzIGluIHRoZSB0ZW1wbGF0ZSBzaG91bGQgYmUgY29waWVkCiAgICAjIGluIHRoZSB2aXJ0dWFsIGZzLiBPdGhlcndpc2UgaXQgY291bGQgaGFwcGVuIHRoYXQgYW4KICAgICMgYXR0YWNobWVudCBpcyBkZWxldGVkIGFmdGVyIHRlbXBsYXRlIGNyZWF0aW9uIGFuZCB0aGVyZWZvcmUKICAgICMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVGVtcGxhdGVHZXQoKQoKUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIG9mIHRoZSB0ZW1wbGF0ZSBkYXRhIGZvciBhIGdpdmVuIFRlbXBsYXRlSUQuCgogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgZm9sbG93aW5nIGVsZW1lbnRzOgoKICAgICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH0KICAgICRUZW1wbGF0ZURhdGF7TmFtZX0KICAgICRUZW1wbGF0ZURhdGF7Q29tbWVudH0KICAgICRUZW1wbGF0ZURhdGF7Q29udGVudH0KICAgICRUZW1wbGF0ZURhdGF7VHlwZUlEfQogICAgJFRlbXBsYXRlRGF0YXtUeXBlfQogICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlQnl9Cgo9Y3V0CgpzdWIgVGVtcGxhdGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGN0LmlkLCBjdC5uYW1lLCBjb21tZW50cywgY29udGVudCwgdHlwZV9pZCwgY3R0Lm5hbWUsICcKICAgICAgICAgICAgLiAnY3QudmFsaWRfaWQsIGN0LmNyZWF0ZV90aW1lLCBjdC5jcmVhdGVfYnksIGN0LmNoYW5nZV90aW1lLCBjdC5jaGFuZ2VfYnkgJwogICAgICAgICAgICAuICdGUk9NIGNoYW5nZV90ZW1wbGF0ZSBjdCwgY2hhbmdlX3RlbXBsYXRlX3R5cGUgY3R0ICcKICAgICAgICAgICAgLiAnV0hFUkUgY3QudHlwZV9pZCA9IGN0dC5pZCBBTkQgY3QuaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVUZW1wbGF0ZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH0gPSAkUm93WzBdOwogICAgICAgICRUZW1wbGF0ZURhdGF7TmFtZX0gICAgICAgPSAkUm93WzFdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzJdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q29udGVudH0gICAgPSAkUm93WzNdOwogICAgICAgICRUZW1wbGF0ZURhdGF7VHlwZUlEfSAgICAgPSAkUm93WzRdOwogICAgICAgICRUZW1wbGF0ZURhdGF7VHlwZX0gICAgICAgPSAkUm93WzVdOwogICAgICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0gICAgPSAkUm93WzZdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzddOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9ICAgPSAkUm93WzhdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzldOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzEwXTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElVGVtcGxhdGVEYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGVJRCAkUGFyYW17VGVtcGxhdGVJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNsZWFudXAgdGltZSBzdGFtcHMgKHNvbWUgZGF0YWJhc2VzIGFyZSB1c2luZyBlLiBnLiAyMDA4LTAyLTI1IDIyOjAzOjAwLjAwMDAwMCkKICAgIFRJTUVGSUVMRDoKICAgIGZvciBteSAkVGltZWZpZWxkICggJ0NyZWF0ZVRpbWUnLCAnQ2hhbmdlVGltZScsICkgewogICAgICAgIG5leHQgVElNRUZJRUxEIGlmICEkVGVtcGxhdGVEYXRheyRUaW1lZmllbGR9OwogICAgICAgICRUZW1wbGF0ZURhdGF7JFRpbWVmaWVsZH0KICAgICAgICAgICAgPX4gc3sgXEEgKCBcZFxkXGRcZCAtIFxkXGQgLSBcZFxkIFxzIFxkXGQ6XGRcZDpcZFxkICkgXC4gLis/IFx6IH17JDF9eG1zOwogICAgfQoKICAgIHJldHVybiBcJVRlbXBsYXRlRGF0YTsKfQoKPWl0ZW0gVGVtcGxhdGVMaXN0KCkKCnJldHVybiBhIGhhc2hyZWYgb2YgYWxsIHRlbXBsYXRlcwoKICAgIG15ICRUZW1wbGF0ZXMgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICAgICAgQ29tbWVudExlbmd0aCAgPT4gMTUsICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFRlbXBsYXRlVHlwZSAgID0+ICdJVFNNQ2hhbmdlJyAgICMgKG9wdGlvbmFsKSBvciBUZW1wbGF0ZVR5cGUKICAgICAgICBUZW1wbGF0ZVR5cGVJRCA9PiAxLCAgICAgICAgICAgICAjIChvcHRpb25hbCkgb3IgVGVtcGxhdGVUeXBlSUQKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgKTsKCnJldHVybnMKCiAgICAkVGVtcGxhdGVzID0gewogICAgICAgIDEgPT4gJ215IHRlbXBsYXRlJywKICAgICAgICAzID0+ICd5b3VyIHRlbXBsYXRlIG5hbWUnLAogICAgfTsKCklmIHBhcmFtZXRlciBDPENvbW1lbnRMZW5ndGg+IGlzIHBhc3NlZCwgYW4gZXhjZXJwdCAob2YgdGhlIHBhc3NlZCBsZW5ndGgpCm9mIHRoZSBjb21tZW50IGlzIGFwcGVuZGVkIHRvIHRoZSB0ZW1wbGF0ZSBuYW1lLgpJZiB0aGUgcGFyYW1ldGVyIEM8VGVtcGxhdGVUeXBlPiBvciBDPFRlbXBsYXRlVHlwZUlEPiBpcyBwYXNzZWQsIHRoZW4gdGhlCmxpc3Qgb2YgdGVtcGxhdGVzIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIGdpdmVuIHR5cGUuCgo9Y3V0CgpzdWIgVGVtcGxhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFRlbXBsYXRlVHlwZSBhbmQgVGVtcGxhdGVUeXBlSUQgYXJlIGdpdmVuCiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGV9ICYmICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBUZW1wbGF0ZVR5cGUgT1IgVGVtcGxhdGVUeXBlSUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgd2hlbiB0aGUgdGVtcGxhdGUgdHlwZSBpcyBnaXZlbiwgdGhlbiBsb29rIHVwIHRoZSBJRAogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVUeXBlSUR9ID0gJFNlbGYtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRQYXJhbXtUZW1wbGF0ZVR5cGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgZGVmaW5lIFNRTCBzdGF0ZW1lbnQKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBuYW1lLCBjb21tZW50cyBGUk9NIGNoYW5nZV90ZW1wbGF0ZSAnOwogICAgbXkgQFNRTFdoZXJlOyAgICAjIGFzc2VtYmxlIHRoZSBjb25kaXRpb25zIHVzZWQgaW4gdGhlIFdIRVJFIGNsYXVzZQogICAgbXkgQFNRTEJpbmQ7CgogICAgIyByZXN0cmljdCBieSB0ZW1wbGF0ZSB0eXBlCiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICJ0eXBlX2lkID0gPyI7CiAgICAgICAgcHVzaCBAU1FMQmluZCwgIFwkUGFyYW17VGVtcGxhdGVUeXBlSUR9OwogICAgfQoKICAgICMgZ2V0IG9ubHkgdmFsaWQgdGVtcGxhdGUgaWRzCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CgogICAgICAgIG15IEBWYWxpZElEcyA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZElEc0dldCgpOwogICAgICAgIG15ICRWYWxpZElEU3RyaW5nID0gam9pbiAnLCAnLCBAVmFsaWRJRHM7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAidmFsaWRfaWQgSU4gKCAkVmFsaWRJRFN0cmluZyApIjsKICAgIH0KCiAgICAjIGFwcGVuZCB0aGUgV0hFUkUtY2xhdXNlCiAgICBpZiAoQFNRTFdoZXJlKSB7CiAgICAgICAgJFNRTCAuPSAnV0hFUkUgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJyBBTkQgJywgbWFwIHsiKCAkXyApIn0gQFNRTFdoZXJlOwogICAgICAgICRTUUwgLj0gJyAnOwogICAgfQoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAU1FMQmluZCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVGVtcGxhdGVzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVzeyAkUm93WzBdIH0gPSBbICRSb3dbMV0sICRSb3dbMl0gXTsKICAgIH0KCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRlbXBsYXRlcyApIHsKICAgICAgICBteSAoICROYW1lLCAkQ29tbWVudCApID0gQHsgJFRlbXBsYXRlc3skS2V5fSB9OwoKICAgICAgICBteSAkQ29tbWVudEFwcGVuZCA9ICcnOwogICAgICAgIGlmICggJFBhcmFte0NvbW1lbnRMZW5ndGh9ICYmICRDb21tZW50ICkgewogICAgICAgICAgICBteSAkTGVuZ3RoID0gJFBhcmFte0NvbW1lbnRMZW5ndGh9ID4gbGVuZ3RoICRDb21tZW50CiAgICAgICAgICAgICAgICA/IGxlbmd0aCAkQ29tbWVudAogICAgICAgICAgICAgICAgOiAkUGFyYW17Q29tbWVudExlbmd0aH07CiAgICAgICAgICAgIG15ICRFbGxpcHNpcyA9ICRQYXJhbXtDb21tZW50TGVuZ3RofSA+IGxlbmd0aCAkQ29tbWVudAogICAgICAgICAgICAgICAgPyAnJwogICAgICAgICAgICAgICAgOiAnLi4uJzsKICAgICAgICAgICAgJENvbW1lbnQgPSBzdWJzdHIgJENvbW1lbnQsIDAsICRMZW5ndGg7CiAgICAgICAgICAgICRDb21tZW50QXBwZW5kID0gJyAoJyAuICRDb21tZW50IC4gJEVsbGlwc2lzIC4gJyknOwogICAgICAgIH0KCiAgICAgICAgJFRlbXBsYXRlc3skS2V5fSA9ICROYW1lIC4gJENvbW1lbnRBcHBlbmQ7CiAgICB9CgogICAgcmV0dXJuIFwlVGVtcGxhdGVzOwp9Cgo9aXRlbSBUZW1wbGF0ZVNlYXJjaCgpCgpSZXR1cm5zIGVpdGhlciBhIGxpc3QsIGFzIGFuIGFycmF5cmVmLCBvciBhIGNvdW50IG9mIGZvdW5kIHRlbXBsYXRlIGlkcy4KVGhlIGNvdW50IG9mIHJlc3VsdHMgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcGFyYW1ldGVyIEM8UmVzdWx0ID0+ICdDT1VOVCc+IGlzIHBhc3NlZC4KClRoZSBzZWFyY2ggY3JpdGVyaWEgYXJlIGxvZ2ljYWxseSBBTkQgY29ubmVjdGVkLgpXaGVuIGEgbGlzdCBpcyBwYXNzZWQgYXMgY3JpdGVyaXVtLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaXVtCmlzIGlnbm9yZWQuCgogICAgbXkgJFRlbXBsYXRlSURzUmVmID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVNlYXJjaCgKCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ1NhbXBsZSB0ZW1wbGF0ZScsICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ29tbWVudCAgICAgICAgICAgPT4gJ2p1c3QgYW4gZXhhbXBsZScsICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIFRlbXBsYXRlVHlwZUlEcyAgID0+IFsgMTEsIDEyIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFRlbXBsYXRlVHlwZXMgICAgID0+IFsgJ0lUU01DaGFuZ2UnLCAnQ0FCJyBdLCAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBDcmVhdGVCeSAgICAgICAgICA9PiBbIDUsIDIsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCeSAgICAgICAgICA9PiBbIDMsIDIsIDEgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyB0ZW1wbGF0ZXMgd2l0aCBjcmVhdGVkIHRpbWUgYWZ0ZXIgLi4uCiAgICAgICAgQ3JlYXRlVGltZU5ld2VyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0wOSAwMDowMDowMScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyB0ZW1wbGF0ZXMgd2l0aCBjcmVhdGVkIHRpbWUgYmVmb3JlIHRoZW4gLi4uLgogICAgICAgIENyZWF0ZVRpbWVPbGRlckRhdGUgICAgICAgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLCAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHRlbXBsYXRlcyB3aXRoIGNoYW5nZWQgdGltZSBhZnRlciAuLi4KICAgICAgICBDaGFuZ2VUaW1lTmV3ZXJEYXRlICAgICAgID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIHRlbXBsYXRlcyB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgdGhlbiAuLi4uCiAgICAgICAgQ2hhbmdlVGltZU9sZGVyRGF0ZSAgICAgICA9PiAnMjAwNi0wMS0xOSAyMzo1OTo1OScsICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIE9yZGVyQnkgPT4gWyAnVGVtcGxhdGVJRCcsICdOYW1lJyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyBkZWZhdWx0OiBbICdUZW1wbGF0ZUlEJyBdLAogICAgICAgICMgKFRlbXBsYXRlSUQsIE5hbWUsIENvbW1lbnQsIFRlbXBsYXRlVHlwZUlELAogICAgICAgICMgQ3JlYXRlVGltZSwgQ3JlYXRlQnksIENoYW5nZVRpbWUsIENoYW5nZUJ5KQoKICAgICAgICAjIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIE9yZGVyQnk6CiAgICAgICAgIyBUaGUgT3JkZXJCeURpcmVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIE9yZGVyQnkgYXR0cmlidXRlLgogICAgICAgICMgVGhlIHBhaXJpbmcgaXMgbWFkZSBieSB0aGUgYXJyYXkgaW5kaWNlcy4KCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbICdEb3duJywgJ1VwJyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ0Rvd24nIF0KICAgICAgICAjIChEb3duIHwgVXApCgogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgKDAgfCAxKSBkZWZhdWx0IDEKCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScgfHwgJ0NPVU5UJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBBUlJBWSwgcmV0dXJucyBhbiBhcnJheSBvZiB0ZW1wbGF0ZSBpZHMKICAgICAgICAjIENPVU5UIHJldHVybnMgYSBzY2FsYXIgd2l0aCB0aGUgbnVtYmVyIG9mIGZvdW5kIHRlbXBsYXRlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwoKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYKICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoCiAgICAgICAgcXcoCiAgICAgICAgT3JkZXJCeQogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24KICAgICAgICBUZW1wbGF0ZVR5cGVzCiAgICAgICAgVGVtcGxhdGVUeXBlSURzCiAgICAgICAgQ3JlYXRlQnkKICAgICAgICBDaGFuZ2VCeQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXskQXJndW1lbnR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSBAU1FMV2hlcmU7ICAgICMgYXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlCgogICAgIyBkZWZpbmUgb3JkZXIgdGFibGUKICAgIG15ICVPcmRlckJ5VGFibGUgPSAoCiAgICAgICAgVGVtcGxhdGVJRCAgICAgPT4gJ3QuaWQnLAogICAgICAgIE5hbWUgICAgICAgICAgID0+ICd0Lm5hbWUnLAogICAgICAgIENvbW1lbnQgICAgICAgID0+ICd0LmNvbW1lbnRzJywKICAgICAgICBUZW1wbGF0ZVR5cGVJRCA9PiAndC50eXBlX2lkJywKICAgICAgICBWYWxpZElEICAgICAgICA9PiAndC52YWxpZF9pZCcsCiAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gJ3QuY3JlYXRlX3RpbWUnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICd0LmNyZWF0ZV9ieScsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgPT4gJ3QuY2hhbmdlX3RpbWUnLAogICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICd0LmNoYW5nZV9ieScsCiAgICApOwoKICAgICMgY2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMKICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoICEkT3JkZXJCeSB8fCAhJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0gfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknICIKICAgICAgICAgICAgICAgICAgICAuICdvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicKICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgb25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAjIGZvdW5kIGFuIGVycm9yCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRQYXJhbXtVc2luZ1dpbGRjYXJkc30gPSAxOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIFRlbXBsYXRlVHlwZUlEcyBhcmUgYWxsIHZhbGlkCiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ2hlY2tUZW1wbGF0ZVR5cGVJRHMoCiAgICAgICAgVGVtcGxhdGVUeXBlSURzID0+ICRQYXJhbXtUZW1wbGF0ZVR5cGVJRHN9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBsb29rIHVwIGFuZCB0aHVzIGNoZWNrIHRoZSBUZW1wbGF0ZVR5cGVzCiAgICBmb3IgbXkgJFR5cGUgKCBAeyAkUGFyYW17VGVtcGxhdGVUeXBlc30gfSApIHsKCiAgICAgICAgIyBnZXQgdGhlIElEIGZvciB0aGUgbmFtZQogICAgICAgIG15ICRUeXBlSUQgPSAkU2VsZi0+VGVtcGxhdGVUeXBlTG9va3VwKAogICAgICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJFR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSBJRCB3YXMgZm91bmQsIHdoZXRoZXIgdGhlIG5hbWUgZXhpc3RzCiAgICAgICAgaWYgKCAhJFR5cGVJRCApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSB0ZW1wbGF0ZSB0eXBlICckVHlwZScgaXMgbm90IGtub3duISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte1RlbXBsYXRlVHlwZUlEc30gfSwgJFR5cGVJRDsKICAgIH0KCiAgICAjIGFkZCBzdHJpbmcgcGFyYW1zIHRvIHRoZSBXSEVSRSBjbGF1c2UKICAgIG15ICVTdHJpbmdQYXJhbXMgPSAoCiAgICAgICAgTmFtZSAgICA9PiAndC5uYW1lJywKICAgICAgICBDb21tZW50ID0+ICd0LmNvbW1lbnRzJywKICAgICk7CgogICAgIyBhZGQgc3RyaW5nIHBhcmFtcyB0byBzcWwtd2hlcmUtYXJyYXkKICAgIFNUUklOR1BBUkFNOgogICAgZm9yIG15ICRTdHJpbmdQYXJhbSAoIGtleXMgJVN0cmluZ1BhcmFtcyApIHsKCiAgICAgICAgIyBjaGVjayBzdHJpbmcgcGFyYW1zIGZvciB1c2VmdWwgdmFsdWVzLCB0aGUgc3RyaW5nICcwJyBpcyBhbGxvd2VkCiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAhZXhpc3RzICRQYXJhbXskU3RyaW5nUGFyYW19OwogICAgICAgIG5leHQgU1RSSU5HUEFSQU0gaWYgIWRlZmluZWQgJFBhcmFteyRTdHJpbmdQYXJhbX07CiAgICAgICAgbmV4dCBTVFJJTkdQQVJBTSBpZiAkUGFyYW17JFN0cmluZ1BhcmFtfSBlcSAnJzsKCiAgICAgICAgIyBxdW90ZQogICAgICAgICRQYXJhbXskU3RyaW5nUGFyYW19ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JFN0cmluZ1BhcmFtfSApOwoKICAgICAgICAjIHdpbGRjYXJkcyBhcmUgdXNlZAogICAgICAgIGlmICggJFBhcmFte1VzaW5nV2lsZGNhcmRzfSApIHsKCiAgICAgICAgICAgICMgUXVvdGUKICAgICAgICAgICAgJFBhcmFteyRTdHJpbmdQYXJhbX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskU3RyaW5nUGFyYW19LCAnTGlrZScgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSAqIHdpdGggJQogICAgICAgICAgICAkUGFyYW17JFN0cmluZ1BhcmFtfSA9fiBzeyBcKisgfXslfXhtc2c7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2Ugc3RyaW5nIHBhcmFtcyB3aGljaCBjb250YWluIG9ubHkgJQogICAgICAgICAgICBuZXh0IFNUUklOR1BBUkFNIGlmICRQYXJhbXskU3RyaW5nUGFyYW19ID1+IG17IFxBICUqIFx6IH14bXM7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwKICAgICAgICAgICAgICAgICJMT1dFUigkU3RyaW5nUGFyYW1zeyRTdHJpbmdQYXJhbX0pIExJS0UgTE9XRVIoJyRQYXJhbXskU3RyaW5nUGFyYW19JykiOwogICAgICAgIH0KCiAgICAgICAgIyBubyB3aWxkY2FyZHMgYXJlIHVzZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICAgICAiTE9XRVIoJFN0cmluZ1BhcmFtc3skU3RyaW5nUGFyYW19KSA9IExPV0VSKCckUGFyYW17JFN0cmluZ1BhcmFtfScpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYXJyYXkgcGFyYW1zCiAgICBteSAlQXJyYXlQYXJhbXMgPSAoCiAgICAgICAgVGVtcGxhdGVUeXBlSURzID0+ICd0LnR5cGVfaWQnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAndC5jcmVhdGVfYnknLAogICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAndC5jaGFuZ2VfYnknLAogICAgKTsKCiAgICAjIGFkZCBhcnJheSBwYXJhbXMgdG8gc3FsLXdoZXJlLWFycmF5CiAgICBBUlJBWVBBUkFNOgogICAgZm9yIG15ICRBcnJheVBhcmFtICgga2V5cyAlQXJyYXlQYXJhbXMgKSB7CgogICAgICAgICMgaWdub3JlIGVtcHR5IGxpc3RzCiAgICAgICAgbmV4dCBBUlJBWVBBUkFNIGlmICFAeyAkUGFyYW17JEFycmF5UGFyYW19IH07CgogICAgICAgICMgcXVvdGUKICAgICAgICBmb3IgbXkgJE9uZVBhcmFtICggQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9ICkgewogICAgICAgICAgICAkT25lUGFyYW0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJE9uZVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHN0cmluZwogICAgICAgIG15ICRJblN0cmluZyA9IGpvaW4gJywgJywgQHsgJFBhcmFteyRBcnJheVBhcmFtfSB9OwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRBcnJheVBhcmFtc3skQXJyYXlQYXJhbX0gSU4gKCRJblN0cmluZykiOwogICAgfQoKICAgICMgY2hlY2sgdGhlIHRpbWUgcGFyYW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgV0hFUkUgY2xhdXNlIG9mIHRoZSBTRUxFQ1QtU3RhdGVtZW50CiAgICBteSAlVGltZVBhcmFtcyA9ICgKICAgICAgICBDcmVhdGVUaW1lTmV3ZXJEYXRlID0+ICd0LmNyZWF0ZV90aW1lID49JywKICAgICAgICBDcmVhdGVUaW1lT2xkZXJEYXRlID0+ICd0LmNyZWF0ZV90aW1lIDw9JywKICAgICAgICBDaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICd0LmNoYW5nZV90aW1lID49JywKICAgICAgICBDaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICd0LmNoYW5nZV90aW1lIDw9JywKICAgICk7CiAgICBUSU1FUEFSQU06CiAgICBmb3IgbXkgJFRpbWVQYXJhbSAoIGtleXMgJVRpbWVQYXJhbXMgKSB7CgogICAgICAgIG5leHQgVElNRVBBUkFNIGlmICEkUGFyYW17JFRpbWVQYXJhbX07CgogICAgICAgIGlmICggJFBhcmFteyRUaW1lUGFyYW19ICF+IG17IFxBIFxkXGRcZFxkLVxkXGQtXGRcZCBccyBcZFxkOlxkXGQ6XGRcZCBceiB9eG1zICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHBhcmFtZXRlciAkVGltZVBhcmFtIGhhcyBhbiBpbnZhbGlkIGRhdGUgZm9ybWF0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17JFRpbWVQYXJhbX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskVGltZVBhcmFtfSApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgIiRUaW1lUGFyYW1zeyRUaW1lUGFyYW19ICckUGFyYW17JFRpbWVQYXJhbX0nIjsKICAgIH0KCiAgICAjIGRlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFBhcmFte09yZGVyQnl9ID0gW107CiAgICB9CgogICAgIyBhc3NlbWJsZSB0aGUgT1JERVIgQlkgY2xhdXNlCiAgICBteSBAU1FMT3JkZXJCeTsKICAgIG15ICRDb3VudCA9IDA7CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgIyBzZXQgdGhlIGRlZmF1bHQgb3JkZXIgZGlyZWN0aW9uCiAgICAgICAgbXkgJERpcmVjdGlvbiA9ICdERVNDJzsKCiAgICAgICAgIyBhZGQgdGhlIGdpdmVuIG9yZGVyIGRpcmVjdGlvbgogICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0FTQyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0tPlskQ291bnRdIGVxICdEb3duJyApIHsKICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnREVTQyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIFNRTAogICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAkRGlyZWN0aW9uIjsKICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICAkQ291bnQrKzsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgb3JkZXJpbmcgaXMgbm90IGRldGVybWluZWQKICAgICMgd2UgYWRkIGFuIGRlc2NlbmRpbmcgb3JkZXJpbmcgYnkgaWQKICAgIGlmICggIWdyZXAgeyAkXyBlcSAnVGVtcGxhdGVJRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7VGVtcGxhdGVJRH0gREVTQyI7CiAgICB9CgogICAgIyBhc3NlbWJsZSB0aGUgU1FMIHF1ZXJ5CiAgICBteSAkU1FMID0gJ1NFTEVDVCB0LmlkIEZST00gY2hhbmdlX3RlbXBsYXRlIHQgJzsKCiAgICAjIG1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICMgVGhlcmUgaXMgbm8gJ0dST1VQIEJZJyBTUUwtY2xhdXNlLCB0aGVyZWZvcmUgQ09VTlQoYy5pZCkgYWx3YXlzIGdpdmUgdGhlIHdhbnRlZCBjb3VudAogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTCAgICAgICAgPSAnU0VMRUNUIENPVU5UKHQuaWQpIEZST00gY2hhbmdlX3RlbXBsYXRlIHQgJzsKICAgICAgICBAU1FMT3JkZXJCeSA9ICgpOwogICAgfQoKICAgICMgYWRkIHRoZSBXSEVSRSBjbGF1c2UKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICAkU1FMIC49ICdXSEVSRSAnOwogICAgICAgICRTUUwgLj0gam9pbiAnIEFORCAnLCBtYXAgeyIoICRfICkifSBAU1FMV2hlcmU7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBhZGQgdGhlIE9SREVSIEJZIGNsYXVzZQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgJFNRTCAuPSAnT1JERVIgQlkgJzsKICAgICAgICAkU1FMIC49IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgIyBpZ25vcmUgdGhlIHBhcmFtZXRlciAnTGltaXQnIHdoZW4gcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFBhcmFte0xpbWl0fSA9IDE7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIHJldHVybiB0aGUgY291bnQgYXMgc2NhbGFyCiAgICByZXR1cm4gJElEc1swXSBpZiAkUmVzdWx0IGVxICdDT1VOVCc7CgogICAgcmV0dXJuIFxASURzOwp9Cgo9aXRlbSBUZW1wbGF0ZURlbGV0ZSgpCgpEZWxldGUgYSB0ZW1wbGF0ZS4KCiAgICBteSAkU3VjY2VzcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdHJpZ2dlciBUZW1wbGF0ZURlbGV0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnVGVtcGxhdGVEZWxldGVQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIHRlbXBsYXRlIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoYW5nZV90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgdHJpZ2dlciBUZW1wbGF0ZURlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ1RlbXBsYXRlRGVsZXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBPbGRUZW1wbGF0ZURhdGEgPT4gJFRlbXBsYXRlRGF0YSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVGVtcGxhdGVUeXBlTG9va3VwKCkKClJldHVybiB0aGUgdGVtcGxhdGUgdHlwZSBpZCB3aGVuIHRoZSB0ZW1wbGF0ZSB0eXBlIG5hbWUgaXMgcGFzc2VkLgpSZXR1cm4gdGhlIHRlbXBsYXRlIHR5cGUgbmFtZSB3aGVuIHRoZSB0ZW1wbGF0ZSB0eXBlIGlkIGlzIHBhc3NlZC4KV2hlbiBubyB0ZW1wbGF0ZSB0eXBlIGlkIG9yIHRlbXBsYXRlIHR5cGUgbmFtZSBpcyBmb3VuZCwgdGhlbiB0aGUKdW5kZWZpbmVkIHZhbHVlIGlzIHJldHVybmVkLgoKICAgIG15ICRUeXBlSUQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ215IHRlbXBsYXRlIHR5cGUgbmFtZScsCiAgICApOwoKICAgIG15ICRUeHBlTmFtZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVUeXBlTG9va3VwKAogICAgICAgIFRlbXBsYXRlVHlwZUlEID0+IDQyLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVR5cGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRoZSB0ZW1wbGF0ZSB0eXBlIGlkIG9yIHRoZSB0ZW1wbGF0ZSB0eXBlIG5hbWUgbXVzdCBiZSBwYXNzZWQKICAgIGlmICggISRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gJiYgISRQYXJhbXtUZW1wbGF0ZVR5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCB0aGUgVGVtcGxhdGVUeXBlSUQgb3IgdGhlIFRlbXBsYXRlVHlwZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgb25seSBvbmUgb2YgdGVtcGxhdGUgaWQgYW5kIHRlbXBsYXRlIG5hbWUgY2FuIGJlIHBhc3NlZAogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlSUR9ICYmICRQYXJhbXtUZW1wbGF0ZVR5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgdGhlIFRlbXBsYXRlVHlwZSBvciB0aGUgVGVtcGxhdGVUZW1wbGF0ZUlELCBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHR5cGUgaWQKICAgIGlmICggJFBhcmFte1RlbXBsYXRlVHlwZX0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNoYW5nZV90ZW1wbGF0ZV90eXBlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlVHlwZX0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkVHlwZUlEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRUeXBlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRUeXBlSUQ7CiAgICB9CgogICAgIyBnZXQgdHlwZSBuYW1lCiAgICBlbHNpZiAoICRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gKSB7CgogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIGNoYW5nZV90ZW1wbGF0ZV90eXBlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZVR5cGVJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkVHlwZU5hbWU7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFR5cGVOYW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkVHlwZU5hbWU7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBUZW1wbGF0ZVNlcmlhbGl6ZSgpCgpUaGlzIG1ldGhvZCBpcyBpbiBmYWN0IGEgZGlzcGF0Y2hlciBmb3IgZGlmZmVyZW50IHRlbXBsYXRlIHR5cGVzLgpDdXJyZW50bHkgSVRTTUNoYW5nZU1hbmFnZW1lbnQgc3VwcG9ydHMgdGhlc2UgdGVtcGxhdGUgdHlwZXM6CgpJVFNNQ2hhbmdlCklUU01Xb3JrT3JkZXIKQ0FCCklUU01Db25kaXRpb24KClRoZSBtZXRob2QgcmV0dXJucyBhIGRhdGFzdHJ1Y3R1cmUsIHNlcmlhbGl6ZWQgd2l0aCBEYXRhOjpEdW1wZXIuCgogICAgbXkgJENoYW5nZVRlbXBsYXRlID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVNlcmlhbGl6ZSgKICAgICAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFN0YXRlUmVzZXQgICA9PiAxLCAjIChvcHRpb25hbCkgcmVzZXQgdG8gZGVmYXVsdCBzdGF0ZQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAoKICAgICAgICAjIG90aGVyIG9wdGlvbnMgbmVlZGVkIGRlcGVuZGluZyBvbiB0aGUgdGVtcGxhdGUgdHlwZQogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVTZXJpYWxpemUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdGhlIHRlbXBsYXRlIHR5cGUgaWQgb3IgdGhlIHRlbXBsYXRlIHR5cGUgbmFtZSBtdXN0IGJlIHBhc3NlZAogICAgaWYgKCAhJFBhcmFte1RlbXBsYXRlVHlwZUlEfSAmJiAhJFBhcmFte1RlbXBsYXRlVHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIHRoZSBUZW1wbGF0ZVR5cGVJRCBvciB0aGUgVGVtcGxhdGVUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBvbmx5IG9uZSBvZiB0ZW1wbGF0ZSB0eXBlIG5hbWUgYW5kIHRlbXBsYXRlIHR5cGUgaWQgY2FuIGJlIHBhc3NlZAogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlfSAmJiAkUGFyYW17VGVtcGxhdGVUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgdGhlIFRlbXBsYXRlVHlwZUlEIG9yIHRoZSBUZW1wbGF0ZVR5cGUsIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFRlbXBsYXRlVHlwZSA9ICRQYXJhbXtUZW1wbGF0ZVR5cGV9OwogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlSUR9ICkgewogICAgICAgICRUZW1wbGF0ZVR5cGUgPSAkU2VsZi0+VGVtcGxhdGVUeXBlTG9va3VwKAogICAgICAgICAgICBUZW1wbGF0ZVR5cGVJRCA9PiAkUGFyYW17VGVtcGxhdGVUeXBlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyB3aGF0IHR5cGVzIG9mIHRlbXBsYXRlcyBhcmUgc3VwcG9ydGVkIGFuZCB3aGF0IHN1YnJvdXRpbmVzIGRvIHRoZSBzZXJpYWxpemF0aW9uCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fVGVtcGxhdGVMb2FkQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRUZW1wbGF0ZVR5cGUsCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgbXkgJFNlcmlhbGl6ZWREYXRhID0gJEJhY2tlbmRPYmplY3QtPlNlcmlhbGl6ZSgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkU2VyaWFsaXplZERhdGE7Cn0KCj1pdGVtIFRlbXBsYXRlRGVTZXJpYWxpemUoKQoKVGhpcyBtZXRob2QgZGVzZXJpYWxpemVzIHRoZSB0ZW1wbGF0ZSBjb250ZW50LiBJdCByZXR1cm5zIHRoZQpJRCBvZiB0aGUgIm1haW4iIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUuCgogICAgbXkgJEVsZW1lbnRJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVEZVNlcmlhbGl6ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlRGVTZXJpYWxpemUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFRlbXBsYXRlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlCiAgICBteSAkVGVtcGxhdGUgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRUZW1wbGF0ZTsKCiAgICAjIGdldCB0aGUgUGVybCBkYXRhc3RydWN0dXJlCiAgICBteSAkVGVtcGxhdGVDb250ZW50ID0gJFRlbXBsYXRlLT57Q29udGVudH07CiAgICBteSAkVkFSMTsKCiAgICBldmFsICJcJFZBUjEgPSAkVGVtcGxhdGVDb250ZW50OyAxOyIgb3IgcmV0dXJuOwoKICAgIHJldHVybiBpZiAhJFZBUjE7CiAgICByZXR1cm4gaWYgcmVmICRWQVIxIG5lICdIQVNIJzsKCiAgICAjIGNyZWF0ZSBlbnRpdGllcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZQogICAgbXkgJUluZm8gPSAkU2VsZi0+X0NyZWF0ZVRlbXBsYXRlRWxlbWVudHMoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFRlbXBsYXRlID0+ICRWQVIxLAogICAgKTsKCiAgICByZXR1cm4gJEluZm97SUR9Owp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfQ3JlYXRlVGVtcGxhdGVFbGVtZW50cygpCgpUaGlzIG1ldGhvZCBkaXNwYXRjaGVzIHRoZSBlbGVtZW50cyBjcmVhdGlvbi4gSXQgY2FsbHMgdGhlIHN1YnJvdXRpbmUKdGhhdCBiZWxvbmdzIHRvIHRoZSBnaXZlbiB0eXBlIChlLmcuIENoYW5nZUFkZCkuIEFmdGVyIHRoYXQgaXQKaW52b2tlcyBpdHNlbGYgZm9yIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBtYWluIGVsZW1lbnQuCgpUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCBvZiB0aGUgbWFpbiBlbGVtZW50LgoKICAgIG15ICRFbGVtZW50SUQgPSAkVGVtcGxhdGVPYmplY3QtPl9DcmVhdGVUZW1wbGF0ZUVsZW1lbnRzKAogICAgICAgIFRlbXBsYXRlID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsgLi4uIH0sCiAgICAgICAgICAgIENoaWxkcmVuICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsgLi4uIH0sCiAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW4gICAgID0+IFsgLi4uIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7IC4uLiB9LAogICAgICAgICAgICAgICAgICAgIENoaWxkcmVuICAgICA9PiBbIC4uLiBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAoKICAgICAgICAjIGFueSBvdGhlciBwYXJhbWV0ZXJzIGNhbiBmb2xsb3cKICAgICkKCj1jdXQKCnN1YiBfQ3JlYXRlVGVtcGxhdGVFbGVtZW50cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hpbGRyZW4KICAgIG15ICRDaGlsZHJlbiA9IGRlbGV0ZSAkUGFyYW17VGVtcGxhdGV9LT57Q2hpbGRyZW59OwogICAgJENoaWxkcmVuIHx8PSBbXTsKCiAgICAjIGRpc3BhdGNoIHRhYmxlCiAgICBteSAlTWV0aG9kMk9iamVjdCA9ICgKICAgICAgICBDaGFuZ2VBZGQgICAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBXb3JrT3JkZXJBZGQgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBDQUJBZGQgICAgICAgID0+ICdDQUInLAogICAgICAgIENvbmRpdGlvbkFkZCAgPT4gJ0lUU01Db25kaXRpb24nLAogICAgICAgIEF0dGFjaG1lbnRBZGQgPT4gJ1BhcmVudCcsCiAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiAnUGFyZW50JywKICAgICAgICBBY3Rpb25BZGQgICAgID0+ICdQYXJlbnQnLAogICAgICAgIExpbmtBZGQgICAgICAgPT4gJ1BhcmVudCcsCiAgICApOwoKICAgICMgZ2V0IGFjdGlvbgogICAgbXkgKCAkTWV0aG9kLCAkRGF0YSApID0gZWFjaCAleyAkUGFyYW17VGVtcGxhdGV9IH07CiAgICBteSAkVHlwZSA9ICRNZXRob2QyT2JqZWN0eyRNZXRob2R9OwogICAgbXkgJEJhY2tlbmRPYmplY3Q7CgogICAgaWYgKCAkVHlwZSBlcSAnUGFyZW50JyApIHsKICAgICAgICAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fVGVtcGxhdGVMb2FkQmFja2VuZCgKICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17UGFyZW50fSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X1RlbXBsYXRlTG9hZEJhY2tlbmQoCiAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgY3JlYXRlIHBhcmVudCBlbGVtZW50CiAgICBteSAlUGFyZW50UmV0dXJuID0gJEJhY2tlbmRPYmplY3QtPkRlU2VyaWFsaXplKAogICAgICAgICVQYXJhbSwKICAgICAgICBEYXRhICAgPT4gJERhdGEsCiAgICAgICAgVHlwZSAgID0+ICRUeXBlLAogICAgICAgIE1ldGhvZCA9PiAkTWV0aG9kLAogICAgKTsKCiAgICBteSAlU2libGluZ3NJbmZvOwoKICAgICMgY3JlYXRlIGNoaWxkIGVsZW1lbnRzCiAgICBmb3IgbXkgJENoaWxkICggQHskQ2hpbGRyZW59ICkgewogICAgICAgIG15ICVDaGlsZEluZm8gPSAkU2VsZi0+X0NyZWF0ZVRlbXBsYXRlRWxlbWVudHMoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVNpYmxpbmdzSW5mbywKICAgICAgICAgICAgJVBhcmVudFJldHVybiwKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENoaWxkLAogICAgICAgICAgICBQYXJlbnQgICA9PiAkVHlwZSwKICAgICAgICAgICAgTWV0aG9kICAgPT4gJE1ldGhvZCwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgaW5mbyBmb3IgbmV4dCBzaWJsaW5nCiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICVDaGlsZEluZm8gKSB7CiAgICAgICAgICAgICRTaWJsaW5nc0luZm97JEtleX0gPSAkQ2hpbGRJbmZveyRLZXl9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJVBhcmVudFJldHVybjsKfQoKPWl0ZW0gX0NoZWNrVGVtcGxhdGVUeXBlSURzKCkKCmNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHRlbXBsYXRlIHR5cGUgaWRzIGFyZSBhbGwgdmFsaWQKCiAgICBteSAkT2sgPSAkVGVtcGxhdGVPYmplY3QtPl9DaGVja1RlbXBsYXRlVHlwZUlEcygKICAgICAgICBUZW1wbGF0ZVR5cGVJRHMgPT4gWyAyLCA1MDAgXSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0NoZWNrVGVtcGxhdGVUeXBlSURzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlVHlwZUlEcyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtUZW1wbGF0ZVR5cGVJRHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGUgcGFyYW0gVGVtcGxhdGVUeXBlSURzIG11c3QgYmUgYW4gQVJSQVkgcmVmZXJlbmNlIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgVGVtcGxhdGVUeXBlSURzIGNhbiBiZSBsb29rZWQgdXAKICAgIGZvciBteSAkVHlwZUlEICggQHsgJFBhcmFte1RlbXBsYXRlVHlwZUlEc30gfSApIHsKICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT5UZW1wbGF0ZVR5cGVMb29rdXAoCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZUlEID0+ICRUeXBlSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFR5cGUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgdHlwZSBpZCAkVHlwZUlEIGlzIG5vdCB2YWxpZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1RlbXBsYXRlTG9hZEJhY2tlbmQoKQoKUmV0dXJucyBhIG5ld2x5IGxvYWRlZCBiYWNrZW5kIG9iamVjdAoKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFRlbXBsYXRlT2JqZWN0LT5fVGVtcGxhdGVMb2FkQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdJVFNNQ2hhbmdlJywKICAgICk7Cgo9Y3V0CgpzdWIgX1RlbXBsYXRlTG9hZEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlZmluZSBiYWNrZW5kIG1vZHVsZSBuYW1lCiAgICBteSAkTW9kdWxlTmFtZSA9ICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU6OicgLiAkUGFyYW17VHlwZX07CgogICAgIyBsb2FkIHRoZSBiYWNrZW5kIG1vZHVsZQogICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlTmFtZSkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIHRlbXBsYXRlIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRNb2R1bGVOYW1lLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBiYWNrZW5kIG9iamVjdAogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNTUgJCAkRGF0ZTogMjAxMC8wNi8yOSAxMjo1NjozMSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Db25kaXRpb24ucG0gLSBhIGV2ZW50IG1vZHVsZSB0byBtYXRjaCBjb25kaXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBDb25kaXRpb24ucG0sdiAxLjYgMjAxMC8wMi8wMyAxMTowNDozMyBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpDb25kaXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpDb25kaXRpb24gLSBJVFNNIGNoYW5nZSBtYW5hZ2VtZW50IGNvbmRpdGlvbiBldmVudCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKRXZlbnQgaGFuZGxlciBtb2R1bGUgZm9yIGNvbmRpdGlvbiBtYXRjaGluZyBmb3IgY2hhbmdlcyBhbmQgd29ya29yZGVycy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEV2ZW50T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpDb25kaXRpb24tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24tPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpUaGUgQzxSdW4oKT4gbWV0aG9kIGhhbmRsZXMgdGhlIGV2ZW50cyBhbmQgbWF0Y2hlcyBhbmQgZXhlY3V0ZXMgYWxsIGNvbmRpdGlvbnMgdGhhdCBhcmUKZGVmaW5lZCBmb3IgdGhlIGN1cnJlbnQgY2hhbmdlLgoKSXQgcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICRFdmVudE9iamVjdC0+UnVuKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VVcGRhdGVQb3N0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gMTIzLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAndGVzdCcsCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBFdmVudCAgICAgICA9PiAnKENoYW5nZUFkZFBvc3R8Q2hhbmdlVXBkYXRlUG9zdCknLAogICAgICAgICAgICBNb2R1bGUgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpDb25kaXRpb24nLAogICAgICAgICAgICBUcmFuc2FjdGlvbiA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBjaGFuZ2UgaWQKICAgIG15ICRDaGFuZ2VJRDsKCiAgICAjIHRvIHN0b3JlIHRoZSBvYmplY3Qgd2VyZSB0aGUgZGF0YSBjb21lcyBmcm9tCiAgICBteSAkT2JqZWN0OwoKICAgICMgaGFuZGxlIGNoYW5nZSBldmVudHMKICAgIGlmICggJFBhcmFte0V2ZW50fSA9fiBteyBcQSBDaGFuZ2UgfXhtcyApIHsKCiAgICAgICAgIyBzZXQgdGhlIGNoYW5nZSBpZAogICAgICAgICRDaGFuZ2VJRCA9ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfTsKCiAgICAgICAgIyBzZXQgdGhlIG9iamVjdAogICAgICAgICRPYmplY3QgPSAnSVRTTUNoYW5nZSc7CiAgICB9CgogICAgIyBoYW5kbGUgd29ya29yZGVyIGV2ZW50cwogICAgZWxzaWYgKCAkUGFyYW17RXZlbnR9ID1+IG17IFxBIFdvcmtPcmRlciB9eG1zICkgewoKICAgICAgICAjIGdldCB3b3Jrb3JkZXIKICAgICAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGhlIGNoYW5nZSBpZCBmcm9tIHdvcmtvcmRlciBkYXRhCiAgICAgICAgJENoYW5nZUlEID0gJFdvcmtPcmRlci0+e0NoYW5nZUlEfTsKCiAgICAgICAgIyBzZXQgdGhlIG9iamVjdAogICAgICAgICRPYmplY3QgPSAnSVRTTVdvcmtPcmRlcic7CiAgICB9CgogICAgIyBzaG93IGVycm9yIGZvciB1bmtub3duIGV2ZW50cwogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gbm90IGhhbmRsZSBldmVudCAnJFBhcmFte0V2ZW50fSchIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW4gY2FzZSBvZiBhbiB1cGRhdGUgZXZlbnQgb3IgYSB0aW1lIHJlYWNoZWQgZXZlbnQsIHN0b3JlIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZXMKICAgIG15IEBBdHRyaWJ1dGVzQ2hhbmdlZDsKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnQ2hhbmdlVXBkYXRlUG9zdCcgKSB7CgogICAgICAgICMgZ2V0IG9sZCBkYXRhCiAgICAgICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VEYXRhfTsKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGF2b2lkIHJlY3Vyc2lvbgogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnT2xkQ2hhbmdlRGF0YSc7CgogICAgICAgICAgICAjIHdlIGRvIG5vdCB0cmFjayB0aGUgdXNlciBpZCBhbmQgInBsYWluIiBjb2x1bW5zCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdVc2VySUQnOwogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnSnVzdGlmaWNhdGlvblBsYWluJzsKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ0Rlc2NyaXB0aW9uUGxhaW4nOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgY2hhbmdlZAogICAgICAgICAgICBteSAkRmllbGRIYXNDaGFuZ2VkID0gJFNlbGYtPl9IYXNGaWVsZENoYW5nZWQoCiAgICAgICAgICAgICAgICBOZXcgPT4gJFBhcmFte0RhdGF9LT57JEZpZWxkfSwKICAgICAgICAgICAgICAgIE9sZCA9PiAkT2xkRGF0YS0+eyRGaWVsZH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGRIYXNDaGFuZ2VkOwoKICAgICAgICAgICAgIyByZW1lbWJlciBjaGFuZ2VkIGZpZWxkIG5hbWUKICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlc0NoYW5nZWQsICRGaWVsZDsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtFdmVudH0gZXEgJ1dvcmtPcmRlclVwZGF0ZVBvc3QnICkgewoKICAgICAgICAjIGdldCBvbGQgZGF0YQogICAgICAgIG15ICRPbGREYXRhID0gJFBhcmFte0RhdGF9LT57T2xkV29ya09yZGVyRGF0YX07CgogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkRmllbGQgKCBrZXlzICV7ICRQYXJhbXtEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBhdm9pZCByZWN1cnNpb24KICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ09sZFdvcmtPcmRlckRhdGEnOwoKICAgICAgICAgICAgIyB3ZSBkbyBub3QgdHJhY2sgdGhlIHVzZXIgaWQgYW5kICJwbGFpbiIgY29sdW1ucwogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnVXNlcklEJzsKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ1JlcG9ydFBsYWluJzsKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ0luc3RydWN0aW9uUGxhaW4nOwoKICAgICAgICAgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBhY2NvdW50ZWQgdGltZQogICAgICAgICAgICBpZiAoICRGaWVsZCBlcSAnQWNjb3VudGVkVGltZScgKSB7CgogICAgICAgICAgICAgICAgIyB3ZSBkbyBub3QgdHJhY2sgaWYgYWNjb3VudGVkIHRpbWUgd2FzIGVtcHR5IG9yIHplcm8KICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRQYXJhbXtBY2NvdW50ZWRUaW1lfTsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGNoYW5nZWQgZmllbGQgbmFtZQogICAgICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlc0NoYW5nZWQsICRGaWVsZDsKCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskRmllbGR9LAogICAgICAgICAgICAgICAgT2xkID0+ICRPbGREYXRhLT57JEZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRGaWVsZEhhc0NoYW5nZWQ7CgogICAgICAgICAgICAjIHJlbWVtYmVyIGNoYW5nZWQgZmllbGQgbmFtZQogICAgICAgICAgICBwdXNoIEBBdHRyaWJ1dGVzQ2hhbmdlZCwgJEZpZWxkOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFsbCBraW5kIG9mIGNoYW5nZSBhbmQgd29ya29yZGVyIHRpbWUgcmVhY2hlZCBldmVudHMKICAgIGVsc2lmICggJFBhcmFte0V2ZW50fSA9fiBteyBcQSAoPzogQ2hhbmdlIHwgV29ya09yZGVyICkgKCAuKyBUaW1lICkgUmVhY2hlZFBvc3QgXHogfXhtcyApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIHJlYWNoZWQgdGltZSBmaWVsZAogICAgICAgIG15ICRGaWVsZCA9ICQxOwoKICAgICAgICAjIHJlbWVtYmVyIGNoYW5nZWQgZmllbGQgbmFtZQogICAgICAgIHB1c2ggQEF0dHJpYnV0ZXNDaGFuZ2VkLCAkRmllbGQ7CiAgICB9CgogICAgIyBtYXRjaCBhbGwgY29uZGl0aW9ucyBmb3IgdGhpcyBjaGFuZ2UgYW5kIGV4ZWN1dGUgYWxsIGFjdGlvbnMKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25NYXRjaEV4ZWN1dGVBbGwoCiAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgJE9iamVjdCA9PiBcQEF0dHJpYnV0ZXNDaGFuZ2VkIH0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3JzCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbk1hdGNoRXhlY3V0ZUFsbCBjb3VsZCBub3QgYmUgIgogICAgICAgICAgICAgICAgLiAiZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IGZvciBldmVudCAnJFBhcmFte0V2ZW50fSchIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfSGFzRmllbGRDaGFuZ2VkKCkKClRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGEgZmllbGQgd2FzIGNoYW5nZWQgb3Igbm90LiBJdCByZXR1cm5zIDEgd2hlbiBmaWVsZAp3YXMgY2hhbmdlZCwgMCBvdGhlcndpc2UKCiAgICBteSAkRmllbGRIYXNDaGFuZ2VkID0gJENvbmRpdGlvbk9iamVjdC0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICBPbGQgPT4gJ29sZCB2YWx1ZScsICMgY2FuIGJlIGFycmF5IHJlZmVyZW5jZSBvciBoYXNoIHJlZmVyZW5jZSBhcyB3ZWxsCiAgICAgICAgTmV3ID0+ICduZXcgdmFsdWUnLCAjIGNhbiBiZSBhcnJheSByZWZlcmVuY2Ugb3IgaGFzaCByZWZlcmVuY2UgYXMgd2VsbAogICAgKTsKCj1jdXQKCnN1YiBfSGFzRmllbGRDaGFuZ2VkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuIGVpdGhlciAnbmV3JyBvciAnb2xkIGlzIG5vdCBzZXQKICAgIHJldHVybiAxIGlmICEoICRQYXJhbXtOZXd9ICYmICRQYXJhbXtPbGR9ICkgJiYgKCAkUGFyYW17TmV3fSB8fCAkUGFyYW17T2xkfSApOwoKICAgICMgZmllbGQgaGFzIG5vdCBjaGFuZ2VkIHdoZW4gYm90aCB2YWx1ZXMgYXJlIGVtcHR5CiAgICByZXR1cm4gaWYgISRQYXJhbXtOZXd9ICYmICEkUGFyYW17T2xkfTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgJ2VxJyB3aGVuIGJvdGggcGFyYW1zIGFyZSBzY2FsYXJzCiAgICByZXR1cm4gJFBhcmFte05ld30gbmUgJFBhcmFte09sZH0gaWYgIXJlZiggJFBhcmFte05ld30gKSAmJiAhcmVmKCAkUGFyYW17T2xkfSApOwoKICAgICMgYSBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuICdyZWYnIGlzIGRpZmZlcmVudAogICAgcmV0dXJuIDEgaWYgcmVmKCAkUGFyYW17TmV3fSApIG5lIHJlZiggJFBhcmFte09sZH0gKTsKCiAgICAjIGNoZWNrIGhhc2hlcwogICAgaWYgKCByZWYgJFBhcmFte05ld30gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGZpZWxkIGhhcyBjaGFuZ2VkIHdoZW4gbnVtYmVyIG9mIGtleXMgYXJlIGRpZmZlcmVudAogICAgICAgIHJldHVybiAxIGlmIHNjYWxhciBrZXlzICV7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIGtleXMgJXsgJFBhcmFte09sZH0gfTsKCiAgICAgICAgIyBjaGVjayB0aGUgdmFsdWVzIGZvciBlYWNoIGtleQogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17TmV3fSB9ICkgewogICAgICAgICAgICByZXR1cm4gMSBpZiAkUGFyYW17TmV3fS0+eyRLZXl9IG5lICRQYXJhbXtPbGR9LT57JEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgYXJyYXlzCiAgICBpZiAoIHJlZiAkUGFyYW17TmV3fSBlcSAnQVJSQVknICkgewoKICAgICAgICAjIGNoYW5nZWQgd2hlbiBudW1iZXIgb2YgZWxlbWVudHMgZGlmZmVyCiAgICAgICAgcmV0dXJuIDEgaWYgc2NhbGFyIEB7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIEB7ICRQYXJhbXtPbGR9IH07CgogICAgICAgICMgY2hlY2sgZWFjaCBlbGVtZW50CiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCN7ICRQYXJhbXtOZXd9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtOZXd9LT5bJEluZGV4XSBuZSAkUGFyYW17T2xkfS0+WyRJbmRleF07CiAgICAgICAgfQogICAgfQoKICAgICMgZmllbGQgaGFzIG5vdCBiZWVuIGNoYW5nZWQKICAgIHJldHVybiAwOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDEwLzAyLzAzIDExOjA0OjMzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Db25kaXRpb25EZWxldGUucG0gLSBhIGV2ZW50IG1vZHVsZSBmb3IgY2xlYW5pbmcgdXAgY29uZGl0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ29uZGl0aW9uRGVsZXRlLnBtLHYgMS4xIDIwMTAvMDIvMDMgMTE6MDQ6MzMgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uRGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6OkNvbmRpdGlvbkRlbGV0ZSAtIElUU00gY2hhbmdlIG1hbmFnZW1lbnQgY29uZGl0aW9uIGNsZWFudXAgZXZlbnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkV2ZW50IGhhbmRsZXIgbW9kdWxlIGZvciBjbGVhbmluZyB1cCBjb25kaXRpb25zLCB3aGVuIGEgY2hhbmdlIGlzIGJlaW5nIGRlbGV0ZWQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6OkNvbmRpdGlvbkRlbGV0ZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRFdmVudE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Q29uZGl0aW9uRGVsZXRlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24tPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpUaGUgQzxSdW4oKT4gbWV0aG9kIGhhbmRsZXMgdGhlIGNoYW5nZSBkZWxldGUgZXZlbnQgYW5kIGRlbGV0ZXMgdGhlIGNvbmRpdGlvbnMgZm9yCnRoZSBnaXZlbiBjaGFuZ2UuCgpJdCByZXR1cm5zIDEgb24gc3VjY2VzcywgQzx1bmRlZj4gb3RoZXJ3aXNlLgoKICAgIG15ICRTdWNjZXNzID0gJEV2ZW50T2JqZWN0LT5SdW4oCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZURlbGV0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEICAgID0+IDEyMywKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIEV2ZW50ICAgICAgID0+ICcoQ2hhbmdlRGVsZXRlUG9zdCknLAogICAgICAgICAgICBNb2R1bGUgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpDb25kaXRpb25EZWxldGUnLAogICAgICAgICAgICBUcmFuc2FjdGlvbiA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgZGVsZXRpb24gb2YgYSBjaGFuZ2UKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnQ2hhbmdlRGVsZXRlUG9zdCcgKSB7CgogICAgICAgICMgZGVsZXRlIGFsbCBjb25kaXRpb25zIChhbmQgZXhwcmVzc2lvbnMgYW5kIGFjdGlvbnMpIGZvciB0aGlzIGNoYW5nZSBpZAogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25EZWxldGVBbGwoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBoYW5kbGUgZXJyb3IKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbkRlbGV0ZUFsbCgpIGZhaWxlZCBmb3IgQ2hhbmdlSUQgJyRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSchIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGVycm9yCiAgICBlbHNlIHsKCiAgICAgICAgIyBhbiB1bmtub3duIGV2ZW50CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW17RXZlbnR9IGlzIGFuIHVua25vd24gZXZlbnQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1jdXQKCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMTAvMDIvMDMgMTE6MDQ6MzMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9IaXN0b3J5QWRkLnBtIC0gSGlzdG9yeUFkZCBldmVudCBtb2R1bGUgZm9yIElUU01DaGFuZ2UKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEhpc3RvcnlBZGQucG0sdiAxLjQ2IDIwMTAvMDMvMDEgMTU6MzU6NTggdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3Rvcnk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQ2ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlBZGQgLSBDaGFuZ2UgYW5kIHdvcmtvcmRlciBoaXN0b3J5IGFkZCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKRXZlbnQgaGFuZGxlciBtb2R1bGUgZm9yIGhpc3RvcnkgYWRkIGluIGNoYW5nZSBtYW5hZ2VtZW50LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEV2ZW50T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5QWRkLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKVGhlIEM8UnVuKCk+IG1ldGhvZCBoYW5kbGVzIHRoZSBldmVudHMgYW5kIGFkZHMvZGVsZXRlcyB0aGUgaGlzdG9yeSBlbnRyaWVzIGZvcgp0aGUgZ2l2ZW4gY2hhbmdlIG9yIHdvcmtvcmRlci4KCkl0IHJldHVybnMgMSBvbiBzdWNjZXNzLCBDPHVuZGVmPiBvdGhlcndpc2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkRXZlbnRPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlVXBkYXRlUG9zdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+IDEyMywKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgPT4gJ3Rlc3QnLAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgICAgPT4gJyhDaGFuZ2VBZGRQb3N0fENoYW5nZVVwZGF0ZVBvc3R8Q2hhbmdlQ0FCVXBkYXRlUG9zdHxDaGFuZ2VDQUJEZWxldGVQb3N0KScsCiAgICAgICAgICAgIE1vZHVsZSAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlBZGQnLAogICAgICAgICAgICBUcmFuc2FjdGlvbiA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpGb3Igd29ya29yZGVyIGV2ZW50cyB0aGUgQzxXb3JrT3JkZXJJRD4gaXMgZXhwZWN0ZWQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkRXZlbnRPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyVXBkYXRlUG9zdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgID0+IDQ1NiwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ3Rlc3QnLAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgICAgPT4gJyhXb3JrT3JkZXJBZGRQb3N0fFdvcmtPcmRlclVwZGF0ZVBvc3R8V29ya09yZGVyRGVsZXRlUG9zdCknLAogICAgICAgICAgICBNb2R1bGUgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OkV2ZW50OjpIaXN0b3J5QWRkJywKICAgICAgICAgICAgVHJhbnNhY3Rpb24gPT4gJzAnLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBFdmVudCBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgZXZlbnQsIGJlY2F1c2Ugd2UgbmVlZCB0aGlzIHVubW9kaWZpZWQgaW4gbGF0ZXIgZXZlbnQgbW9kdWxlcwogICAgbXkgJEV2ZW50ID0gJFBhcmFte0V2ZW50fTsKCiAgICAjIGluIGhpc3RvcnkgZXZlbnQgaGFuZGxpbmcgd2UgdXNlIEV2ZW50IG5hbWUgd2l0aG91dCB0aGUgdHJhaWxpbmcgJ1Bvc3QnCiAgICAkRXZlbnQgPX4gc3sgUG9zdCBceiB9e314bXM7CgogICAgIyBkaXN0aW5ndWlzaCBiZXR3ZWVuIENoYW5nZSBhbmQgV29ya09yZGVyIGV2ZW50cywgYmFzZWQgb24gbmFtaW5nIGNvbnZlbnRpb24KICAgIG15ICgkVHlwZSkgPSAkRXZlbnQgPX4gbXsgXEEgKCBDaGFuZ2UgfCBXb3JrT3JkZXIgfCBDb25kaXRpb24gfCBFeHByZXNzaW9uIHwgQWN0aW9uICkgfXhtczsKICAgIGlmICggISRUeXBlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGRldGVybWluZSB0aGUgb2JqZWN0IHR5cGUgZm9yIHRoZSBldmVudCAnJEV2ZW50JyEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkbyBoaXN0b3J5IHN0dWZmCiAgICBpZiAoICRFdmVudCBlcSAnQ2hhbmdlQWRkJyB8fCAkRXZlbnQgZXEgJ1dvcmtPcmRlckFkZCcgKSB7CgogICAgICAgICMgdGVsbCBoaXN0b3J5IHRoYXQgYSBjaGFuZ2Ugd2FzIGFkZGVkCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPnsgJFR5cGUgLiAnSUQnIH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRFdmVudCBlcSAnQ2hhbmdlVXBkYXRlJyB8fCAkRXZlbnQgZXEgJ1dvcmtPcmRlclVwZGF0ZScgKSB7CgogICAgICAgICMgZ2V0IG9sZCBkYXRhLCBlaXRoZXIgZnJvbSBjaGFuZ2Ugb3Igd29ya29yZGVyCiAgICAgICAgbXkgJE9sZERhdGEgID0gJFBhcmFte0RhdGF9LT57Ik9sZCR7VHlwZX1EYXRhIn07CiAgICAgICAgbXkgJENoYW5nZUlEID0gJE9sZERhdGEtPntDaGFuZ2VJRH07ICAgICAgICAgICAgICAgIyB3b3JrcyBmb3IgY2hhbmdlIGFuZCB3b3Jrb3JkZXIgZXZlbnRzCgogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkRmllbGQgKCBrZXlzICV7ICRQYXJhbXtEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdHJhY2sgc3BlY2lhbCBmaWVsZHMgJ09sZENoYW5nZURhdGEnIG9yICdPbGRXb3JrT3JkZXJEYXRhJwogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAiT2xkJHtUeXBlfURhdGEiOwoKICAgICAgICAgICAgIyB3ZSBkbyBub3QgdHJhY2sgdGhlIHVzZXIgaWQKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ1VzZXJJRCc7CgogICAgICAgICAgICAjIHdlIGRvIG5vdCB0aGUgInBsYWluIiBjb2x1bW5zLCBvbmx5IHRoZSBub24tcGxhaW4gY29sdW1ucwogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnSnVzdGlmaWNhdGlvblBsYWluJzsgICAgIyBjaGFuZ2UKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ0Rlc2NyaXB0aW9uUGxhaW4nOyAgICAgICMgY2hhbmdlCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdSZXBvcnRQbGFpbic7ICAgICAgICAgICAjIHdvcmtvcmRlcgogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAnSW5zdHJ1Y3Rpb25QbGFpbic7ICAgICAgIyB3b3Jrb3JkZXIKCiAgICAgICAgICAgICMgVGhlIGhpc3Rvcnkgb2YgQ0FCIHVwZGF0ZXMgaXMgbm90IHRyYWNrZWQgaGVyZSwKICAgICAgICAgICAgIyBidXQgaW4gdGhlIGhhbmRsZXIgZm9yIENoYW5nZUNBQlVwZGF0ZS4KICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJ0NBQkFnZW50cyc7ICAgICAgICAgICAgICMgY2hhbmdlCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgJEZpZWxkIGVxICdDQUJDdXN0b21lcnMnOyAgICAgICAgICAjIGNoYW5nZQoKICAgICAgICAgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBhY2NvdW50ZWQgdGltZQogICAgICAgICAgICBpZiAoICRUeXBlIGVxICdXb3JrT3JkZXInICYmICRGaWVsZCBlcSAnQWNjb3VudGVkVGltZScgKSB7CgogICAgICAgICAgICAgICAgIyB3ZSBkbyBub3QgdHJhY2sgaWYgYWNjb3VudGVkIHRpbWUgd2FzIGVtcHR5CiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkUGFyYW17RGF0YX0tPnskRmllbGR9OwoKICAgICAgICAgICAgICAgICMgaWYgYWNjb3VudGVkIHRpbWUgaXMgbm90IGVtcHR5LCB3ZSBhbHdheXMgdHJhY2sgdGhlIGhpc3RvcnkKCiAgICAgICAgICAgICAgICAjIGdldCB3b3Jrb3JkZXIgZGF0YQogICAgICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzYXZlIGhpc3RvcnkgaWYgYWNjb3VudGVkIHRpbWUgaGFzIGNoYW5nZWQKICAgICAgICAgICAgICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlELAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgRmllbGRuYW1lICAgPT4gJEZpZWxkLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRXb3JrT3JkZXItPnskRmllbGR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRPbGQgID0+ICRPbGREYXRhLT57JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgY2hhbmdlZAogICAgICAgICAgICBteSAkRmllbGRIYXNDaGFuZ2VkID0gJFNlbGYtPl9IYXNGaWVsZENoYW5nZWQoCiAgICAgICAgICAgICAgICBOZXcgPT4gJFBhcmFte0RhdGF9LT57JEZpZWxkfSwKICAgICAgICAgICAgICAgIE9sZCA9PiAkT2xkRGF0YS0+eyRGaWVsZH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhdmUgaGlzdG9yeSBpZiBmaWVsZCBjaGFuZ2VkCiAgICAgICAgICAgIGlmICgkRmllbGRIYXNDaGFuZ2VkKSB7CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPnskRmllbGR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRPbGQgID0+ICRPbGREYXRhLT57JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJFN1Y2Nlc3M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRFdmVudCBlcSAnV29ya09yZGVyRGVsZXRlJyApIHsKCiAgICAgICAgIyBnZXQgb2xkIGRhdGEKICAgICAgICBteSAkT2xkRGF0YSA9ICRQYXJhbXtEYXRhfS0+e09sZFdvcmtPcmRlckRhdGF9OwoKICAgICAgICAjIGdldCBleGlzdGluZyBoaXN0b3J5IGVudHJpZXMgZm9yIHRoaXMgd29ya29yZGVyCiAgICAgICAgbXkgJEhpc3RvcnlFbnRyaWVzID0gJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+V29ya09yZGVySGlzdG9yeUdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJE9sZERhdGEtPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIGhpc3RvcnkgZW50cmllczogZGVsZXRlIHdvcmtvcmRlciBpZAogICAgICAgIEhJU1RPUllFTlRSWToKICAgICAgICBmb3IgbXkgJEhpc3RvcnlFbnRyeSAoIEB7JEhpc3RvcnlFbnRyaWVzfSApIHsKICAgICAgICAgICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeVVwZGF0ZSgKICAgICAgICAgICAgICAgIEhpc3RvcnlFbnRyeUlEID0+ICRIaXN0b3J5RW50cnktPntIaXN0b3J5RW50cnlJRH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgaGlzdG9yeSBlbnRyeSBmb3IgV29ya09yZGVyIGRlbGV0aW9uCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkT2xkRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkT2xkRGF0YS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGhhbmRsZSBDaGFuZ2VDQUIgZXZlbnRzCiAgICBlbHNpZiAoICRFdmVudCBlcSAnQ2hhbmdlQ0FCVXBkYXRlJyB8fCAkRXZlbnQgZXEgJ0NoYW5nZUNBQkRlbGV0ZScgKSB7CgogICAgICAgICMgZ2V0IG9sZCBkYXRhCiAgICAgICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPntPbGRDaGFuZ2VDQUJEYXRhfTsKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoQ0FCQWdlbnRzIENBQkN1c3RvbWVycykpIHsKCiAgICAgICAgICAgICMgd2UgZG8gbm90IHRyYWNrIHdoZW4gdGhlIHBhcmFtIGhhcyBub3QgYmVlbiBwYXNzZWQKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJFBhcmFte0RhdGF9LT57JEZpZWxkfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIGNoYW5nZWQKICAgICAgICAgICAgbXkgJEZpZWxkSGFzQ2hhbmdlZCA9ICRTZWxmLT5fSGFzRmllbGRDaGFuZ2VkKAogICAgICAgICAgICAgICAgTmV3ID0+ICRQYXJhbXtEYXRhfS0+eyRGaWVsZH0sCiAgICAgICAgICAgICAgICBPbGQgPT4gJE9sZERhdGEtPnskRmllbGR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzYXZlIGhpc3RvcnkgaWYgZmllbGQgY2hhbmdlZAogICAgICAgICAgICBpZiAoJEZpZWxkSGFzQ2hhbmdlZCkgewoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiBqb2luKCAnJSUnLCBAeyAkUGFyYW17RGF0YX0tPnskRmllbGR9IH0gKSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50T2xkICA9PiBqb2luKCAnJSUnLCBAeyAkT2xkRGF0YS0+eyRGaWVsZH0gfSApLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkU3VjY2VzczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBsaW5rIGV2ZW50cwogICAgZWxzaWYgKAogICAgICAgICRFdmVudCAgICBlcSAnQ2hhbmdlTGlua0FkZCcKICAgICAgICB8fCAkRXZlbnQgZXEgJ0NoYW5nZUxpbmtEZWxldGUnCiAgICAgICAgfHwgJEV2ZW50IGVxICdXb3JrT3JkZXJMaW5rQWRkJwogICAgICAgIHx8ICRFdmVudCBlcSAnV29ya09yZGVyTGlua0RlbGV0ZScKICAgICAgICApCiAgICB7CgogICAgICAgICMgZm9yICB3b3Jrb3JkZXIgbGlua3MgZ2V0IHRoZSBjaGFuZ2UgaWQKICAgICAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSApIHsKICAgICAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0gPSAkV29ya09yZGVyLT57Q2hhbmdlSUR9OwogICAgICAgIH0KCiAgICAgICAgbXkgJENvbnRlbnROZXcgPSBqb2luICclJScsCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1NvdXJjZU9iamVjdH0gfHwgJFBhcmFte0RhdGF9LT57VGFyZ2V0T2JqZWN0fSwKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57U291cmNlS2V5fSB8fCAkUGFyYW17RGF0YX0tPntUYXJnZXRLZXl9OwoKICAgICAgICAjIHRlbGwgaGlzdG9yeSB0aGF0IGEgbGluayB3YXMgYWRkZWQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRDb250ZW50TmV3LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaGFuZGxlIGF0dGFjaG1lbnQgZXZlbnRzCiAgICBlbHNpZiAoCiAgICAgICAgJEV2ZW50ICAgIGVxICdDaGFuZ2VBdHRhY2htZW50QWRkJwogICAgICAgIHx8ICRFdmVudCBlcSAnQ2hhbmdlQXR0YWNobWVudERlbGV0ZScKICAgICAgICB8fCAkRXZlbnQgZXEgJ1dvcmtPcmRlckF0dGFjaG1lbnRBZGQnCiAgICAgICAgfHwgJEV2ZW50IGVxICdXb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlJwogICAgICAgICkKICAgIHsKCiAgICAgICAgIyB0ZWxsIGhpc3RvcnkgdGhhdCBhbiBhdHRhY2htZW50IGV2ZW50IHdhcyB0cmlnZ2VyZWQKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0ZpbGVuYW1lfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGhhbmRsZSB4eHhUaW1lUmVhY2hlZCBldmVudHMKICAgIGVsc2lmICggJEV2ZW50ID1+IG17IFRpbWVSZWFjaGVkIFx6IH14bXMgKSB7CiAgICAgICAgbXkgJElEID0gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9IHx8ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfTsKCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkSUQgLiAnJSVOb3RpZmljYXRpb24gU2VudCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgaGlzdG9yeSBlbnRyeSB3aGVuIG5vdGlmaWNhdGlvbiB3YXMgc2VudAogICAgZWxzaWYgKCAkRXZlbnQgPX4gbXsgTm90aWZpY2F0aW9uU2VudCBceiB9eG1zICkgewogICAgICAgIG15ICRJRCA9ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSB8fCAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH07CgogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57VG99IC4gJyUlJyAuICRQYXJhbXtEYXRhfS0+e0V2ZW50VHlwZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgY29uZGl0aW9uIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgZXEgJ0NvbmRpdGlvbkFkZCcgKSB7CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGlkCiAgICAgICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBmb3IgYWxsIGNvbmRpdGlvbiBmaWVsZHMKICAgICAgICBteSBAQ29uZGl0aW9uU3RhdGljID0gcXcoIENvbmRpdGlvbklEIFVzZXJJRCBDaGFuZ2VJRCk7CiAgICAgICAgQ09ORElUSU9ORklFTEQ6CiAgICAgICAgZm9yIG15ICRDb25kaXRpb25GaWVsZCAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9ORklFTEQgaWYgZ3JlcCB7ICRfIGVxICRDb25kaXRpb25GaWVsZCB9IEBDb25kaXRpb25TdGF0aWM7CgogICAgICAgICAgICAjIGRvIG5vdCBhZGQgZW1wdHkgZmllbGRzIHRvIGhpc3RvcnkKICAgICAgICAgICAgbmV4dCBDT05ESVRJT05GSUVMRCBpZiAhJFBhcmFte0RhdGF9LT57JENvbmRpdGlvbkZpZWxkfTsKCiAgICAgICAgICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICBGaWVsZG5hbWUgICA9PiAkQ29uZGl0aW9uRmllbGQsCiAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPnskQ29uZGl0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaGFuZGxlIGNvbmRpdGlvbiB1cGRhdGUgZXZlbnRzCiAgICBlbHNpZiAoICRFdmVudCBlcSAnQ29uZGl0aW9uVXBkYXRlJyApIHsKCiAgICAgICAgIyBnZXQgb2xkIGRhdGEKICAgICAgICBteSAkT2xkRGF0YSA9ICRQYXJhbXtEYXRhfS0+e09sZENvbmRpdGlvbkRhdGF9OwoKICAgICAgICAjIGNyZWF0ZSBoaXN0b3J5IGZvciBhbGwgY29uZGl0aW9uIGZpZWxkcwogICAgICAgIG15IEBDb25kaXRpb25TdGF0aWMgPSBxdyggQ29uZGl0aW9uSUQgVXNlcklEIENoYW5nZUlEIE9sZENvbmRpdGlvbkRhdGEgKTsKICAgICAgICBDT05ESVRJT05GSUVMRDoKICAgICAgICBmb3IgbXkgJENvbmRpdGlvbkZpZWxkICgga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgbmV4dCBDT05ESVRJT05GSUVMRCBpZiBncmVwIHsgJF8gZXEgJENvbmRpdGlvbkZpZWxkIH0gQENvbmRpdGlvblN0YXRpYzsKCiAgICAgICAgICAgICMgZG8gbm90IGFkZCBlbXB0eSBmaWVsZHMgdG8gaGlzdG9yeQogICAgICAgICAgICBuZXh0IENPTkRJVElPTkZJRUxEIGlmICEkUGFyYW17RGF0YX0tPnskQ29uZGl0aW9uRmllbGR9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgY2hhbmdlZAogICAgICAgICAgICBteSAkRmllbGRIYXNDaGFuZ2VkID0gJFNlbGYtPl9IYXNGaWVsZENoYW5nZWQoCiAgICAgICAgICAgICAgICBOZXcgPT4gJFBhcmFte0RhdGF9LT57JENvbmRpdGlvbkZpZWxkfSwKICAgICAgICAgICAgICAgIE9sZCA9PiAkT2xkRGF0YS0+eyRDb25kaXRpb25GaWVsZH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNyZWF0ZSBoaXN0b3J5IG9ubHkgZm9yIGNoYW5nZWQgZmllbGRzCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9ORklFTEQgaWYgISRGaWVsZEhhc0NoYW5nZWQ7CgogICAgICAgICAgICAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJE9sZERhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICBGaWVsZG5hbWUgICA9PiAkQ29uZGl0aW9uRmllbGQsCiAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPnskQ29uZGl0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgQ29udGVudE9sZCAgPT4gJE9sZERhdGEtPnskQ29uZGl0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57Q29uZGl0aW9uSUR9IC4gJyUlJyAuICRQYXJhbXtEYXRhfS0+eyRDb25kaXRpb25GaWVsZH0sCiAgICAgICAgICAgICAgICBDb250ZW50T2xkICA9PiAkUGFyYW17RGF0YX0tPntDb25kaXRpb25JRH0gLiAnJSUnIC4gJE9sZERhdGEtPnskQ29uZGl0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaGFuZGxlIGNvbmRpdGlvbiBkZWxldGUgZXZlbnRzCiAgICBlbHNpZiAoICRFdmVudCBlcSAnQ29uZGl0aW9uRGVsZXRlJyApIHsKCiAgICAgICAgIyBnZXQgb2xkIGRhdGEKICAgICAgICBteSAkT2xkRGF0YSA9ICRQYXJhbXtEYXRhfS0+e09sZENvbmRpdGlvbkRhdGF9OwoKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRPbGREYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRPbGREYXRhLT57Q29uZGl0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaGFuZGxlIGNvbmRpdGlvbiBkZWxldGUgZXZlbnRzCiAgICBlbHNpZiAoICRFdmVudCBlcSAnQ29uZGl0aW9uRGVsZXRlQWxsJyApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaGFuZGxlIGV4cHJlc3Npb24gZXZlbnRzCiAgICBlbHNpZiAoICRFdmVudCBlcSAnRXhwcmVzc2lvbkFkZCcgKSB7CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGlkCiAgICAgICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0V4cHJlc3Npb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGFsbCBleHByZXNzaW9uIGZpZWxkcwogICAgICAgIG15IEBFeHByZXNzaW9uU3RhdGljID0gcXcoIEV4cHJlc3Npb25JRCBVc2VySUQgQ2hhbmdlSUQpOwogICAgICAgIEVYUFJFU1NJT05GSUVMRDoKICAgICAgICBmb3IgbXkgJEV4cHJlc3Npb25GaWVsZCAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgIG5leHQgRVhQUkVTU0lPTkZJRUxEIGlmIGdyZXAgeyAkXyBlcSAkRXhwcmVzc2lvbkZpZWxkIH0gQEV4cHJlc3Npb25TdGF0aWM7CgogICAgICAgICAgICAjIGRvIG5vdCBhZGQgZW1wdHkgZmllbGRzIHRvIGhpc3RvcnkKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9ORklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRFeHByZXNzaW9uRmllbGR9OwoKICAgICAgICAgICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgICAgIEZpZWxkbmFtZSAgID0+ICRFeHByZXNzaW9uRmllbGQsCiAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPnskRXhwcmVzc2lvbkZpZWxkfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBleHByZXNzaW9uIHVwZGF0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdFeHByZXNzaW9uVXBkYXRlJyApIHsKCiAgICAgICAgIyBnZXQgb2xkIGRhdGEKICAgICAgICBteSAkT2xkRGF0YSA9ICRQYXJhbXtEYXRhfS0+e09sZEV4cHJlc3Npb25EYXRhfTsKCiAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBmb3IgYWxsIGV4cHJlc3Npb24gZmllbGRzCiAgICAgICAgbXkgQEV4cHJlc3Npb25TdGF0aWMgPSBxdyggRXhwcmVzc2lvbklEIFVzZXJJRCBDaGFuZ2VJRCBPbGRFeHByZXNzaW9uRGF0YSApOwogICAgICAgIEVYUFJFU1NJT05GSUVMRDoKICAgICAgICBmb3IgbXkgJEV4cHJlc3Npb25GaWVsZCAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgIG5leHQgRVhQUkVTU0lPTkZJRUxEIGlmIGdyZXAgeyAkXyBlcSAkRXhwcmVzc2lvbkZpZWxkIH0gQEV4cHJlc3Npb25TdGF0aWM7CgogICAgICAgICAgICAjIGRvIG5vdCBhZGQgZW1wdHkgZmllbGRzIHRvIGhpc3RvcnkKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9ORklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRFeHByZXNzaW9uRmllbGR9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgY2hhbmdlZAogICAgICAgICAgICBteSAkRmllbGRIYXNDaGFuZ2VkID0gJFNlbGYtPl9IYXNGaWVsZENoYW5nZWQoCiAgICAgICAgICAgICAgICBOZXcgPT4gJFBhcmFte0RhdGF9LT57JEV4cHJlc3Npb25GaWVsZH0sCiAgICAgICAgICAgICAgICBPbGQgPT4gJE9sZERhdGEtPnskRXhwcmVzc2lvbkZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIGhpc3Rvcnkgb25seSBmb3IgY2hhbmdlZCBmaWVsZHMKICAgICAgICAgICAgbmV4dCBFWFBSRVNTSU9ORklFTEQgaWYgISRGaWVsZEhhc0NoYW5nZWQ7CgogICAgICAgICAgICAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICAgICAgRmllbGRuYW1lICAgPT4gJEV4cHJlc3Npb25GaWVsZCwKICAgICAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0V4cHJlc3Npb25JRH0gLiAnJSUnCiAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17RGF0YX0tPnskRXhwcmVzc2lvbkZpZWxkfSwKICAgICAgICAgICAgICAgIENvbnRlbnRPbGQgPT4gJFBhcmFte0RhdGF9LT57RXhwcmVzc2lvbklEfSAuICclJScgLiAkT2xkRGF0YS0+eyRFeHByZXNzaW9uRmllbGR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgZXhwcmVzc2lvbiBkZWxldGUgZXZlbnRzCiAgICBlbHNpZiAoICRFdmVudCBlcSAnRXhwcmVzc2lvbkRlbGV0ZScgKSB7CgogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0V4cHJlc3Npb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgZGVsZXRlIGFsbCBleHByZXNzaW9ucyBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdFeHByZXNzaW9uRGVsZXRlQWxsJyApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57Q29uZGl0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaGFuZGxlIGFjdGlvbiBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdBY3Rpb25BZGQnICkgewoKICAgICAgICAjIGNyZWF0ZSBoaXN0b3J5IGZvciBpZAogICAgICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPntBY3Rpb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGhpc3RvcnkgZm9yIGFsbCBhY3Rpb24gZmllbGRzCiAgICAgICAgbXkgQEFjdGlvblN0YXRpYyA9IHF3KCBBY3Rpb25JRCBVc2VySUQgQ2hhbmdlSUQpOwogICAgICAgIEFDVElPTkZJRUxEOgogICAgICAgIGZvciBteSAkQWN0aW9uRmllbGQgKCBrZXlzICV7ICRQYXJhbXtEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBmb3Igc3RhdGljIGZpZWxkcwogICAgICAgICAgICBuZXh0IEFDVElPTkZJRUxEIGlmIGdyZXAgeyAkXyBlcSAkQWN0aW9uRmllbGQgfSBAQWN0aW9uU3RhdGljOwoKICAgICAgICAgICAgIyBkbyBub3QgYWRkIGVtcHR5IGZpZWxkcyB0byBoaXN0b3J5CiAgICAgICAgICAgIG5leHQgQUNUSU9ORklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRBY3Rpb25GaWVsZH07CgogICAgICAgICAgICAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICAgICAgRmllbGRuYW1lICAgPT4gJEFjdGlvbkZpZWxkLAogICAgICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57JEFjdGlvbkZpZWxkfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBhY3Rpb24gdXBkYXRlIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgZXEgJ0FjdGlvblVwZGF0ZScgKSB7CgogICAgICAgICMgZ2V0IG9sZCBkYXRhCiAgICAgICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPntPbGRBY3Rpb25EYXRhfTsKCiAgICAgICAgIyBjcmVhdGUgaGlzdG9yeSBmb3IgYWxsIGV4cHJlc3Npb24gZmllbGRzCiAgICAgICAgbXkgQEFjdGlvblN0YXRpYyA9IHF3KCBBY3Rpb25JRCBVc2VySUQgQ2hhbmdlSUQgT2xkQWN0aW9uRGF0YSApOwogICAgICAgIEFDVElPTkZJRUxEOgogICAgICAgIGZvciBteSAkQWN0aW9uRmllbGQgKCBrZXlzICV7ICRQYXJhbXtEYXRhfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBmb3Igc3RhdGljIGZpZWxkcwogICAgICAgICAgICBuZXh0IEFDVElPTkZJRUxEIGlmIGdyZXAgeyAkXyBlcSAkQWN0aW9uRmllbGQgfSBAQWN0aW9uU3RhdGljOwoKICAgICAgICAgICAgIyBkbyBub3QgYWRkIGVtcHR5IGZpZWxkcyB0byBoaXN0b3J5CiAgICAgICAgICAgIG5leHQgQUNUSU9ORklFTEQgaWYgISRQYXJhbXtEYXRhfS0+eyRBY3Rpb25GaWVsZH07CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkU2VsZi0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICAgICAgICAgIE5ldyA9PiAkUGFyYW17RGF0YX0tPnskQWN0aW9uRmllbGR9LAogICAgICAgICAgICAgICAgT2xkID0+ICRPbGREYXRhLT57JEFjdGlvbkZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY3JlYXRlIGhpc3Rvcnkgb25seSBmb3IgY2hhbmdlZCBmaWVsZHMKICAgICAgICAgICAgbmV4dCBBQ1RJT05GSUVMRCBpZiAhJEZpZWxkSGFzQ2hhbmdlZDsKCiAgICAgICAgICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgICAgICBGaWVsZG5hbWUgICA9PiAkQWN0aW9uRmllbGQsCiAgICAgICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPntBY3Rpb25JRH0gLiAnJSUnIC4gJFBhcmFte0RhdGF9LT57JEFjdGlvbkZpZWxkfSwKICAgICAgICAgICAgICAgIENvbnRlbnRPbGQgID0+ICRQYXJhbXtEYXRhfS0+e0FjdGlvbklEfSAuICclJScgLiAkT2xkRGF0YS0+eyRBY3Rpb25GaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgYWN0aW9uIGRlbGV0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdBY3Rpb25EZWxldGUnICkgewoKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJEV2ZW50LAogICAgICAgICAgICBDb250ZW50TmV3ICA9PiAkUGFyYW17RGF0YX0tPntBY3Rpb25JRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBoYW5kbGUgZGVsZXRlIGFsbCBhY3Rpb25zIGV2ZW50cwogICAgZWxzaWYgKCAkRXZlbnQgZXEgJ0FjdGlvbkRlbGV0ZUFsbCcgKSB7CgogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkRXZlbnQsCiAgICAgICAgICAgIENvbnRlbnROZXcgID0+ICRQYXJhbXtEYXRhfS0+e0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGhhbmRsZSBhY3Rpb24gZXhlY3V0ZSBldmVudHMKICAgIGVsc2lmICggJEV2ZW50IGVxICdBY3Rpb25FeGVjdXRlJyApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkUGFyYW17RGF0YX0tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRFdmVudCwKICAgICAgICAgICAgQ29udGVudE5ldyAgPT4gJFBhcmFte0RhdGF9LT57QWN0aW9uSUR9IC4gJyUlJyAuICRQYXJhbXtEYXRhfS0+e0FjdGlvblJlc3VsdH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBlcnJvcgogICAgZWxzZSB7CgogICAgICAgICMgYW4gdW5rbm93biBldmVudAogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJEV2ZW50IGlzIGFuIHVua25vd24gZXZlbnQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9IYXNGaWVsZENoYW5nZWQoKQoKVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgYSBmaWVsZCB3YXMgY2hhbmdlZCBvciBub3QuIEl0IHJldHVybnMgMSB3aGVuIGZpZWxkCndhcyBjaGFuZ2VkLCAwIG90aGVyd2lzZQoKICAgIG15ICRGaWVsZEhhc0NoYW5nZWQgPSAkSGlzdG9yeU9iamVjdC0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICBPbGQgPT4gJ29sZCB2YWx1ZScsICMgY2FuIGJlIGFycmF5IHJlZmVyZW5jZSBvciBoYXNoIHJlZmVyZW5jZSBhcyB3ZWxsCiAgICAgICAgTmV3ID0+ICduZXcgdmFsdWUnLCAjIGNhbiBiZSBhcnJheSByZWZlcmVuY2Ugb3IgaGFzaCByZWZlcmVuY2UgYXMgd2VsbAogICAgKTsKCj1jdXQKCnN1YiBfSGFzRmllbGRDaGFuZ2VkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuIGVpdGhlciAnbmV3JyBvciAnb2xkIGlzIG5vdCBzZXQKICAgIHJldHVybiAxIGlmICEoICRQYXJhbXtOZXd9ICYmICRQYXJhbXtPbGR9ICkgJiYgKCAkUGFyYW17TmV3fSB8fCAkUGFyYW17T2xkfSApOwoKICAgICMgZmllbGQgaGFzIG5vdCBjaGFuZ2VkIHdoZW4gYm90aCB2YWx1ZXMgYXJlIGVtcHR5CiAgICByZXR1cm4gaWYgISRQYXJhbXtOZXd9ICYmICEkUGFyYW17T2xkfTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgJ2VxJyB3aGVuIGJvdGggcGFyYW1zIGFyZSBzY2FsYXJzCiAgICByZXR1cm4gJFBhcmFte05ld30gbmUgJFBhcmFte09sZH0gaWYgIXJlZiggJFBhcmFte05ld30gKSAmJiAhcmVmKCAkUGFyYW17T2xkfSApOwoKICAgICMgYSBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuICdyZWYnIGlzIGRpZmZlcmVudAogICAgcmV0dXJuIDEgaWYgcmVmKCAkUGFyYW17TmV3fSApIG5lIHJlZiggJFBhcmFte09sZH0gKTsKCiAgICAjIGNoZWNrIGhhc2hlcwogICAgaWYgKCByZWYgJFBhcmFte05ld30gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGZpZWxkIGhhcyBjaGFuZ2VkIHdoZW4gbnVtYmVyIG9mIGtleXMgYXJlIGRpZmZlcmVudAogICAgICAgIHJldHVybiAxIGlmIHNjYWxhciBrZXlzICV7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIGtleXMgJXsgJFBhcmFte09sZH0gfTsKCiAgICAgICAgIyBjaGVjayB0aGUgdmFsdWVzIGZvciBlYWNoIGtleQogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17TmV3fSB9ICkgewogICAgICAgICAgICByZXR1cm4gMSBpZiAkUGFyYW17TmV3fS0+eyRLZXl9IG5lICRQYXJhbXtPbGR9LT57JEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgYXJyYXlzCiAgICBpZiAoIHJlZiAkUGFyYW17TmV3fSBlcSAnQVJSQVknICkgewoKICAgICAgICAjIGNoYW5nZWQgd2hlbiBudW1iZXIgb2YgZWxlbWVudHMgZGlmZmVyCiAgICAgICAgcmV0dXJuIDEgaWYgc2NhbGFyIEB7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIEB7ICRQYXJhbXtPbGR9IH07CgogICAgICAgICMgY2hlY2sgZWFjaCBlbGVtZW50CiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCN7ICRQYXJhbXtOZXd9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtOZXd9LT5bJEluZGV4XSBuZSAkUGFyYW17T2xkfS0+WyRJbmRleF07CiAgICAgICAgfQogICAgfQoKICAgICMgZmllbGQgaGFzIG5vdCBiZWVuIGNoYW5nZWQKICAgIHJldHVybiAwOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNDYgJCAkRGF0ZTogMjAxMC8wMy8wMSAxNTozNTo1OCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9IaXN0b3J5RGVsZXRlLnBtIC0gSGlzdG9yeURlbGV0ZSBldmVudCBtb2R1bGUgZm9yIElUU01DaGFuZ2UKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEhpc3RvcnlEZWxldGUucG0sdiAxLjEgMjAxMC8wMi8wMyAxMTowNDozMyBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpIaXN0b3J5RGVsZXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Okhpc3RvcnlEZWxldGUgLSBDaGFuZ2UgYW5kIHdvcmtvcmRlciBoaXN0b3J5IGNsZWFudXAgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkV2ZW50IGhhbmRsZXIgbW9kdWxlIGZvciBoaXN0b3J5IGRlbGV0ZSBpbiBjaGFuZ2UgbWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6SGlzdG9yeURlbGV0ZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRFdmVudE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6SGlzdG9yeURlbGV0ZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoZSBDPFJ1bigpPiBtZXRob2QgaGFuZGxlcyBjaGFuZ2UgZGVsZXRlIGV2ZW50cyBhbmQgZGVsZXRlcyB0aGUgaGlzdG9yeSBlbnRyaWVzIGZvcgp0aGUgZ2l2ZW4gY2hhbmdlLgoKSXQgcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICRFdmVudE9iamVjdC0+UnVuKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VEZWxldGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAxMjMsCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBFdmVudCAgICAgICA9PiAnKENoYW5nZURlbGV0ZVBvc3QpJywKICAgICAgICAgICAgTW9kdWxlICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6SGlzdG9yeURlbGV0ZScsCiAgICAgICAgICAgIFRyYW5zYWN0aW9uID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoRGF0YSBFdmVudCBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBkZWxldGlvbiBvZiBhIGNoYW5nZQogICAgaWYgKCAkUGFyYW17RXZlbnR9IGVxICdDaGFuZ2VEZWxldGVQb3N0JyApIHsKCiAgICAgICAgIyBkZWxldGUgaGlzdG9yeSBvZiBjaGFuZ2UKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkNoYW5nZUhpc3RvcnlEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBoYW5kbGUgZXJyb3IKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJDb25kaXRpb25IaXN0b3J5RGVsZXRlKCkgZmFpbGVkIGZvciBDaGFuZ2VJRCAnJFBhcmFte0RhdGF9LT57Q2hhbmdlSUR9JyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZXJyb3IKICAgIGVsc2UgewoKICAgICAgICAjIGFuIHVua25vd24gZXZlbnQKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbXtFdmVudH0gaXMgYW4gdW5rbm93biBldmVudCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWN1dAoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAxMC8wMi8wMyAxMTowNDozMyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9FdmVudC9Ob3RpZmljYXRpb24ucG0gLSBhIGV2ZW50IG1vZHVsZSB0byBzZW5kIG5vdGlmaWNhdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE5vdGlmaWNhdGlvbi5wbSx2IDEuMjggMjAxMC8wNS8yMSAxMDoyMjoxMiB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Ok5vdGlmaWNhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok5vdGlmaWNhdGlvbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5Owp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI4ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6RXZlbnQ6Ok5vdGlmaWNhdGlvbiAtIElUU00gY2hhbmdlIG1hbmFnZW1lbnQgbm90aWZpY2F0aW9uIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpFdmVudCBoYW5kbGVyIG1vZHVsZSBmb3Igbm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyBhbmQgd29ya29yZGVycy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpFdmVudDo6Tm90aWZpY2F0aW9uOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpOb3RpZmljYXRpb24tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q2hhbmdlTm90aWZpY2F0aW9uT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOb3RpZmljYXRpb24tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIFRPRE86IGZpbmQgYmV0dGVyIHdheSB0byBsb29rIHVwIGV2ZW50IGlkcwogICAgJFNlbGYtPntIaXN0b3J5T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKVGhlIEM8UnVuKCk+IG1ldGhvZCBoYW5kbGVzIHRoZSBldmVudHMgYW5kIHNlbmRzIG5vdGlmaWNhdGlvbnMgYWJvdXQKdGhlIGdpdmVuIGNoYW5nZSBvciB3b3Jrb3JkZXIgb2JqZWN0LgoKSXQgcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+UnVuKAogICAgICAgIEV2ZW50ID0+ICdDaGFuZ2VVcGRhdGVQb3N0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gMTIzLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAndGVzdCcsCiAgICAgICAgfSwKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBFdmVudCAgICAgICA9PiAnKENoYW5nZUFkZFBvc3R8Q2hhbmdlVXBkYXRlUG9zdHxDaGFuZ2VDQUJVcGRhdGVQb3N0fENoYW5nZUNBQkRlbGV0ZVBvc3R8Q2hhbmdlRGVsZXRlUG9zdCknLAogICAgICAgICAgICBNb2R1bGUgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OkV2ZW50OjpOb3RpZmljYXRpb24nLAogICAgICAgICAgICBUcmFuc2FjdGlvbiA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCBtb2RpZnkgdGhlIG9yaWdpbmFsIGV2ZW50LCBiZWNhdXNlIHdlIG5lZWQgdGhpcyB1bm1vZGlmaWVkIGluIGxhdGVyIGV2ZW50IG1vZHVsZXMKICAgIG15ICRFdmVudCA9ICRQYXJhbXtFdmVudH07CgogICAgIyBpbiBoaXN0b3J5IGV2ZW50IGhhbmRsaW5nIHdlIHVzZSBFdmVudCBuYW1lIHdpdGhvdXQgdGhlIHRyYWlsaW5nICdQb3N0JwogICAgJEV2ZW50ID1+IHN7IFBvc3QgXHogfXt9eG1zOwoKICAgICMgZGlzdGluZ3Vpc2ggYmV0d2VlbiBDaGFuZ2UgYW5kIFdvcmtPcmRlciBldmVudHMsIGJhc2VkIG9uIG5hbWluZyBjb252ZW50aW9uCiAgICBteSAkVHlwZTsKICAgIGlmICggJEV2ZW50ID1+IG17IFxBIChDaGFuZ2V8QWN0aW9uRXhlY3V0ZSkgfXhtcyApIHsKICAgICAgICAkVHlwZSA9ICdDaGFuZ2UnOwogICAgfQogICAgZWxzaWYgKCAkRXZlbnQgPX4gbXsgXEEgV29ya09yZGVyIH14bXMgKSB7CiAgICAgICAgJFR5cGUgPSAnV29ya09yZGVyJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGRldGVybWluZSB0aGUgb2JqZWN0IHR5cGUgZm9yIHRoZSBldmVudCAnJEV2ZW50JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBldmVudCBpZCwgZm9yIGxvb2tpbmcgdXAgdGhlIGxpc3Qgb2YgcmVsZXZhbnQgcnVsZXMKICAgIG15ICRFdmVudElEID0gJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeVR5cGVMb29rdXAoIEhpc3RvcnlUeXBlID0+ICRFdmVudCApOwogICAgaWYgKCAhJEV2ZW50SUQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmNvdW50ZXJlZCB1bmtub3duIGV2ZW50ICckRXZlbnQnISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJE5vdGlmaWNhdGlvblJ1bGVJRHMgPSAkU2VsZi0+e0NoYW5nZU5vdGlmaWNhdGlvbk9iamVjdH0tPk5vdGlmaWNhdGlvblJ1bGVTZWFyY2goCiAgICAgICAgRXZlbnRJRCA9PiAkRXZlbnRJRCwKICAgICk7CiAgICBpZiAoICEkTm90aWZpY2F0aW9uUnVsZUlEcyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBnZXQgbm90aWZpY2F0aW9uIHJ1bGVzIGZvciB0aGUgZXZlbnQgJyRFdmVudCchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluIGNhc2Ugb2YgYW4gdXBkYXRlLCB3ZSBoYXZlIHRoZSBvbGQgZGF0YSBmb3IgY29tcGFyaXNvbgogICAgbXkgJE9sZERhdGEgPSAkUGFyYW17RGF0YX0tPnsiT2xkJHtUeXBlfURhdGEifTsKCiAgICAjIFRoZSBub3RpZmljYXRpb24gcnVsZXMgYXJlIGJhc2VkIG9uIG5hbWVzLCB3aGlsZSB0aGUgQ2hhbmdlVXBkYXRlLUZ1bmN0aW9uCiAgICAjIHByaW1hcmlseSBjYXJlcyBhYm91dCBJRHMuIFNvIHRoZXJlIG5lZWRzIHRvIGJlIGEgbWFwcGluZy4KICAgIG15ICVOYW1lMklEID0gKAogICAgICAgIENoYW5nZVN0YXRlICAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnV29ya09yZGVyU3RhdGVJRCcsCiAgICApOwoKICAgICMgbG9vcCBvdmVyIHRoZSBub3RpZmljYXRpb24gcnVsZXMgYW5kIGNoZWNrIHRoZSBjb25kaXRpb24KICAgIFJVTEVfSUQ6CiAgICBmb3IgbXkgJFJ1bGVJRCAoIEB7JE5vdGlmaWNhdGlvblJ1bGVJRHN9ICkgewogICAgICAgIG15ICRSdWxlID0gJFNlbGYtPntDaGFuZ2VOb3RpZmljYXRpb25PYmplY3R9LT5Ob3RpZmljYXRpb25SdWxlR2V0KAogICAgICAgICAgICBJRCA9PiAkUnVsZUlELAogICAgICAgICk7CgogICAgICAgIG15ICRBdHRyaWJ1dGUgPSAkUnVsZS0+e0F0dHJpYnV0ZX0gfHwgJyc7CiAgICAgICAgaWYgKCAkTmFtZTJJRHskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZSA9ICROYW1lMklEeyRBdHRyaWJ1dGV9OwogICAgICAgIH0KCiAgICAgICAgIyBubyBub3RpZmljYXRpb24gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgcmVsZXZhbnQKICAgICAgICBpZiAoICRBdHRyaWJ1dGUgJiYgIWV4aXN0cyAkUGFyYW17RGF0YX0tPnskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgbmV4dCBSVUxFX0lEOwogICAgICAgIH0KCiAgICAgICAgIyBpbiBjYXNlIG9mIGFuIHVwZGF0ZSwgY2hlY2sgd2hldGhlciB0aGUgYXR0cmlidXRlIGhhcyBjaGFuZ2VkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0cmlidXRlCiAgICAgICAgICAgICYmICggJEV2ZW50IGVxICdDaGFuZ2VVcGRhdGUnIHx8ICRFdmVudCBlcSAnV29ya09yZGVyVXBkYXRlJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRIYXNDaGFuZ2VkID0gJFNlbGYtPl9IYXNGaWVsZENoYW5nZWQoCiAgICAgICAgICAgICAgICBOZXcgPT4gJFBhcmFte0RhdGF9LT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICBPbGQgPT4gJE9sZERhdGEtPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgUlVMRV9JRCBpZiAhJEhhc0NoYW5nZWQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKICAgICAgICAjIFRPRE86IHN1cHBvcnQgb3RoZXIgY29tYmluYXRpb25zLCBtYXliZSB1c2UgR2VuZXJhbENhdGFsb2cgZGlyZWN0bHkKICAgICAgICBteSAkTmV3RmllbGRDb250ZW50ID0gJEF0dHJpYnV0ZSA/ICRQYXJhbXtEYXRhfS0+eyRBdHRyaWJ1dGV9IDogJyc7CgogICAgICAgIGlmICggJEF0dHJpYnV0ZSBlcSAnQ2hhbmdlU3RhdGVJRCcgKSB7CiAgICAgICAgICAgICROZXdGaWVsZENvbnRlbnQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkTmV3RmllbGRDb250ZW50LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ1dvcmtPcmRlclN0YXRlSUQnICkgewogICAgICAgICAgICAkTmV3RmllbGRDb250ZW50ID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJE5ld0ZpZWxkQ29udGVudCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdWxkIHRoZSBub3RpZmljYXRpb24gYmUgc2VudCA/CiAgICAgICAgIyB0aGUgeC1tb2RpZmllciBpcyBoYXJtZnVsIGhlcmUsIGFzICRSdWxlLT57UnVsZX0gY2FuIGNvbnRhaW4gc3BhY2VzCiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRSdWxlLT57UnVsZX0KICAgICAgICAgICAgJiYgZGVmaW5lZCAkTmV3RmllbGRDb250ZW50CiAgICAgICAgICAgICYmICROZXdGaWVsZENvbnRlbnQgIX4gbS9eJFJ1bGUtPntSdWxlfSQvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgUlVMRV9JRDsKICAgICAgICB9CgogICAgICAgICMgZGV0ZXJtaW5lIGxpc3Qgb2YgYWdlbnRzIGFuZCBjdXN0b21lcnMKICAgICAgICBteSAkQWdlbnRBbmRDdXN0b21lcklEcyA9ICRTZWxmLT5fQWdlbnRBbmRDdXN0b21lcklEc0dldCgKICAgICAgICAgICAgUmVjaXBpZW50cyAgPT4gJFJ1bGUtPntSZWNpcGllbnRzfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgIEV2ZW50ICAgICAgID0+ICRFdmVudCwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgT2xkRGF0YSAgICAgPT4gJE9sZERhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgUlVMRV9JRCBpZiAhJEFnZW50QW5kQ3VzdG9tZXJJRHM7CgogICAgICAgICRTZWxmLT57Q2hhbmdlTm90aWZpY2F0aW9uT2JqZWN0fS0+Tm90aWZpY2F0aW9uU2VuZCgKICAgICAgICAgICAgJXskQWdlbnRBbmRDdXN0b21lcklEc30sCiAgICAgICAgICAgIFR5cGUgICA9PiAkVHlwZSwKICAgICAgICAgICAgRXZlbnQgID0+ICRFdmVudCwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBEYXRhICAgPT4gewogICAgICAgICAgICAgICAgJXsgJFBhcmFte0RhdGF9IH0gICAgIyBkbyBub3QgcGFzcyBhcyByZWZlcmVuY2UsIGFzIGl0IHdvdWxkIGluZmx1ZW5jZSBsYXRlciBldmVudHMhCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0hhc0ZpZWxkQ2hhbmdlZCgpCgpUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhIGZpZWxkIHdhcyBjaGFuZ2VkIG9yIG5vdC4gSXQgcmV0dXJucyAxIHdoZW4gZmllbGQKd2FzIGNoYW5nZWQsIDAgb3RoZXJ3aXNlCgogICAgbXkgJEZpZWxkSGFzQ2hhbmdlZCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+X0hhc0ZpZWxkQ2hhbmdlZCgKICAgICAgICBPbGQgPT4gJ29sZCB2YWx1ZScsICMgY2FuIGJlIGFycmF5IHJlZmVyZW5jZSBvciBoYXNoIHJlZmVyZW5jZSBhcyB3ZWxsCiAgICAgICAgTmV3ID0+ICduZXcgdmFsdWUnLCAjIGNhbiBiZSBhcnJheSByZWZlcmVuY2Ugb3IgaGFzaCByZWZlcmVuY2UgYXMgd2VsbAogICAgKTsKCj1jdXQKCnN1YiBfSGFzRmllbGRDaGFuZ2VkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuIGVpdGhlciAnbmV3JyBvciAnb2xkIGlzIG5vdCBzZXQKICAgIHJldHVybiAxIGlmICEoICRQYXJhbXtOZXd9ICYmICRQYXJhbXtPbGR9ICkgJiYgKCAkUGFyYW17TmV3fSB8fCAkUGFyYW17T2xkfSApOwoKICAgICMgZmllbGQgaGFzIG5vdCBjaGFuZ2VkIHdoZW4gYm90aCB2YWx1ZXMgYXJlIGVtcHR5CiAgICByZXR1cm4gaWYgISRQYXJhbXtOZXd9ICYmICEkUGFyYW17T2xkfTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgJ2VxJyB3aGVuIGJvdGggcGFyYW1zIGFyZSBzY2FsYXJzCiAgICByZXR1cm4gJFBhcmFte05ld30gbmUgJFBhcmFte09sZH0gaWYgIXJlZiggJFBhcmFte05ld30gKSAmJiAhcmVmKCAkUGFyYW17T2xkfSApOwoKICAgICMgYSBmaWVsZCBoYXMgY2hhbmdlZCB3aGVuICdyZWYnIGlzIGRpZmZlcmVudAogICAgcmV0dXJuIDEgaWYgcmVmKCAkUGFyYW17TmV3fSApIG5lIHJlZiggJFBhcmFte09sZH0gKTsKCiAgICAjIGNoZWNrIGhhc2hlcwogICAgaWYgKCByZWYgJFBhcmFte05ld30gZXEgJ0hBU0gnICkgewoKICAgICAgICAjIGZpZWxkIGhhcyBjaGFuZ2VkIHdoZW4gbnVtYmVyIG9mIGtleXMgYXJlIGRpZmZlcmVudAogICAgICAgIHJldHVybiAxIGlmIHNjYWxhciBrZXlzICV7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIGtleXMgJXsgJFBhcmFte09sZH0gfTsKCiAgICAgICAgIyBjaGVjayB0aGUgdmFsdWVzIGZvciBlYWNoIGtleQogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17TmV3fSB9ICkgewogICAgICAgICAgICByZXR1cm4gMSBpZiAkUGFyYW17TmV3fS0+eyRLZXl9IG5lICRQYXJhbXtPbGR9LT57JEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgYXJyYXlzCiAgICBpZiAoIHJlZiAkUGFyYW17TmV3fSBlcSAnQVJSQVknICkgewoKICAgICAgICAjIGNoYW5nZWQgd2hlbiBudW1iZXIgb2YgZWxlbWVudHMgZGlmZmVyCiAgICAgICAgcmV0dXJuIDEgaWYgc2NhbGFyIEB7ICRQYXJhbXtOZXd9IH0gIT0gc2NhbGFyIEB7ICRQYXJhbXtPbGR9IH07CgogICAgICAgICMgY2hlY2sgZWFjaCBlbGVtZW50CiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCN7ICRQYXJhbXtOZXd9IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtOZXd9LT5bJEluZGV4XSBuZSAkUGFyYW17T2xkfS0+WyRJbmRleF07CiAgICAgICAgfQogICAgfQoKICAgICMgZmllbGQgaGFzIG5vdCBiZWVuIGNoYW5nZWQKICAgIHJldHVybiAwOwp9Cgo9aXRlbSBfQWdlbnRBbmRDdXN0b21lcklEc0dldCgpCgpHZXQgdGhlIGFnZW50IGFuZCBjdXN0b21lciBJRHMgZnJvbSB0aGUgcmVjaXBpZW50IGxpc3QuCgogICAgbXkgJEFnZW50QW5kQ3VzdG9tZXJJRHMgPSAkSGlzdG9yeU9iamVjdC0+X0FnZW50QW5kQ3VzdG9tZXJJRHNHZXQoCiAgICAgICAgUmVjaXBpZW50cyA9PiBbJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlTWFuYWdlciddLAogICAgKTsKCnJldHVybnMKCiAgICAkQWdlbnRBbmRDdXN0b21lcklEcyA9IHsKICAgICAgICBBZ2VudElEcyAgICA9PiBbIDIsIDQgXSwKICAgICAgICBDdXN0b21lcklEcyA9PiBbXSwKICAgIH07Cgo9Y3V0CgpzdWIgX0FnZW50QW5kQ3VzdG9tZXJJRHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkV29ya09yZGVyQWdlbnRJRDsKICAgIGlmICggJFBhcmFte1R5cGV9IGVxICdXb3JrT3JkZXInICkgewoKICAgICAgICAjIGNoZWNrIFdvcmtPcmRlcklECiAgICAgICAgaWYgKCAhJFBhcmFte1dvcmtPcmRlcklEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBwYXJhbSAnV29ya09yZGVySUQnIGlzIHJlcXVpcmVkIGZvciBXb3JrT3JkZXIgZXZlbnRzISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0V2ZW50fSBlcSAnV29ya09yZGVyRGVsZXRlJyApIHsKCiAgICAgICAgICAgICMgdGhlIHdvcmtvcmRlciBpcyBhbHJlYWR5IGRlbGV0ZWQsIHNvIHdlIGxvb2sgYXQgdGhlIE9sZERhdGEKICAgICAgICAgICAgJFBhcmFte0NoYW5nZUlEfSA9ICRQYXJhbXtPbGREYXRhfS0+e0NoYW5nZUlEfTsKICAgICAgICAgICAgJFdvcmtPcmRlckFnZW50SUQgPSAkUGFyYW17T2xkRGF0YX0tPntXb3JrT3JkZXJBZ2VudElEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBDaGFuZ2VJRCBhbmQgV29ya09yZGVyQWdlbnRJRCBmcm9tIHRoZSBXb3JrT3JkZXIsCiAgICAgICAgICAgICMgdGhlIFdvcmtPcmRlckFnZW50IG1pZ2h0IGhhdmUgYmVlbiByZWNlbnRseSB1cGRhdGVkCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte0NoYW5nZUlEfSA9ICRXb3JrT3JkZXItPntDaGFuZ2VJRH07CiAgICAgICAgICAgICRXb3JrT3JkZXJBZ2VudElEID0gJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZXNlIGFycmF5cyB3aWxsIGJlIHJldHVybmVkCiAgICBteSAoIEBBZ2VudElEcywgQEN1c3RvbWVySURzICk7CgogICAgIyBuZWVkZWQgZm9yIGRldGVybWluaW5nIHRoZSBhY3R1YWwgcmVjaXBpZW50cwogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGZvciBteSAkUmVjaXBpZW50ICggQHsgJFBhcmFte1JlY2lwaWVudHN9IH0gKSB7CgogICAgICAgIGlmICggJFJlY2lwaWVudCBlcSAnQ2hhbmdlQnVpbGRlcicgfHwgJFJlY2lwaWVudCBlcSAnQ2hhbmdlTWFuYWdlcicgKSB7CgogICAgICAgICAgICAjIHRha2UgdGhlIGJ1aWxkZXIgb3IgbWFuYWdlciBmcm9tIHRoZSBjdXJyZW50IGNoYW5nZSBkYXRhCiAgICAgICAgICAgIHB1c2ggQEFnZW50SURzLCAkQ2hhbmdlLT57ICRSZWNpcGllbnQgLiAnSUQnIH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnT2xkQ2hhbmdlQnVpbGRlcicgfHwgJFJlY2lwaWVudCBlcSAnT2xkQ2hhbmdlTWFuYWdlcicgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte0V2ZW50fSBuZSAnQ2hhbmdlVXBkYXRlJyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY2lwaWVudCAkUmVjaXBpZW50IGlzIG9ubHkgdmFsaWQgZm9yIENoYW5nZVVwZGF0ZSBldmVudHMsICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiYnV0IHRoZSBldmVudCB3YXMgYSAnJFBhcmFte0V2ZW50fScgZXZlbnQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyB0YWtlIHRoZSBidWlsZGVyIG9yIG1hbmFnZXIgZnJvbSB0aGUgb3JpZ2luYWwgY2hhbmdlIGRhdGEKICAgICAgICAgICAgICAgICRSZWNpcGllbnQgPX4gc3sgXEEgT2xkIH17fXhtczsKICAgICAgICAgICAgICAgIHB1c2ggQEFnZW50SURzLCAkUGFyYW17T2xkRGF0YX0tPnsgJFJlY2lwaWVudCAuICdJRCcgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSZWNpcGllbnQgZXEgJ0NBQkN1c3RvbWVycycgKSB7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCBAeyAkQ2hhbmdlLT57Q0FCQ3VzdG9tZXJzfSB9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSZWNpcGllbnQgZXEgJ0NBQkFnZW50cycgKSB7CiAgICAgICAgICAgIHB1c2ggQEFnZW50SURzLCBAeyAkQ2hhbmdlLT57Q0FCQWdlbnRzfSB9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSZWNpcGllbnQgZXEgJ1dvcmtPcmRlckFnZW50JyApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VHlwZX0gbmUgJ1dvcmtPcmRlcicgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWNpcGllbnQgJFJlY2lwaWVudCBpcyBvbmx5IHZhbGlkIGZvciB3b3Jrb3JkZXIgZXZlbnRzICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiYnV0IHRoZSBldmVudCB3YXMgYSAnJFBhcmFte0V2ZW50fScgZXZlbnQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBZ2VudElEcywgJFdvcmtPcmRlckFnZW50SUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdPbGRXb3JrT3JkZXJBZ2VudCcgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte0V2ZW50fSBuZSAnV29ya09yZGVyVXBkYXRlJyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY2lwaWVudCAkUmVjaXBpZW50IGlzIG9ubHkgdmFsaWQgZm9yIFdvcmtPcmRlclVwZGF0ZSBldmVudHMgIgogICAgICAgICAgICAgICAgICAgICAgICAuICJidXQgdGhlIGV2ZW50IHdhcyBhICckUGFyYW17RXZlbnR9JyBldmVudCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHRha2UgdGhlIHdvcmtvcmRlciBhZ2VudCBmcm9tIHRoZSBvcmlnaW5hbCB3b3Jrb3JkZXIgZGF0YQogICAgICAgICAgICAgICAgJFJlY2lwaWVudCA9fiBzeyBcQSBPbGQgfXt9eG1zOwogICAgICAgICAgICAgICAgcHVzaCBAQWdlbnRJRHMsICRQYXJhbXtPbGREYXRhfS0+eyAkUmVjaXBpZW50IC4gJ0lEJyB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnV29ya09yZGVyQWdlbnRzJyApIHsKCiAgICAgICAgICAgICMgbG9vcCBvdmVyIHRoZSB3b3Jrb3JkZXJzIG9mIGEgY2hhbmdlIGFuZCBnZXQgdGhlaXIgd29ya29yZGVyIGFnZW50cwogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHsgJENoYW5nZS0+e1dvcmtPcmRlcklEc30gfSApIHsKICAgICAgICAgICAgICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQEFnZW50SURzLCAkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50IGVxICdDaGFuZ2VJbml0aWF0b3JzJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzIHdoaWNoIGFyZSBkaXJlY3RseSBsaW5rZWQgd2l0aCB0aGlzIGNoYW5nZSBvYmplY3QKICAgICAgICAgICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBjaGFuZ2UgaW5pdGlhdG9ycyAoY3VzdG9tZXIgdXNlcnMgb2YgbGlua2VkIHRpY2tldHMpCiAgICAgICAgICAgICMgVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgbGlzdCBhIGRpc3BsYXllZCBpbiBDaGFuZ2Vab29tLgogICAgICAgICAgICBteSAkTGlua0xpc3QgPSAkTGlua0xpc3RXaXRoRGF0YS0+e1RpY2tldH0gfHwge307CiAgICAgICAgICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7JExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIHRoZSBsaW5rZWQgdGlja2V0cyBhcmUgYWx3YXlzIHRoZSAnU291cmNlJy4KICAgICAgICAgICAgICAgIGZvciBteSAkVGlja2V0RGF0YSAoIHZhbHVlcyAleyAkTGlua0xpc3QtPnskTGlua1R5cGV9LT57U291cmNlfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIFRoZSBkYXRhIGZvciB0aGUgbGlua2VkIHRpY2tldCBjYW4gaGF2ZSBhIGN1c3RvbWVyIGlkLgogICAgICAgICAgICAgICAgICAgICMgSWYgaXQgZG9lc24ndCwgZmFsbCBiYWNrIHRvIHRoZSBvd25lci4KICAgICAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXREYXRhLT57Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJFRpY2tldERhdGEtPntDdXN0b21lclVzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBBZ2VudElEcywgJFRpY2tldERhdGEtPntPd25lcklEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVjaXBpZW50ID1+IG17IFxBIEdyb3VwSVRTTUNoYW5nZSh8QnVpbGRlcnxNYW5hZ2VyKSBceiB9eG1zICkgewoKICAgICAgICAgICAgbXkgJVJlY2lwaWVudDJHcm91cCA9ICgKICAgICAgICAgICAgICAgIEdyb3VwSVRTTUNoYW5nZSAgICAgICAgPT4gJ2l0c20tY2hhbmdlJywKICAgICAgICAgICAgICAgIEdyb3VwSVRTTUNoYW5nZUJ1aWxkZXIgPT4gJ2l0c20tY2hhbmdlLWJ1aWxkZXInLAogICAgICAgICAgICAgICAgR3JvdXBJVFNNQ2hhbmdlTWFuYWdlciA9PiAnaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBncm91cCBpZAogICAgICAgICAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwID0+ICRSZWNpcGllbnQyR3JvdXB7JFJlY2lwaWVudH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1lbWJlcnMgb2YgZ3JvdXAKICAgICAgICAgICAgbXkgJVVzZXJzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQEFnZW50SURzLCBrZXlzICVVc2VyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmtub3duIHJlY2lwaWVudCAnJFJlY2lwaWVudCchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5vIG5lZWQgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZXMsIE5vdGlmaWNhdGlvblNlbmQoKSB0YWtlcyBjYXJlIG9mIHRoYXQKICAgICMgcmVtb3ZlIGVtcHR5IElEcwogICAgQEFnZW50SURzICAgID0gZ3JlcCB7JF99IEBBZ2VudElEczsKICAgIEBDdXN0b21lcklEcyA9IGdyZXAgeyRffSBAQ3VzdG9tZXJJRHM7CgogICAgbXkgJUFnZW50QW5kQ3VzdG9tZXJJRHMgPSAoCiAgICAgICAgQWdlbnRJRHMgICAgPT4gXEBBZ2VudElEcywKICAgICAgICBDdXN0b21lcklEcyA9PiBcQEN1c3RvbWVySURzLAogICAgKTsKCiAgICByZXR1cm4gXCVBZ2VudEFuZEN1c3RvbWVySURzOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMjggJCAkRGF0ZTogMjAxMC8wNS8yMSAxMDoyMjoxMiAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL0FjdGlvbi5wbSAtIGFsbCBjb25kaXRpb24gYWN0aW9uIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWN0aW9uLnBtLHYgMS4xMSAyMDEwLzA1LzIxIDEwOjIyOjEyIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpBY3Rpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QWN0aW9uIC0gY29uZGl0aW9uIGFjdGlvbiBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9uIGFjdGlvbnMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWl0ZW0gQWN0aW9uQWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gYWN0aW9uLgoKICAgIG15ICRBY3Rpb25JRCA9ICRDb25kaXRpb25PYmplY3QtPkFjdGlvbkFkZCgKICAgICAgICBDb25kaXRpb25JRCAgPT4gMTIzLAogICAgICAgIEFjdGlvbk51bWJlciA9PiA1LAogICAgICAgIE9iamVjdElEICAgICA9PiAyMzQsCiAgICAgICAgQXR0cmlidXRlSUQgID0+IDM0NSwKICAgICAgICBPcGVyYXRvcklEICAgPT4gNDU2LAogICAgICAgIFNlbGVjdG9yICAgICA9PiAxMjM0JywKICAgICAgICBBY3Rpb25WYWx1ZSAgPT4gJ3JlamVjdGVkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIE9iamVjdElEIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQgU2VsZWN0b3IgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSAnQWN0aW9uVmFsdWUnIGluIGEgc3BlY2lhbCB3YXkKICAgIGlmICggIWV4aXN0cyAkUGFyYW17QWN0aW9uVmFsdWV9IHx8ICFkZWZpbmVkICRQYXJhbXtBY3Rpb25WYWx1ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEFjdGlvblZhbHVlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgdHJpZ2dlciBBY3Rpb25BZGRQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkFkZFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGRlZmF1bHQgYWN0aW9uIG51bWJlciBpZiBub3QgZ2l2ZW4KICAgIG15ICRBY3Rpb25OdW1iZXIgPSBkZWxldGUgJFBhcmFte0FjdGlvbk51bWJlcn07CiAgICBpZiAoICEkQWN0aW9uTnVtYmVyICkgewogICAgICAgICRBY3Rpb25OdW1iZXIgPSAkU2VsZi0+X0NyZWF0ZU5ld0FjdGlvbk51bWJlciglUGFyYW0pOwogICAgfQoKICAgICMgYWRkIG5ldyBhY3Rpb24gbmFtZSB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25kaXRpb25fYWN0aW9uICcKICAgICAgICAgICAgLiAnKGNvbmRpdGlvbl9pZCwgYWN0aW9uX251bWJlciwgb2JqZWN0X2lkLCAnCiAgICAgICAgICAgIC4gJ2F0dHJpYnV0ZV9pZCwgb3BlcmF0b3JfaWQsIHNlbGVjdG9yLCAnCiAgICAgICAgICAgIC4gJyBhY3Rpb25fdmFsdWUpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q29uZGl0aW9uSUR9LCBcJEFjdGlvbk51bWJlciwgXCRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgIFwkUGFyYW17QXR0cmlidXRlSUR9LCBcJFBhcmFte09wZXJhdG9ySUR9LCBcJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAgICAgXCRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIG15ICRBY3Rpb25JRDsKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25kaXRpb25fYWN0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgY29uZGl0aW9uX2lkID0gPyBBTkQgYWN0aW9uX251bWJlciA9ID8gQU5EIG9iamVjdF9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgYXR0cmlidXRlX2lkID0gPyBBTkQgb3BlcmF0b3JfaWQgPSA/IEFORCBzZWxlY3RvciA9ID8gJwogICAgICAgICAgICAuICdBTkQgYWN0aW9uX3ZhbHVlID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q29uZGl0aW9uSUR9LCBcJEFjdGlvbk51bWJlciwgXCRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgICAgIFwkUGFyYW17QXR0cmlidXRlSUR9LCBcJFBhcmFte09wZXJhdG9ySUR9LCBcJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAgICAgXCRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBpZCBvZiBjcmVhdGVkIGFjdGlvbgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWN0aW9uSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgY2hlY2sgaWYgYWN0aW9uIGNvdWxkIGJlIGFkZGVkCiAgICBpZiAoICEkQWN0aW9uSUQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBY3Rpb25BZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHRyaWdnZXIgQWN0aW9uQWRkUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQWN0aW9uQWRkUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBY3Rpb25JRDsKfQoKPWl0ZW0gQWN0aW9uVXBkYXRlKCkKClVwZGF0ZSBhIGNvbmRpdGlvbiBhY3Rpb24uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25VcGRhdGUoCiAgICAgICAgQWN0aW9uSUQgICAgID0+IDEyMzQsCiAgICAgICAgQWN0aW9uTnVtYmVyID0+IDEsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE9iamVjdElEICAgICA9PiAyMzQsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBBdHRyaWJ1dGVJRCAgPT4gMzQ1LCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgT3BlcmF0b3JJRCAgID0+IDQ1NiwgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNlbGVjdG9yICAgICA9PiAxMjM0JywgICAgICAjIChvcHRpb25hbCkKICAgICAgICBBY3Rpb25WYWx1ZSAgPT4gJ3JlamVjdGVkJywgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFjdGlvblVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBY3Rpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFjdGlvbgogICAgbXkgJEFjdGlvbiA9ICRTZWxmLT5BY3Rpb25HZXQoCiAgICAgICAgQWN0aW9uSUQgPT4gJFBhcmFte0FjdGlvbklEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBhY3Rpb24KICAgIHJldHVybiBpZiAhJEFjdGlvbjsKCiAgICAjIGdldCBjb25kaXRpb24gZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRBY3Rpb24tPntDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgY29uZGl0aW9uCiAgICByZXR1cm4gaWYgISRDb25kaXRpb247CgogICAgIyB0cmlnZ2VyIEFjdGlvblVwZGF0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQWN0aW9uVXBkYXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBtYXAgdXBkYXRlIGF0dHJpYnV0ZXMgdG8gY29sdW1uIG5hbWVzCiAgICBteSAlQXR0cmlidXRlID0gKAogICAgICAgIEFjdGlvbk51bWJlciA9PiAnYWN0aW9uX251bWJlcicsCiAgICAgICAgT2JqZWN0SUQgICAgID0+ICdvYmplY3RfaWQnLAogICAgICAgIEF0dHJpYnV0ZUlEICA9PiAnYXR0cmlidXRlX2lkJywKICAgICAgICBPcGVyYXRvcklEICAgPT4gJ29wZXJhdG9yX2lkJywKICAgICAgICBTZWxlY3RvciAgICAgPT4gJ3NlbGVjdG9yJywKICAgICAgICBBY3Rpb25WYWx1ZSAgPT4gJ2FjdGlvbl92YWx1ZScsCiAgICApOwoKICAgICMgYnVpbGQgU1FMIHRvIHVwZGF0ZSBhY3Rpb24KICAgIG15ICRTUUwgPSAnVVBEQVRFIGNvbmRpdGlvbl9hY3Rpb24gU0VUICc7CiAgICBteSBAQmluZDsKCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJUF0dHJpYnV0ZSApIHsKCiAgICAgICAgIyBwcmVzZXJ2ZSB0aGUgb2xkIHZhbHVlLCB3aGVuIHRoZSBjb2x1bW4gaXNuJ3QgaW4gZnVuY3Rpb24gcGFyYW1ldGVycwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFleGlzdHMgJFBhcmFteyRBdHRyaWJ1dGV9OwogICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFkZWZpbmVkICRQYXJhbXskQXR0cmlidXRlfTsKCiAgICAgICAgIyBwYXJhbSBjaGVja2luZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNvIHRoaXMgaXMgc2FmZQogICAgICAgICRTUUwgLj0gIiRBdHRyaWJ1dGV7JEF0dHJpYnV0ZX0gPSA/LCAiOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17JEF0dHJpYnV0ZX07CiAgICB9CgogICAgIyBzZXQgY29uZGl0aW9uIElEIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIG9mIHByZXZpb3VzIGxvb3AKICAgICRTUUwgLj0gJyBjb25kaXRpb25faWQgPSBjb25kaXRpb25faWQgJzsKCiAgICAjIHNldCBtYXRjaGluZyBvZiBTUUwgc3RhdGVtZW50CiAgICAkU1FMIC49ICdXSEVSRSBpZCA9ID8nOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtBY3Rpb25JRH07CgogICAgIyB1cGRhdGUgYWN0aW9uCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgdHJpZ2dlciBBY3Rpb25VcGRhdGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBY3Rpb25VcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBPbGRBY3Rpb25EYXRhID0+ICRBY3Rpb24sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3Rpb25HZXQoKQoKR2V0IGEgY29uZGl0aW9uIGFjdGlvbiBmb3IgYSBnaXZlbiBhY3Rpb24gaWQuClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBvZiB0aGUgYWN0aW9uIGRhdGEuCgogICAgbXkgJENvbmRpdGlvbkFjdGlvblJlZiA9ICRDb25kaXRpb25PYmplY3QtPkFjdGlvbkdldCgKICAgICAgICBBY3Rpb25JRCA9PiAxMjM0LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkQ29uZGl0aW9uQWN0aW9ue0FjdGlvbklEfQogICAgJENvbmRpdGlvbkFjdGlvbntDb25kaXRpb25JRH0KICAgICRDb25kaXRpb25BY3Rpb257QWN0aW9uTnVtYmVyfQogICAgJENvbmRpdGlvbkFjdGlvbntPYmplY3RJRH0KICAgICRDb25kaXRpb25BY3Rpb257QXR0cmlidXRlSUR9CiAgICAkQ29uZGl0aW9uQWN0aW9ue09wZXJhdG9ySUR9CiAgICAkQ29uZGl0aW9uQWN0aW9ue1NlbGVjdG9yfQogICAgJENvbmRpdGlvbkFjdGlvbntBY3Rpb25WYWx1ZX0KCj1jdXQKCnN1YiBBY3Rpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQWN0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgY29uZGl0aW9uX2lkLCBhY3Rpb25fbnVtYmVyLCBvYmplY3RfaWQsICcKICAgICAgICAgICAgLiAnYXR0cmlidXRlX2lkLCBvcGVyYXRvcl9pZCwgc2VsZWN0b3IsIGFjdGlvbl92YWx1ZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZGl0aW9uX2FjdGlvbiBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBY3Rpb25JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVBY3Rpb25EYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWN0aW9uRGF0YXtBY3Rpb25JRH0gICAgID0gJFJvd1swXTsKICAgICAgICAkQWN0aW9uRGF0YXtDb25kaXRpb25JRH0gID0gJFJvd1sxXTsKICAgICAgICAkQWN0aW9uRGF0YXtBY3Rpb25OdW1iZXJ9ID0gJFJvd1syXTsKICAgICAgICAkQWN0aW9uRGF0YXtPYmplY3RJRH0gICAgID0gJFJvd1szXTsKICAgICAgICAkQWN0aW9uRGF0YXtBdHRyaWJ1dGVJRH0gID0gJFJvd1s0XTsKICAgICAgICAkQWN0aW9uRGF0YXtPcGVyYXRvcklEfSAgID0gJFJvd1s1XTsKICAgICAgICAkQWN0aW9uRGF0YXtTZWxlY3Rvcn0gICAgID0gJFJvd1s2XTsKICAgICAgICAkQWN0aW9uRGF0YXtBY3Rpb25WYWx1ZX0gID0gJFJvd1s3XTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElQWN0aW9uRGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkFjdGlvbklEICRQYXJhbXtBY3Rpb25JRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gXCVBY3Rpb25EYXRhOwp9Cgo9aXRlbSBBY3Rpb25MaXN0KCkKClJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBhbGwgY29uZGl0aW9uIGFjdGlvbgppZHMgZm9yIGEgZ2l2ZW4gQ29uZGl0aW9uSUQgYXMgYXJyYXkgcmVmZXJlbmNlLgoKICAgIG15ICRDb25kaXRpb25BY3Rpb25JRHNSZWYgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+IDEyMzQsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZGl0aW9uX2FjdGlvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmRpdGlvbl9pZCA9ID8gJwogICAgICAgICAgICAuICdPUkRFUiBCWSBhY3Rpb25fbnVtYmVyIEFTQycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q29uZGl0aW9uSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQEFjdGlvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEFjdGlvbkxpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxAQWN0aW9uTGlzdDsKfQoKPWl0ZW0gQWN0aW9uRGVsZXRlKCkKCkRlbGV0ZXMgYSBjb25kaXRpb24gYWN0aW9uLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+QWN0aW9uRGVsZXRlKAogICAgICAgIEFjdGlvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQWN0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhY3Rpb24KICAgIG15ICRBY3Rpb24gPSAkU2VsZi0+QWN0aW9uR2V0KAogICAgICAgIEFjdGlvbklEID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgYWN0aW9uCiAgICByZXR1cm4gaWYgISRBY3Rpb247CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkQWN0aW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgdHJpZ2dlciBBY3Rpb25EZWxldGVQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkRlbGV0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBhY3Rpb24gZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fYWN0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBY3Rpb25JRH0gXSwKICAgICk7CgogICAgIyB0cmlnZ2VyIEFjdGlvbkRlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkRlbGV0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aW9uRGVsZXRlQWxsKCkKCkRlbGV0ZXMgYWxsIGNvbmRpdGlvbiBhY3Rpb25zIGZvciBhIGdpdmVuIGNvbmRpdGlvbiBpZC4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkFjdGlvbkRlbGV0ZUFsbCgKICAgICAgICBDb25kaXRpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aW9uRGVsZXRlQWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgdHJpZ2dlciBBY3Rpb25EZWxldGVBbGxQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkRlbGV0ZUFsbFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBhY3Rpb25zIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY29uZGl0aW9uX2FjdGlvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmRpdGlvbl9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmRpdGlvbklEfSBdLAogICAgKTsKCiAgICAjIHRyaWdnZXIgQWN0aW9uRGVsZXRlQWxsUG9zdC1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQWN0aW9uRGVsZXRlQWxsUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3Rpb25FeGVjdXRlKCkKClJldHVybnMgdGhlIHN1Y2Nlc3MgdmFsdWUgb2YgdGhlIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb24uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5BY3Rpb25FeGVjdXRlKAogICAgICAgIEFjdGlvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBY3Rpb25FeGVjdXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEFjdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWN0aW9uIGNvbnRlbnQKICAgIG15ICRBY3Rpb24gPSAkU2VsZi0+QWN0aW9uR2V0KAogICAgICAgIEFjdGlvbklEID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgYWN0aW9uIGNvbnRlbnQKICAgIHJldHVybiBpZiAhJEFjdGlvbjsKCiAgICAjIGdldCBjb25kaXRpb24gZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRBY3Rpb24tPntDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgY29uZGl0aW9uCiAgICByZXR1cm4gaWYgISRDb25kaXRpb247CgogICAgIyBnZXQgYWN0aW9uIGF0dHJpYnV0ZXMKICAgIG15ICRBY3Rpb25EYXRhID0gJFNlbGYtPl9BY3Rpb25FeGVjdXRlSW5pdCgKICAgICAgICBBY3Rpb24gPT4gJEFjdGlvbiwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgYWN0aW9uIGF0dHJpYnV0ZXMKICAgIHJldHVybiBpZiAhJEFjdGlvbkRhdGE7CgogICAgIyBkbyBub3QgZXhlY3V0ZSAnbG9jaycgYWN0aW9ucywgdGhleSBhcmUgcGFzc2l2ZSEKICAgIG15IEBPbWl0QWN0aW9ucyA9IHF3KCBsb2NrICk7CiAgICByZXR1cm4gMCBpZiBncmVwIHsgJEFjdGlvbkRhdGEtPntPcGVyYXRvcn0tPntOYW1lfSBlcSAkXyB9IEBPbWl0QWN0aW9uczsKCiAgICAjIHRyaWdnZXIgQWN0aW9uRXhlY3V0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQWN0aW9uRXhlY3V0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICV7JENvbmRpdGlvbn0sCiAgICAgICAgICAgIENvbmRpdGlvbk5hbWUgPT4gJENvbmRpdGlvbi0+e05hbWV9LAogICAgICAgICAgICBDaGFuZ2VJRCAgICAgID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRBY3Rpb25EYXRhLT57T2JqZWN0fS0+e05hbWV9OwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkQWN0aW9uT2JqZWN0RGF0YSA9ICRTZWxmLT5PYmplY3REYXRhR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRBY3Rpb24tPntDb25kaXRpb25JRH0sCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJE9iamVjdE5hbWUsCiAgICAgICAgU2VsZWN0b3IgICAgPT4gJEFjdGlvbi0+e1NlbGVjdG9yfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgYWN0aW9uIG9iamVjdCBkYXRhCiAgICAjIG5vIG5lZWQgdG8gZXhlY3V0ZSBvcGVyYXRvciBpZiBpdCBpcyBhbiBlbXB0eSBhcnJheSByZWYKICAgIGlmICgKICAgICAgICAhJEFjdGlvbk9iamVjdERhdGEKICAgICAgICB8fCByZWYgJEFjdGlvbk9iamVjdERhdGEgbmUgJ0FSUkFZJwogICAgICAgIHx8IHJlZiAkQWN0aW9uT2JqZWN0RGF0YSBlcSAnQVJSQVknICYmICFAeyRBY3Rpb25PYmplY3REYXRhfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIG9iamVjdCBkYXRhIGZvciAkT2JqZWN0TmFtZSAoJEFjdGlvbi0+e1NlbGVjdG9yfSkgZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhdHRyaWJ1dGUgdHlwZQogICAgbXkgJEF0dHJpYnV0ZVR5cGUgPSAkQWN0aW9uRGF0YS0+e0F0dHJpYnV0ZX0tPntOYW1lfTsKCiAgICAjIGNoZWNrIGF0dHJpYnV0ZSB0eXBlCiAgICBpZiAoICEkQXR0cmlidXRlVHlwZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGF0dHJpYnV0ZSAkT2JqZWN0TmFtZSAoJEFjdGlvbi0+e1NlbGVjdG9yfSkgZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBvYmplY3QgYXR0cmlidXRlCiAgICBmb3IgbXkgJEFjdGlvbk9iamVjdCAoIEB7JEFjdGlvbk9iamVjdERhdGF9ICkgewogICAgICAgIGlmICggIWV4aXN0cyAkQWN0aW9uT2JqZWN0LT57JEF0dHJpYnV0ZVR5cGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGF0dHJpYnV0ZSBmb3IgJE9iamVjdE5hbWUgKCRBdHRyaWJ1dGVUeXBlKSBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVmaW5lIG9wZXJhdG9yIHZhbHVlcwogICAgbXkgJU9wZXJhdG9yRXhlY3V0ZSA9ICgKICAgICAgICBPcGVyYXRvck5hbWUgPT4gJEFjdGlvbkRhdGEtPntPcGVyYXRvcn0tPntOYW1lfSwKICAgICAgICBPYmplY3REYXRhICAgPT4gJEFjdGlvbk9iamVjdERhdGEsCiAgICAgICAgT2JqZWN0TmFtZSAgID0+ICRPYmplY3ROYW1lLAogICAgICAgIFNlbGVjdG9yICAgICA9PiAkQWN0aW9uLT57U2VsZWN0b3J9LAogICAgICAgIEF0dHJpYnV0ZSAgICA9PiAkQXR0cmlidXRlVHlwZSwKICAgICAgICBBY3Rpb25WYWx1ZSAgPT4gJEFjdGlvbi0+e0FjdGlvblZhbHVlfSwKICAgICAgICBBY3Rpb25JRCAgICAgPT4gJEFjdGlvbi0+e0FjdGlvbklEfSwKICAgICk7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpb25zIGV4ZWN1dGlvbgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5PcGVyYXRvckV4ZWN1dGUoCiAgICAgICAgJU9wZXJhdG9yRXhlY3V0ZSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IG5pY2UgYWN0aW9uIHJlc3VsdAogICAgbXkgJEFjdGlvblJlc3VsdCA9ICgkUmVzdWx0KSA/ICdzdWNjZXNzZnVsbHknIDogJ3Vuc3VjY2Vzc2Z1bGx5JzsKCiAgICAjIHRyaWdnZXIgQWN0aW9uRXhlY3V0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FjdGlvbkV4ZWN1dGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskQ29uZGl0aW9ufSwKICAgICAgICAgICAgQ29uZGl0aW9uTmFtZSA9PiAkQ29uZGl0aW9uLT57TmFtZX0sCiAgICAgICAgICAgICVPcGVyYXRvckV4ZWN1dGUsCiAgICAgICAgICAgIENoYW5nZUlEICAgICA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBBY3Rpb25SZXN1bHQgPT4gJEFjdGlvblJlc3VsdCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpb25zIGV4ZWN1dGlvbgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1pdGVtIF9BY3Rpb25FeGVjdXRlSW5pdCgpCgpSZXR1cm5zIG9iamVjdCwgYXR0cmlidXRlIGFuZCBvcGVyYXRvciBvZiBhIGdpdmVuIGFjdGlvbi4KCiAgICBteSAkQWN0aW9uRGF0YSA9ICRDb25kaXRpb25PYmplY3QtPl9BY3Rpb25FeGVjdXRlSW5pdCgKICAgICAgICBBY3Rpb24gPT4gJEFjdGlvblJlZiwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0FjdGlvbkV4ZWN1dGVJbml0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBleHRyYWN0IGFjdGlvbgogICAgbXkgJEFjdGlvbiA9ICRQYXJhbXtBY3Rpb259OwoKICAgICMgZGVjbGFyZSBhY3Rpb24gZGF0YQogICAgbXkgJUFjdGlvbkRhdGE7CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgICRBY3Rpb25EYXRhe09iamVjdH0gPSAkU2VsZi0+T2JqZWN0R2V0KAogICAgICAgIE9iamVjdElEID0+ICRBY3Rpb24tPntPYmplY3RJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIG9iamVjdCBkYXRhCiAgICBpZiAoICEkQWN0aW9uRGF0YXtPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsdWUgZm9yICdPYmplY3QnIHdpdGggSUQgJyRBY3Rpb24tPntPYmplY3RJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgYXR0cmlidXRlIGRhdGEKICAgICRBY3Rpb25EYXRhe0F0dHJpYnV0ZX0gPSAkU2VsZi0+QXR0cmlidXRlR2V0KAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRBY3Rpb24tPntBdHRyaWJ1dGVJRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGF0dHJpYnV0ZSBkYXRhCiAgICBpZiAoICEkQWN0aW9uRGF0YXtBdHRyaWJ1dGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsdWUgZm9yICdBdHRyaWJ1dGUnIHdpdGggSUQgJyRBY3Rpb24tPntBdHRyaWJ1dGVJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb3BlcmF0b3IgZGF0YQogICAgJEFjdGlvbkRhdGF7T3BlcmF0b3J9ID0gJFNlbGYtPk9wZXJhdG9yR2V0KAogICAgICAgIE9wZXJhdG9ySUQgPT4gJEFjdGlvbi0+e09wZXJhdG9ySUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIG9wZXJhdG9yIGRhdGEKICAgIGlmICggISRBY3Rpb25EYXRhe09wZXJhdG9yfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbHVlIGZvciAnT3BlcmF0b3InIHdpdGggSUQgJyRBY3Rpb24tPntPcGVyYXRvcklEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gXCVBY3Rpb25EYXRhOwp9Cgo9aXRlbSBfQ3JlYXRlTmV3QWN0aW9uTnVtYmVyKCkKCkNyZWF0ZSBhIG5ldyB1bnVzZWQgYWN0aW9uIG51bWJlciBmb3IgdGhlIGdpdmVuIGNvbmRpdGlvbi4KVGhlIGhpZ2hlc3QgY3VycmVudCBhY3Rpb24gbnVtYmVyIGZvciB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzCmxvb2tlZCB1cCBhbmQgaW5jcmVtZW50ZWQgYnkgb25lLgoKICAgIG15ICRBY3Rpb25OdW1iZXIgPSAkQ29uZGl0aW9uT2JqZWN0LT5fQ3JlYXRlTmV3QWN0aW9uTnVtYmVyKAogICAgICAgIENvbmRpdGlvbklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgX0NyZWF0ZU5ld0FjdGlvbk51bWJlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZGl0aW9uSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25kaXRpb25JRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBsYXJnZXN0IGFjdGlvbiBudW1iZXIKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgTUFYKGFjdGlvbl9udW1iZXIpICcKICAgICAgICAgICAgLiAnRlJPTSBjb25kaXRpb25fYWN0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgY29uZGl0aW9uX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NvbmRpdGlvbklEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdCwgZGVmYXVsdCB0byAwIHdoZW4gdGhlcmUgYXJlIG5vIGFjdGlvbnMgeWV0CiAgICBteSAkQWN0aW9uTnVtYmVyOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkgKSB7CiAgICAgICAgJEFjdGlvbk51bWJlciA9ICRSb3dbMF07CiAgICB9CiAgICAkQWN0aW9uTnVtYmVyIHx8PSAwOwoKICAgICMgaW5jcmVtZW50IG51bWJlciB0byBnZXQgYSBub24tZXhpc3RlbnQgYWN0aW9uIG51bWJlcgogICAgJEFjdGlvbk51bWJlcisrOwoKICAgIHJldHVybiAkQWN0aW9uTnVtYmVyOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMSAkICREYXRlOiAyMDEwLzA1LzIxIDEwOjIyOjEyICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL0F0dHJpYnV0ZS5wbSAtIGFsbCBjb25kaXRpb24gYXR0cmlidXRlIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQXR0cmlidXRlLnBtLHYgMS4xMSAyMDEwLzA2LzE1IDAxOjA0OjQ3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpBdHRyaWJ1dGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6QXR0cmlidXRlIC0gY29uZGl0aW9uIGF0dHJpYnV0ZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9uIGF0dHJpYnV0ZXMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWl0ZW0gQXR0cmlidXRlQWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gYXR0cmlidXRlLgoKICAgIG15ICRBdHRyaWJ1dGVJRCA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUFkZCgKICAgICAgICBOYW1lICAgPT4gJ0F0dHJpYnV0ZU5hbWUnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBdHRyaWJ1dGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBsb29rdXAgd2l0aCBnaXZlbiBuYW1lIGZvciBjaGVja3MKICAgIG15ICRBdHRyaWJ1dGVJRCA9ICRTZWxmLT5BdHRyaWJ1dGVMb29rdXAoIE5hbWUgPT4gJFBhcmFte05hbWV9ICk7CgogICAgIyBjaGVjayBpZiBhdHRyaWJ1dGUgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCRBdHRyaWJ1dGVJRCkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ29uZGl0aW9uIGF0dHJpYnV0ZSAoJFBhcmFte05hbWV9KSBhbHJlYWR5IGV4aXN0cyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYWRkIG5ldyBhdHRyaWJ1dGUgbmFtZSB0byBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25kaXRpb25fYXR0cmlidXRlICcKICAgICAgICAgICAgLiAnKG5hbWUpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/KScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICk7CgogICAgIyBnZXQgaWQgb2YgY3JlYXRlZCBhdHRyaWJ1dGUKICAgICRBdHRyaWJ1dGVJRCA9ICRTZWxmLT5BdHRyaWJ1dGVMb29rdXAoIE5hbWUgPT4gJFBhcmFte05hbWV9ICk7CgogICAgIyBjaGVjayBpZiBhdHRyaWJ1dGUgY291bGQgYmUgYWRkZWQKICAgIGlmICggISRBdHRyaWJ1dGVJRCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dHJpYnV0ZUFkZCgpIGZhaWxlZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQXR0cmlidXRlSUQ7Cn0KCj1pdGVtIEF0dHJpYnV0ZVVwZGF0ZSgpCgpVcGRhdGUgYSBjb25kaXRpb24gYXR0cmlidXRlLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlVXBkYXRlKAogICAgICAgIEF0dHJpYnV0ZUlEID0+IDEyMzQsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05ld0F0dHJpYnV0ZU5hbWUnLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEF0dHJpYnV0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBdHRyaWJ1dGVJRCBOYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXR0cmlidXRlIGRhdGEKICAgIG15ICRBdHRyaWJ1dGVEYXRhID0gJFNlbGYtPkF0dHJpYnV0ZUdldCgKICAgICAgICBBdHRyaWJ1dGVJRCA9PiAkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGF0dHJpYnV0ZSBkYXRhCiAgICBpZiAoICEkQXR0cmlidXRlRGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dHJpYnV0ZVVwZGF0ZSBvZiAkUGFyYW17QXR0cmlidXRlSUR9IGZhaWxlZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXBkYXRlIGF0dHJpYnV0ZSBpbiBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgY29uZGl0aW9uX2F0dHJpYnV0ZSAnCiAgICAgICAgICAgIC4gJ1NFVCBuYW1lID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBdHRyaWJ1dGVHZXQoKQoKR2V0IGEgY29uZGl0aW9uIGF0dHJpYnV0ZSBmb3IgYSBnaXZlbiBhdHRyaWJ1dGUgaWQuClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBvZiB0aGUgYXR0cmlidXRlIGRhdGEuCgogICAgbXkgJENvbmRpdGlvbkF0dHJpYnV0ZVJlZiA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUdldCgKICAgICAgICBBdHRyaWJ1dGVJRCA9PiAxMjM0LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkQ29uZGl0aW9uQXR0cmlidXRle0F0dHJpYnV0ZUlEfQogICAgJENvbmRpdGlvbkF0dHJpYnV0ZXtOYW1lfQoKPWN1dAoKc3ViIEF0dHJpYnV0ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBdHRyaWJ1dGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBjb25kaXRpb25fYXR0cmlidXRlIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0F0dHJpYnV0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUF0dHJpYnV0ZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBdHRyaWJ1dGVEYXRhe0F0dHJpYnV0ZUlEfSA9ICRSb3dbMF07CiAgICAgICAgJEF0dHJpYnV0ZURhdGF7TmFtZX0gICAgICAgID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElQXR0cmlidXRlRGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dHJpYnV0ZUlEICRQYXJhbXtBdHRyaWJ1dGVJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gXCVBdHRyaWJ1dGVEYXRhOwp9Cgo9aXRlbSBBdHRyaWJ1dGVMb29rdXAoKQoKVGhpcyBtZXRob2QgZG9lcyBhIGxvb2t1cCBmb3IgYSBjb25kaXRpb24gYXR0cmlidXRlLiBJZiBhbiBhdHRyaWJ1dGUKaWQgaXMgZ2l2ZW4sIGl0IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gSWYgdGhlIG5hbWUgb2YgdGhlCmF0dHJpYnV0ZSBpcyBnaXZlbiwgdGhlIGFwcHJvcHJpYXRlIGlkIGlzIHJldHVybmVkLgoKICAgIG15ICRBdHRyaWJ1dGVOYW1lID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlTG9va3VwKAogICAgICAgIEF0dHJpYnV0ZUlEID0+IDQzMjEsCiAgICApOwoKICAgIG15ICRBdHRyaWJ1dGVJRCA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUxvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJ0F0dHJpYnV0ZU5hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBBdHRyaWJ1dGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGlmIGJvdGggcGFyYW1ldGVycyBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte0F0dHJpYnV0ZUlEfSAmJiAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEF0dHJpYnV0ZUlEIG9yIE5hbWUgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYm90aCBwYXJhbWV0ZXJzIGFyZSBub3QgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtBdHRyaWJ1dGVJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQXR0cmlidXRlSUQgb3IgTmFtZSAtIG5vbmUgaXMgZ2l2ZW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIEF0dHJpYnV0ZUlEIGlzIGEgbnVtYmVyCiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGVJRH0gJiYgJFBhcmFte0F0dHJpYnV0ZUlEfSAhfiBteyBcQSBcZCsgXHogfXhtcyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkF0dHJpYnV0ZUlEIG11c3QgYmUgYSBudW1iZXIhIChBdHRyaWJ1dGVJRDogJFBhcmFte0F0dHJpYnV0ZUlEfSkiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50cwogICAgaWYgKCAkUGFyYW17QXR0cmlidXRlSUR9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIGNvbmRpdGlvbl9hdHRyaWJ1dGUgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0F0dHJpYnV0ZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtOYW1lfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gY29uZGl0aW9uX2F0dHJpYnV0ZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTG9va3VwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTG9va3VwID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJExvb2t1cDsKfQoKPWl0ZW0gQXR0cmlidXRlTGlzdCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29uZGl0aW9uIGF0dHJpYnV0ZXMgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZGl0aW9uQXR0cmlidXRlc1JlZiA9ICRDb25kaXRpb25PYmplY3QtPkF0dHJpYnV0ZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGVudHJpZXMgbGlrZSB0aGlzOgoKICAgICRDb25kaXRpb25BdHRyaWJ1dGV7QXR0cmlidXRlSUR9ID0gJ0F0dHJpYnV0ZU5hbWUnCgo9Y3V0CgpzdWIgQXR0cmlidXRlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBjb25kaXRpb25fYXR0cmlidXRlJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlQXR0cmlidXRlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEF0dHJpYnV0ZUxpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlQXR0cmlidXRlTGlzdDsKfQoKPWl0ZW0gQXR0cmlidXRlRGVsZXRlKCkKCkRlbGV0ZXMgYSBjb25kaXRpb24gYXR0cmlidXRlLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+QXR0cmlidXRlRGVsZXRlKAogICAgICAgIEF0dHJpYnV0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBdHRyaWJ1dGVEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQXR0cmlidXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBjb25kaXRpb24gYXR0cmlidXRlIGZyb20gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY29uZGl0aW9uX2F0dHJpYnV0ZSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17QXR0cmlidXRlSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMSAkICREYXRlOiAyMDEwLzA2LzE1IDAxOjA0OjQ3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL0V4cHJlc3Npb24ucG0gLSBhbGwgY29uZGl0aW9uIGV4cHJlc3Npb24gZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBFeHByZXNzaW9uLnBtLHYgMS4yOCAyMDEwLzAxLzMxIDEzOjIzOjA1IG1hZSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6RXhwcmVzc2lvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjggJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpFeHByZXNzaW9uIC0gY29uZGl0aW9uIGV4cHJlc3Npb24gbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMgZm9yIGNvbmRpdGlvbiBleHByZXNzaW9ucyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9aXRlbSBFeHByZXNzaW9uQWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gZXhwcmVzc2lvbi4KCiAgICBteSAkRXhwcmVzc2lvbklEID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkFkZCgKICAgICAgICBDb25kaXRpb25JRCAgPT4gMTIzLAogICAgICAgIE9iamVjdElEICAgICA9PiAyMzQsCiAgICAgICAgQXR0cmlidXRlSUQgID0+IDM0NSwKICAgICAgICBPcGVyYXRvcklEICAgPT4gNDU2LAogICAgICAgIFNlbGVjdG9yICAgICA9PiAxMjM0LAogICAgICAgIENvbXBhcmVWYWx1ZSA9PiAncmVqZWN0ZWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHByZXNzaW9uQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmRpdGlvbklEIE9iamVjdElEIEF0dHJpYnV0ZUlEIE9wZXJhdG9ySUQgU2VsZWN0b3IgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSAnQ29tcGFyZVZhbHVlJyBpbiBhIHNwZWNpYWwgd2F5CiAgICBpZiAoICFleGlzdHMgJFBhcmFte0NvbXBhcmVWYWx1ZX0gfHwgIWRlZmluZWQgJFBhcmFte0NvbXBhcmVWYWx1ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbXBhcmVWYWx1ZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbmRpdGlvbiBmb3IgZXZlbnQgaGFuZGxlcgogICAgbXkgJENvbmRpdGlvbiA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBjb25kaXRpb24KICAgIHJldHVybiBpZiAhJENvbmRpdGlvbjsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvbkFkZFByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRXhwcmVzc2lvbkFkZFByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgYWRkIG5ldyBleHByZXNzaW9uIG5hbWUgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZGl0aW9uX2V4cHJlc3Npb24gJwogICAgICAgICAgICAuICcoY29uZGl0aW9uX2lkLCBvYmplY3RfaWQsIGF0dHJpYnV0ZV9pZCwgJwogICAgICAgICAgICAuICdvcGVyYXRvcl9pZCwgc2VsZWN0b3IsIGNvbXBhcmVfdmFsdWUpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q29uZGl0aW9uSUR9LCBcJFBhcmFte09iamVjdElEfSwgXCRQYXJhbXtBdHRyaWJ1dGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17T3BlcmF0b3JJRH0sICBcJFBhcmFte1NlbGVjdG9yfSwgXCRQYXJhbXtDb21wYXJlVmFsdWV9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICBteSAkRXhwcmVzc2lvbklEOwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmRpdGlvbl9leHByZXNzaW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgY29uZGl0aW9uX2lkID0gPyBBTkQgb2JqZWN0X2lkID0gPyBBTkQgYXR0cmlidXRlX2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBvcGVyYXRvcl9pZCA9ID8gQU5EIHNlbGVjdG9yID0gPyBBTkQgY29tcGFyZV92YWx1ZSA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NvbmRpdGlvbklEfSwgXCRQYXJhbXtPYmplY3RJRH0sIFwkUGFyYW17QXR0cmlidXRlSUR9LAogICAgICAgICAgICBcJFBhcmFte09wZXJhdG9ySUR9LCAgXCRQYXJhbXtTZWxlY3Rvcn0sIFwkUGFyYW17Q29tcGFyZVZhbHVlfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGlkIG9mIGNyZWF0ZWQgZXhwcmVzc2lvbgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRXhwcmVzc2lvbklEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGV4cHJlc3Npb24gY291bGQgYmUgYWRkZWQKICAgIGlmICggISRFeHByZXNzaW9uSUQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFeHByZXNzaW9uQWRkKCkgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB0cmlnZ2VyIEV4cHJlc3Npb25BZGRQb3N0LUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdFeHByZXNzaW9uQWRkUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEICAgICA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRFeHByZXNzaW9uSUQ7Cn0KCj1pdGVtIEV4cHJlc3Npb25VcGRhdGUoKQoKVXBkYXRlIGEgY29uZGl0aW9uIGV4cHJlc3Npb24uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5FeHByZXNzaW9uVXBkYXRlKAogICAgICAgIEV4cHJlc3Npb25JRCA9PiAxMjM0LAogICAgICAgIE9iamVjdElEICAgICA9PiAyMzQsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBBdHRyaWJ1dGVJRCAgPT4gMzQ1LCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgT3BlcmF0b3JJRCAgID0+IDQ1NiwgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNlbGVjdG9yICAgICA9PiAxMjM0LCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ3JlamVjdGVkJywgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cHJlc3Npb25VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoRXhwcmVzc2lvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZXhwcmVzc2lvbgogICAgbXkgJEV4cHJlc3Npb24gPSAkU2VsZi0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGV4cHJlc3Npb24KICAgIHJldHVybiBpZiAhJEV4cHJlc3Npb247CgogICAgIyBnZXQgY29uZGl0aW9uIGZvciBldmVudCBoYW5kbGVyCiAgICBteSAkQ29uZGl0aW9uID0gJFNlbGYtPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkRXhwcmVzc2lvbi0+e0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBjb25kaXRpb24KICAgIHJldHVybiBpZiAhJENvbmRpdGlvbjsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvblVwZGF0ZVByZS1FdmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnRXhwcmVzc2lvblVwZGF0ZVByZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDb25kaXRpb24tPntDaGFuZ2VJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgbWFwIHVwZGF0ZSBhdHRyaWJ1dGVzIHRvIGNvbHVtbiBuYW1lcwogICAgbXkgJUF0dHJpYnV0ZSA9ICgKICAgICAgICBPYmplY3RJRCAgICAgPT4gJ29iamVjdF9pZCcsCiAgICAgICAgQXR0cmlidXRlSUQgID0+ICdhdHRyaWJ1dGVfaWQnLAogICAgICAgIE9wZXJhdG9ySUQgICA9PiAnb3BlcmF0b3JfaWQnLAogICAgICAgIFNlbGVjdG9yICAgICA9PiAnc2VsZWN0b3InLAogICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnY29tcGFyZV92YWx1ZScsCiAgICApOwoKICAgICMgYnVpbGQgU1FMIHRvIHVwZGF0ZSBleHByZXNzaW9uCiAgICBteSAkU1FMID0gJ1VQREFURSBjb25kaXRpb25fZXhwcmVzc2lvbiBTRVQgJzsKICAgIG15IEBCaW5kOwoKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAlQXR0cmlidXRlICkgewoKICAgICAgICAjIHByZXNlcnZlIHRoZSBvbGQgdmFsdWUsIHdoZW4gdGhlIGNvbHVtbiBpc24ndCBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIWV4aXN0cyAkUGFyYW17JEF0dHJpYnV0ZX07CiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIWRlZmluZWQgJFBhcmFteyRBdHRyaWJ1dGV9OwoKICAgICAgICAjIHBhcmFtIGNoZWNraW5nIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc28gdGhpcyBpcyBzYWZlCiAgICAgICAgJFNRTCAuPSAiJEF0dHJpYnV0ZXskQXR0cmlidXRlfSA9ID8sICI7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXskQXR0cmlidXRlfTsKICAgIH0KCiAgICAjIHNldCBjb25kaXRpb24gSUQgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgb2YgcHJldmlvdXMgbG9vcAogICAgJFNRTCAuPSAnIGNvbmRpdGlvbl9pZCA9IGNvbmRpdGlvbl9pZCAnOwoKICAgICMgc2V0IG1hdGNoaW5nIG9mIFNRTCBzdGF0ZW1lbnQKICAgICRTUUwgLj0gJ1dIRVJFIGlkID0gPyc7CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0V4cHJlc3Npb25JRH07CgogICAgIyB1cGRhdGUgZXhwcmVzc2lvbgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvblVwZGF0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0V4cHJlc3Npb25VcGRhdGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgT2xkRXhwcmVzc2lvbkRhdGEgPT4gJEV4cHJlc3Npb24sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBFeHByZXNzaW9uR2V0KCkKCkdldCBhIGNvbmRpdGlvbiBleHByZXNzaW9uIGZvciBhIGdpdmVuIGV4cHJlc3Npb24gaWQuClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBvZiB0aGUgZXhwcmVzc2lvbiBkYXRhLgoKICAgIG15ICRDb25kaXRpb25FeHByZXNzaW9uUmVmID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gMTIzNCwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgZm9sbG93aW5nIGVsZW1lbnRzOgoKICAgICRDb25kaXRpb25FeHByZXNzaW9ue0V4cHJlc3Npb25JRH0KICAgICRDb25kaXRpb25FeHByZXNzaW9ue0NvbmRpdGlvbklEfQogICAgJENvbmRpdGlvbkV4cHJlc3Npb257T2JqZWN0SUR9CiAgICAkQ29uZGl0aW9uRXhwcmVzc2lvbntBdHRyaWJ1dGVJRH0KICAgICRDb25kaXRpb25FeHByZXNzaW9ue09wZXJhdG9ySUR9CiAgICAkQ29uZGl0aW9uRXhwcmVzc2lvbntTZWxlY3Rvcn0KICAgICRDb25kaXRpb25FeHByZXNzaW9ue0NvbXBhcmVWYWx1ZX0KCj1jdXQKCnN1YiBFeHByZXNzaW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEV4cHJlc3Npb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBjb25kaXRpb25faWQsIG9iamVjdF9pZCwgYXR0cmlidXRlX2lkLCAnCiAgICAgICAgICAgIC4gJ29wZXJhdG9yX2lkLCBzZWxlY3RvciwgY29tcGFyZV92YWx1ZSAnCiAgICAgICAgICAgIC4gJ0ZST00gY29uZGl0aW9uX2V4cHJlc3Npb24gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17RXhwcmVzc2lvbklEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUV4cHJlc3Npb25EYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRXhwcmVzc2lvbkRhdGF7RXhwcmVzc2lvbklEfSA9ICRSb3dbMF07CiAgICAgICAgJEV4cHJlc3Npb25EYXRhe0NvbmRpdGlvbklEfSAgPSAkUm93WzFdOwogICAgICAgICRFeHByZXNzaW9uRGF0YXtPYmplY3RJRH0gICAgID0gJFJvd1syXTsKICAgICAgICAkRXhwcmVzc2lvbkRhdGF7QXR0cmlidXRlSUR9ICA9ICRSb3dbM107CiAgICAgICAgJEV4cHJlc3Npb25EYXRhe09wZXJhdG9ySUR9ICAgPSAkUm93WzRdOwogICAgICAgICRFeHByZXNzaW9uRGF0YXtTZWxlY3Rvcn0gICAgID0gJFJvd1s1XTsKICAgICAgICAkRXhwcmVzc2lvbkRhdGF7Q29tcGFyZVZhbHVlfSA9ICRSb3dbNl07CiAgICB9CgogICAgIyBjaGVjayBlcnJvcgogICAgaWYgKCAhJUV4cHJlc3Npb25EYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRXhwcmVzc2lvbklEICRQYXJhbXtFeHByZXNzaW9uSUR9IGRvZXMgbm90IGV4aXN0ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIFwlRXhwcmVzc2lvbkRhdGE7Cn0KCj1pdGVtIEV4cHJlc3Npb25MaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGFsbCBjb25kaXRpb24gZXhwcmVzc2lvbiBpZHMgZm9yCmEgZ2l2ZW4gQ29uZGl0aW9uSUQgYXMgYXJyYXkgcmVmZXJlbmNlLgoKICAgIG15ICRDb25kaXRpb25FeHByZXNzaW9uSURzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbkxpc3QoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzNCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBFeHByZXNzaW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb25kaXRpb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBTUUwgc3RhdGVtZW50CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gY29uZGl0aW9uX2V4cHJlc3Npb24gJwogICAgICAgICAgICAuICdXSEVSRSBjb25kaXRpb25faWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDb25kaXRpb25JRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBARXhwcmVzc2lvbkxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEV4cHJlc3Npb25MaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQEV4cHJlc3Npb25MaXN0Owp9Cgo9aXRlbSBFeHByZXNzaW9uRGVsZXRlKCkKCkRlbGV0ZXMgYSBjb25kaXRpb24gZXhwcmVzc2lvbi4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25EZWxldGUoCiAgICAgICAgRXhwcmVzc2lvbklEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwcmVzc2lvbkRlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhFeHByZXNzaW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBleHByZXNzaW9uCiAgICBteSAkRXhwcmVzc2lvbiA9ICRTZWxmLT5FeHByZXNzaW9uR2V0KAogICAgICAgIEV4cHJlc3Npb25JRCA9PiAkUGFyYW17RXhwcmVzc2lvbklEfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXhwcmVzc2lvbgogICAgcmV0dXJuIGlmICEkRXhwcmVzc2lvbjsKCiAgICAjIGdldCBjb25kaXRpb24gZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRFeHByZXNzaW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uOwoKICAgICMgdHJpZ2dlciBFeHByZXNzaW9uRGVsZXRlUHJlLUV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdFeHByZXNzaW9uRGVsZXRlUHJlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgY29uZGl0aW9uIGV4cHJlc3Npb24gZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fZXhwcmVzc2lvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17RXhwcmVzc2lvbklEfSBdLAogICAgKTsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvbkRlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0V4cHJlc3Npb25EZWxldGVQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEV4cHJlc3Npb25EZWxldGVBbGwoKQoKRGVsZXRlcyBhbGwgY29uZGl0aW9uIGV4cHJlc3Npb25zIGZvciBhIGdpdmVuIGNvbmRpdGlvbiBpZC4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPkV4cHJlc3Npb25EZWxldGVBbGwoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cHJlc3Npb25EZWxldGVBbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZGl0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25kaXRpb24gZm9yIGV2ZW50IGhhbmRsZXIKICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgY29uZGl0aW9uCiAgICByZXR1cm4gaWYgISRDb25kaXRpb247CgogICAgIyB0cmlnZ2VyIEV4cHJlc3Npb25EZWxldGVBbGxQcmUtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0V4cHJlc3Npb25EZWxldGVBbGxQcmUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBDaGFuZ2VJRCAgICA9PiAkQ29uZGl0aW9uLT57Q2hhbmdlSUR9LAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBjb25kaXRpb24gZXhwcmVzc2lvbnMgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fZXhwcmVzc2lvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGNvbmRpdGlvbl9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmRpdGlvbklEfSBdLAogICAgKTsKCiAgICAjIHRyaWdnZXIgRXhwcmVzc2lvbkRlbGV0ZUFsbFBvc3QtRXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0V4cHJlc3Npb25EZWxldGVBbGxQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENvbmRpdGlvbi0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEV4cHJlc3Npb25NYXRjaCgpCgpSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24uCgogICAgbXkgJE1hdGNoID0gJENvbmRpdGlvbk9iamVjdC0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgIEV4cHJlc3Npb25JRCAgICAgID0+IDEyMywKICAgICAgICBBdHRyaWJ1dGVzQ2hhbmdlZCA9PiB7IElUU01DaGFuZ2UgPT4gWyBDaGFuZ2VUaXRsZSwgQ2hhbmdlRGVzY3JpcHRpb24gXSB9LCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRXhwcmVzc2lvbk1hdGNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEV4cHJlc3Npb25JRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGV4cHJlc3Npb24gY29udGVudAogICAgbXkgJEV4cHJlc3Npb24gPSAkU2VsZi0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJFBhcmFte0V4cHJlc3Npb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGV4cHJlc3Npb24gY29udGVudAogICAgcmV0dXJuIGlmICEkRXhwcmVzc2lvbjsKCiAgICAjIGdldCBleHByZXNzaW9uIGF0dHJpYnV0ZXMKICAgIG15ICRFeHByZXNzaW9uRGF0YSA9ICRTZWxmLT5fRXhwcmVzc2lvbk1hdGNoSW5pdCgKICAgICAgICBFeHByZXNzaW9uID0+ICRFeHByZXNzaW9uLAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXhwcmVzc2lvbiBhdHRyaWJ1dGVzCiAgICByZXR1cm4gaWYgISRFeHByZXNzaW9uRGF0YTsKCiAgICAjIGdldCBjaGFuZ2VkIGF0dHJpYnV0ZXMKICAgIG15ICRBdHRyaWJ1dGVzQ2hhbmdlZFR5cGU7CiAgICBteSBAQXR0cmlidXRlc0NoYW5nZWQ7CiAgICBpZiAoIGV4aXN0cyAkUGFyYW17QXR0cmlidXRlc0NoYW5nZWR9ICYmIGRlZmluZWQgJFBhcmFte0F0dHJpYnV0ZXNDaGFuZ2VkfSApIHsKCiAgICAgICAgIyBjaGFuZ2VkIGF0dHJpYnV0ZXMKICAgICAgICBteSAlQXR0cmlidXRlQ2hhbmdlZDsKCiAgICAgICAgIyBjaGVjayBmb3IgcmVmZXJlbmNlIHR5cGUKICAgICAgICBpZiAoIHJlZiAkUGFyYW17QXR0cmlidXRlc0NoYW5nZWR9IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgJUF0dHJpYnV0ZUNoYW5nZWQgPSAleyAkUGFyYW17QXR0cmlidXRlc0NoYW5nZWR9IH07CgogICAgICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdHlwZQogICAgICAgICAgICAkQXR0cmlidXRlc0NoYW5nZWRUeXBlID0gKCBrZXlzICVBdHRyaWJ1dGVDaGFuZ2VkIClbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciByZWZlcmVuY2UgdHlwZQogICAgICAgIGlmICggJEF0dHJpYnV0ZXNDaGFuZ2VkVHlwZSAmJiByZWYgJEF0dHJpYnV0ZUNoYW5nZWR7JEF0dHJpYnV0ZXNDaGFuZ2VkVHlwZX0gZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgY2hhbmdlZCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIEBBdHRyaWJ1dGVzQ2hhbmdlZCA9IEB7ICRBdHRyaWJ1dGVDaGFuZ2VkeyRBdHRyaWJ1dGVzQ2hhbmdlZFR5cGV9IH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRFeHByZXNzaW9uRGF0YS0+e09iamVjdH0tPntOYW1lfTsKCiAgICAjIGNoZWNrIGZvciBjaGFuZ2VkIGF0dHJpYnV0ZXMgdHlwZXMKICAgIGlmICggJEF0dHJpYnV0ZXNDaGFuZ2VkVHlwZSAmJiAkQXR0cmlidXRlc0NoYW5nZWRUeXBlIG5lICRPYmplY3ROYW1lICkgewoKICAgICAgICAjIHRoaXMgZXhwcmVzc2lvbiBkb2VzIG5vdCBtYXRjaCByZXF1ZXN0ZWQgdHlwZQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhdHRyaWJ1dGUgdHlwZQogICAgbXkgJEF0dHJpYnV0ZVR5cGUgPSAkRXhwcmVzc2lvbkRhdGEtPntBdHRyaWJ1dGV9LT57TmFtZX07CgogICAgIyBjaGVjayBmb3IgY2hhbmdlZCBhdHRyaWJ1dGVzIGFuZCBhdmFpbGFibGUgYXR0cmlidXRlcyBvZiBleHByZXNzaW9uCiAgICBpZiAoICRBdHRyaWJ1dGVUeXBlICYmIEBBdHRyaWJ1dGVzQ2hhbmdlZCApIHsKCiAgICAgICAgIyBjaGVjayBmb3Igb3VyIGF0dHJpYnV0ZSBpbiBjaGFuZ2VkIGF0dHJpYnV0ZSBsaXN0CiAgICAgICAgbXkgQEF0dHJpYnV0ZUZvdW5kID0gZ3JlcCB7ICRfIGVxICRBdHRyaWJ1dGVUeXBlIH0gQEF0dHJpYnV0ZXNDaGFuZ2VkOwoKICAgICAgICAjIHRoaXMgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlCiAgICAgICAgcmV0dXJuIGlmICFAQXR0cmlidXRlRm91bmQ7CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRFeHByZXNzaW9uT2JqZWN0RGF0YSA9ICRTZWxmLT5PYmplY3REYXRhR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRFeHByZXNzaW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgIE9iamVjdE5hbWUgID0+ICRPYmplY3ROYW1lLAogICAgICAgIFNlbGVjdG9yICAgID0+ICRFeHByZXNzaW9uLT57U2VsZWN0b3J9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBleHByZXNzaW9uIG9iamVjdCBkYXRhCiAgICAjIG5vIG5lZWQgdG8gZXhlY3V0ZSBvcGVyYXRvciBpZiBpdCBpcyBhbiBlbXB0eSBhcnJheSByZWYKICAgIGlmICgKICAgICAgICAhJEV4cHJlc3Npb25PYmplY3REYXRhCiAgICAgICAgfHwgcmVmICRFeHByZXNzaW9uT2JqZWN0RGF0YSBuZSAnQVJSQVknCiAgICAgICAgfHwgcmVmICRFeHByZXNzaW9uT2JqZWN0RGF0YSBlcSAnQVJSQVknICYmICFAeyRFeHByZXNzaW9uT2JqZWN0RGF0YX0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBvYmplY3QgZGF0YSBmb3IgJE9iamVjdE5hbWUgKCRFeHByZXNzaW9uLT57U2VsZWN0b3J9KSBmb3VuZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgYXR0cmlidXRlIHR5cGUKICAgIGlmICggISRBdHRyaWJ1dGVUeXBlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gYXR0cmlidXRlICRPYmplY3ROYW1lICgkRXhwcmVzc2lvbi0+e1NlbGVjdG9yfSkgZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGZvciBvYmplY3QgYXR0cmlidXRlCiAgICBmb3IgbXkgJEV4cHJlc3Npb25PYmplY3QgKCBAeyRFeHByZXNzaW9uT2JqZWN0RGF0YX0gKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRFeHByZXNzaW9uT2JqZWN0LT57JEF0dHJpYnV0ZVR5cGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGF0dHJpYnV0ZSBmb3IgJE9iamVjdE5hbWUgKCRBdHRyaWJ1dGVUeXBlKSBmb3VuZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbnMgZXhlY3V0aW9uCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPk9wZXJhdG9yRXhlY3V0ZSgKICAgICAgICBPcGVyYXRvck5hbWUgPT4gJEV4cHJlc3Npb25EYXRhLT57T3BlcmF0b3J9LT57TmFtZX0sCiAgICAgICAgQXR0cmlidXRlICAgID0+ICRBdHRyaWJ1dGVUeXBlLAogICAgICAgIFNlbGVjdG9yICAgICA9PiAkRXhwcmVzc2lvbi0+e1NlbGVjdG9yfSwKICAgICAgICBPYmplY3REYXRhICAgPT4gJEV4cHJlc3Npb25PYmplY3REYXRhLAogICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkRXhwcmVzc2lvbi0+e0NvbXBhcmVWYWx1ZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb25zIGV4ZWN1dGlvbgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1pdGVtIF9FeHByZXNzaW9uTWF0Y2hJbml0KCkKClJldHVybnMgb2JqZWN0LCBhdHRyaWJ1dGUgYW5kIG9wZXJhdG9yIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbi4KCiAgICBteSAkRXhwcmVzc2lvbkRhdGEgPSAkQ29uZGl0aW9uT2JqZWN0LT5fRXhwcmVzc2lvbk1hdGNoSW5pdCgKICAgICAgICBFeHByZXNzaW9uID0+ICRFeHByZXNzaW9uUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0V4cHJlc3Npb25NYXRjaEluaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGV4dHJhY3QgZXhwcmVzc2lvbgogICAgbXkgJEV4cHJlc3Npb24gPSAkUGFyYW17RXhwcmVzc2lvbn07CgogICAgIyBkZWNsYXJlIGV4cHJlc3Npb24gZGF0YQogICAgbXkgJUV4cHJlc3Npb25EYXRhOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICAkRXhwcmVzc2lvbkRhdGF7T2JqZWN0fSA9ICRTZWxmLT5PYmplY3RHZXQoCiAgICAgICAgT2JqZWN0SUQgPT4gJEV4cHJlc3Npb24tPntPYmplY3RJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIG9iamVjdCBkYXRhCiAgICBpZiAoICEkRXhwcmVzc2lvbkRhdGF7T2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbHVlIGZvciAnT2JqZWN0JyB3aXRoIElEICckRXhwcmVzc2lvbi0+e09iamVjdElEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBhdHRyaWJ1dGUgZGF0YQogICAgJEV4cHJlc3Npb25EYXRhe0F0dHJpYnV0ZX0gPSAkU2VsZi0+QXR0cmlidXRlR2V0KAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRFeHByZXNzaW9uLT57QXR0cmlidXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBhdHRyaWJ1dGUgZGF0YQogICAgaWYgKCAhJEV4cHJlc3Npb25EYXRhe0F0dHJpYnV0ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWx1ZSBmb3IgJ0F0dHJpYnV0ZScgd2l0aCBJRCAnJEV4cHJlc3Npb24tPntBdHRyaWJ1dGVJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb3BlcmF0b3IgZGF0YQogICAgJEV4cHJlc3Npb25EYXRhe09wZXJhdG9yfSA9ICRTZWxmLT5PcGVyYXRvckdldCgKICAgICAgICBPcGVyYXRvcklEID0+ICRFeHByZXNzaW9uLT57T3BlcmF0b3JJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3Igb3BlcmF0b3IgZGF0YQogICAgaWYgKCAhJEV4cHJlc3Npb25EYXRhe09wZXJhdG9yfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbHVlIGZvciAnT3BlcmF0b3InIHdpdGggSUQgJyRFeHByZXNzaW9uLT57T3BlcmF0b3JJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIFwlRXhwcmVzc2lvbkRhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjI4ICQgJERhdGU6IDIwMTAvMDEvMzEgMTM6MjM6MDUgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09iamVjdC5wbSAtIGFsbCBjb25kaXRpb24gb2JqZWN0IGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogT2JqZWN0LnBtLHYgMS4yNSAyMDEwLzA2LzE1IDAxOjA0OjQ3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPYmplY3Q7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjI1ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T2JqZWN0IC0gY29uZGl0aW9uIG9iamVjdCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9uIG9iamVjdHMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWl0ZW0gT2JqZWN0QWRkKCkKCkFkZCBhIG5ldyBjb25kaXRpb24gb2JqZWN0LgoKICAgIG15ICRDb25kaXRpb25JRCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdEFkZCgKICAgICAgICBOYW1lICAgPT4gJ09iamVjdE5hbWUnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBsb29rdXAgd2l0aCBnaXZlbiBuYW1lIGZvciBjaGVja3MKICAgIG15ICRPYmplY3RJRCA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgTmFtZSA9PiAkUGFyYW17TmFtZX0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgb2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkT2JqZWN0SUQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbiBvYmplY3QgKCRQYXJhbXtOYW1lfSkgYWxyZWFkeSBleGlzdHMhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGFkZCBuZXcgb2JqZWN0IG5hbWUgdG8gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZGl0aW9uX29iamVjdCAnCiAgICAgICAgICAgIC4gJyhuYW1lKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICApOwoKICAgICMgZ2V0IGlkIG9mIGNyZWF0ZWQgb2JqZWN0CiAgICAkT2JqZWN0SUQgPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgIE5hbWUgPT4gJFBhcmFte05hbWV9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIG9iamVjdCBjb3VsZCBiZSBhZGRlZAogICAgaWYgKCAhJE9iamVjdElEICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT2JqZWN0QWRkKCkgZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRPYmplY3RJRDsKfQoKPWl0ZW0gT2JqZWN0VXBkYXRlKCkKClVwZGF0ZSBhIGNvbmRpdGlvbiBvYmplY3QuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3RVcGRhdGUoCiAgICAgICAgT2JqZWN0SUQgPT4gMTIzNCwKICAgICAgICBOYW1lICAgICA9PiAnTmV3T2JqZWN0TmFtZScsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdElEIE5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkU2VsZi0+T2JqZWN0R2V0KAogICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT2JqZWN0VXBkYXRlIG9mICRQYXJhbXtPYmplY3RJRH0gZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB1cGRhdGUgb2JqZWN0IGluIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBjb25kaXRpb25fb2JqZWN0ICcKICAgICAgICAgICAgLiAnU0VUIG5hbWUgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdEdldCgpCgpHZXQgYSBjb25kaXRpb24gb2JqZWN0IGZvciBhIGdpdmVuIG9iamVjdCBpZC4KUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIG9mIHRoZSBvYmplY3QgZGF0YS4KCiAgICBteSAkQ29uZGl0aW9uT2JqZWN0UmVmID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0R2V0KAogICAgICAgIE9iamVjdElEID0+IDEyMzQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgZm9sbG93aW5nIGVsZW1lbnRzOgoKICAgICRDb25kaXRpb25PYmplY3R7T2JqZWN0SUR9CiAgICAkQ29uZGl0aW9uT2JqZWN0e05hbWV9Cgo9Y3V0CgpzdWIgT2JqZWN0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCwgbmFtZSBGUk9NIGNvbmRpdGlvbl9vYmplY3QgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlT2JqZWN0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE9iamVjdERhdGF7T2JqZWN0SUR9ID0gJFJvd1swXTsKICAgICAgICAkT2JqZWN0RGF0YXtOYW1lfSAgICAgPSAkUm93WzFdOwogICAgfQoKICAgICMgY2hlY2sgZXJyb3IKICAgIGlmICggISVPYmplY3REYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT2JqZWN0SUQgJFBhcmFte09iamVjdElEfSBkb2VzIG5vdCBleGlzdCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBcJU9iamVjdERhdGE7Cn0KCj1pdGVtIE9iamVjdExvb2t1cCgpCgpUaGlzIG1ldGhvZCBkb2VzIGEgbG9va3VwIGZvciBhIGNvbmRpdGlvbiBvYmplY3QuIElmIGFuIG9iamVjdAppZCBpcyBnaXZlbiwgaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0LiBJZiB0aGUgbmFtZSBvZiB0aGUKb2JqZWN0IGlzIGdpdmVuLCB0aGUgYXBwcm9wcmlhdGUgaWQgaXMgcmV0dXJuZWQuCgogICAgbXkgJE9iamVjdE5hbWUgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3RMb29rdXAoCiAgICAgICAgT2JqZWN0SUQgPT4gNDMyMSwKICAgICk7CgogICAgbXkgJE9iamVjdElEID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0TG9va3VwKAogICAgICAgIE5hbWUgICA9PiAnT2JqZWN0TmFtZScsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdExvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgYm90aCBwYXJhbWV0ZXJzIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17T2JqZWN0SUR9ICYmICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0SUQgb3IgTmFtZSAtIG5vdCBib3RoIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBib3RoIHBhcmFtZXRlcnMgYXJlIG5vdCBnaXZlbgogICAgaWYgKCAhJFBhcmFte09iamVjdElEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPYmplY3RJRCBvciBOYW1lIC0gbm9uZSBpcyBnaXZlbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgT2JqZWN0SUQgaXMgYSBudW1iZXIKICAgIGlmICggJFBhcmFte09iamVjdElEfSAmJiAkUGFyYW17T2JqZWN0SUR9ICF+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT2JqZWN0SUQgbXVzdCBiZSBhIG51bWJlciEgKE9iamVjdElEOiAkUGFyYW17T2JqZWN0SUR9KSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnRzCiAgICBpZiAoICRQYXJhbXtPYmplY3RJRH0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBuYW1lIEZST00gY29uZGl0aW9uX29iamVjdCBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0SUR9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte05hbWV9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBjb25kaXRpb25fb2JqZWN0IFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRMb29rdXA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMb29rdXAgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkTG9va3VwOwp9Cgo9aXRlbSBPYmplY3RMaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGFsbCBjb25kaXRpb24gb2JqZWN0cyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRDb25kaXRpb25PYmplY3RzUmVmID0gJENvbmRpdGlvbk9iamVjdC0+T2JqZWN0TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgZW50cmllcyBsaWtlIHRoaXM6CgogICAgJENvbmRpdGlvbk9iamVjdHtPYmplY3RJRH0gPSAnT2JqZWN0TmFtZScKCj1jdXQKCnN1YiBPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgbmFtZSBGUk9NIGNvbmRpdGlvbl9vYmplY3QnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPYmplY3RMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0TGlzdHsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVPYmplY3RMaXN0Owp9Cgo9aXRlbSBPYmplY3REZWxldGUoKQoKRGVsZXRlcyBhIGNvbmRpdGlvbiBvYmplY3QuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZGl0aW9uT2JqZWN0LT5PYmplY3REZWxldGUoCiAgICAgICAgT2JqZWN0SUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3RJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBvYmplY3QgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBjb25kaXRpb25fb2JqZWN0ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtPYmplY3RJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdFNlbGVjdG9yTGlzdCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VsZWN0b3JzIGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZCBhbmQgY29uZGl0aW9uIGlkIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJFNlbGVjdG9yTGlzdCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdFNlbGVjdG9yTGlzdCgKICAgICAgICBPYmplY3RJRCAgICA9PiAxMjM0LAogICAgICAgIENvbmRpdGlvbklEID0+IDUsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2UgbGlrZSB0aGlzIChmb3Igd29ya29yZGVyIG9iamVjdHMpCgogICAgJFNlbGVjdG9yTGlzdCA9IHsKICAgICAgICAxMCAgICA9PiAnMSAtIFdvcmtvcmRlclRpdGxlIG9mIFdvcmtvcmRlciAxJywKICAgICAgICAxMiAgICA9PiAnMiAtIFdvcmtvcmRlclRpdGxlIG9mIFdvcmtvcmRlciAyJywKICAgICAgICAzNCAgICA9PiAnMyAtIFdvcmtvcmRlclRpdGxlIG9mIFdvcmtvcmRlciAzJywKICAgICAgICAnYW55JyA9PiAnYW55JywKICAgICAgICAnYWxsJyA9PiAnYWxsJywKICAgIH0KCm9yIGZvciBjaGFuZ2Ugb2JqZWN0czoKCiAgICAkU2VsZWN0b3JMaXN0ID0gewogICAgICAgIDQ1NiA9PiAnQ2hhbmdlIyAyMDEwMDExNjEwMDAwNjE4JywKICAgIH0KCj1jdXQKCnN1YiBPYmplY3RTZWxlY3Rvckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0SUQgQ29uZGl0aW9uSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb2t1cCBvYmplY3QgbmFtZQogICAgbXkgJE9iamVjdE5hbWUgPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmRpdGlvbiBkYXRhCiAgICBteSAkQ29uZGl0aW9uRGF0YSA9ICRTZWxmLT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgZXJyb3IKICAgIHJldHVybiBpZiAhJENvbmRpdGlvbkRhdGE7CgogICAgIyBnZXQgb2JqZWN0IGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9PYmplY3RMb2FkQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRPYmplY3ROYW1lLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBlcnJvcgogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGRlZmluZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYmFja2VuZAogICAgbXkgJFN1YiA9ICdTZWxlY3Rvckxpc3QnOwoKICAgICMgY2hlY2sgZm9yIGF2YWlsYWJsZSBmdW5jdGlvbgogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QtPmNhbigkU3ViKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGZ1bmN0aW9uICckU3ViJyBhdmFpbGFibGUgZm9yIGJhY2tlbmQgJyRPYmplY3ROYW1lJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXhlY3V0ZSB0aGUgYWN0aW9uIHN1YnJvdXRpbmUKICAgIG15ICRTZWxlY3Rvckxpc3QgPSAkQmFja2VuZE9iamVjdC0+JFN1YigKICAgICAgICBDb25kaXRpb25JRCAgPT4gJFBhcmFte0NvbmRpdGlvbklEfSwKICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJENvbmRpdGlvbkRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIEV4cHJlc3Npb25JRCA9PiAkUGFyYW17RXhwcmVzc2lvbklEfSwKICAgICAgICBBY3Rpb25JRCAgICAgPT4gJFBhcmFte0FjdGlvbklEfSwKICAgICkgfHwge307CgogICAgcmV0dXJuICRTZWxlY3Rvckxpc3Q7Cn0KCj1pdGVtIE9iamVjdENvbXBhcmVWYWx1ZUxpc3QoKQoKUmV0dXJucyBhIGxpc3Qgb2YgYXZhaWxhYmxlIENvbXBhcmVWYWx1ZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QgaWQgYW5kIGF0dHJpYnV0ZSBpZCBhcyBoYXNoIHJlZmVyZW5jZS4KCiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdENvbXBhcmVWYWx1ZUxpc3QoCiAgICAgICAgT2JqZWN0SUQgICAgICA9PiAxMjM0LAogICAgICAgIEF0dHJpYnV0ZU5hbWUgPT4gJ1dvcmtPcmRlclN0YXRlSUQnLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2UgbGlrZSB0aGlzLCBmb3IgYSB3b3Jrb3JkZXIgb2JqZWN0IGFuZCB0aGUgYXR0cmlidXRlICdXb3JrT3JkZXJTdGF0ZUlEJzoKCiAgICAkQ29tcGFyZVZhbHVlTGlzdCA9IHsKICAgICAgICAxMCAgICA9PiAnY3JlYXRlZCcsCiAgICAgICAgMTIgICAgPT4gJ2FjY2VwdGVkJywKICAgICAgICAxMyAgICA9PiAncmVhZHknLAogICAgICAgIDE0ICAgID0+ICdpbiBwcm9ncmVzcycsCiAgICAgICAgMTUgICAgPT4gJ2Nsb3NlZCcsCiAgICAgICAgMTYgICAgPT4gJ2NhbmNlbGVkJywKICAgIH0KCj1jdXQKCnN1YiBPYmplY3RDb21wYXJlVmFsdWVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdElEIEF0dHJpYnV0ZU5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBvYmplY3QgbmFtZQogICAgbXkgJE9iamVjdE5hbWUgPSAkUGFyYW17T2JqZWN0TmFtZX07CiAgICBpZiAoICRQYXJhbXtPYmplY3RJRH0gKSB7CiAgICAgICAgJE9iamVjdE5hbWUgPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IHR5cGUKICAgIG15ICRPYmplY3RUeXBlID0gJE9iamVjdE5hbWU7CgogICAgIyBnZXQgb2JqZWN0IGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9PYmplY3RMb2FkQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRPYmplY3RUeXBlLAogICAgKTsKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBkZWZpbmUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGJhY2tlbmQKICAgIG15ICRTdWIgPSAnQ29tcGFyZVZhbHVlTGlzdCc7CgogICAgIyBjaGVjayBmb3IgYXZhaWxhYmxlIGZ1bmN0aW9uCiAgICBpZiAoICEkQmFja2VuZE9iamVjdC0+Y2FuKCRTdWIpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZnVuY3Rpb24gJyRTdWInIGF2YWlsYWJsZSBmb3IgYmFja2VuZCAnJE9iamVjdFR5cGUnISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBleGVjdXRlIHRoZSBhY3Rpb24gc3Vicm91dGluZQogICAgbXkgJENvbXBhcmVWYWx1ZUxpc3QgPSAkQmFja2VuZE9iamVjdC0+JFN1YigKICAgICAgICBBdHRyaWJ1dGVOYW1lID0+ICRQYXJhbXtBdHRyaWJ1dGVOYW1lfSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKSB8fCB7fTsKCiAgICByZXR1cm4gJENvbXBhcmVWYWx1ZUxpc3Q7Cn0KCj1pdGVtIE9iamVjdERhdGFHZXQoKQoKUmV0dXJuIHRoZSBkYXRhIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgc2VsZWN0b3Igb2YgYSBjZXJ0YWluIG9iamVjdC4KCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRDb25kaXRpb25PYmplY3QtPk9iamVjdERhdGFHZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzNCwKICAgICAgICBPYmplY3ROYW1lICA9PiAnSVRTTUNoYW5nZScsICAgICMgb3IgT2JqZWN0SUQKICAgICAgICBPYmplY3RJRCAgICA9PiAxLCAgICAgICAgICAgICAgICMgb3IgT2JqZWN0TmFtZQogICAgICAgIFNlbGVjdG9yICAgID0+ICcxMjMnLCAgICAgICAgICAgIyAgKCBPYmplY3RLZXkgfCBhbnkgfCBhbGwgKQogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZGl0aW9uSUQgU2VsZWN0b3IgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGVpdGhlciBPYmplY3ROYW1lIG9yIE9iamVjdElEIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17T2JqZWN0TmFtZX0gJiYgISRQYXJhbXtPYmplY3RJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdPYmplY3ROYW1lIElEIG9yIE9iamVjdElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIE9iamVjdE5hbWUgYW5kIE9iamVjdElEIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17T2JqZWN0TmFtZX0gJiYgJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIE9iamVjdE5hbWUgT1IgT2JqZWN0SUQgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IG9iamVjdCBuYW1lCiAgICBteSAkT2JqZWN0TmFtZSA9ICRQYXJhbXtPYmplY3ROYW1lfTsKICAgIGlmICggJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkT2JqZWN0TmFtZSA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgICAgIE9iamVjdElEID0+ICRQYXJhbXtPYmplY3RJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvYmplY3QgdHlwZQogICAgbXkgJE9iamVjdFR5cGUgPSAkT2JqZWN0TmFtZTsKCiAgICAjIGdldCBvYmplY3QgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X09iamVjdExvYWRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJE9iamVjdFR5cGUsCiAgICApOwogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGRlZmluZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYmFja2VuZAogICAgbXkgJFN1YiA9ICdEYXRhR2V0JzsKCiAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgIGlmICggISRCYWNrZW5kT2JqZWN0LT5jYW4oJFN1YikgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciBiYWNrZW5kICckT2JqZWN0VHlwZSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkQmFja2VuZE9iamVjdC0+JFN1YigKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFNlbGVjdG9yICAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgIHJldHVybiAkT2JqZWN0RGF0YTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX09iamVjdExvYWRCYWNrZW5kKCkKClJldHVybnMgYSBuZXdseSBsb2FkZWQgYmFja2VuZCBvYmplY3QKCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09iamVjdExvYWRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ0lUU01DaGFuZ2UnLCAgIyAoIElUU01DaGFuZ2UgfCBJVFNNV29ya09yZGVyICkKICAgICk7Cgo9Y3V0CgpzdWIgX09iamVjdExvYWRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYmFja2VuZCBtb2R1bGUgbmFtZQogICAgbXkgJE1vZHVsZU5hbWUgPSAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6JyAuICRQYXJhbXtUeXBlfTsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGVOYW1lKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJE1vZHVsZU5hbWUtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjI1ICQgJERhdGU6IDIwMTAvMDYvMTUgMDE6MDQ6NDcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09wZXJhdG9yLnBtIC0gYWxsIGNvbmRpdGlvbiBvcGVyYXRvciBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9wZXJhdG9yLnBtLHYgMS4yNCAyMDEwLzA2LzE1IDAxOjA0OjQ3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPcGVyYXRvcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPcGVyYXRvciAtIGNvbmRpdGlvbiBvcGVyYXRvciBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9uIG9wZXJhdG9ycyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9aXRlbSBPcGVyYXRvckFkZCgpCgpBZGQgYSBuZXcgY29uZGl0aW9uIG9wZXJhdG9yLgoKICAgIG15ICRPcGVyYXRvcklEID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JBZGQoCiAgICAgICAgTmFtZSAgID0+ICdPcGVyYXRvck5hbWUnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPcGVyYXRvckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBtYWtlIGxvb2t1cCB3aXRoIGdpdmVuIG5hbWUgZm9yIGNoZWNrcwogICAgbXkgJE9wZXJhdG9ySUQgPSAkU2VsZi0+T3BlcmF0b3JMb29rdXAoIE5hbWUgPT4gJFBhcmFte05hbWV9ICk7CgogICAgIyBjaGVjayBpZiBvcGVyYXRvciBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE9wZXJhdG9ySUQpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmRpdGlvbiBvcGVyYXRvciAoJFBhcmFte05hbWV9KSBhbHJlYWR5IGV4aXN0cyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYWRkIG5ldyBvcGVyYXRvciBuYW1lIHRvIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGNvbmRpdGlvbl9vcGVyYXRvciAnCiAgICAgICAgICAgIC4gJyhuYW1lKSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICApOwoKICAgICMgZ2V0IGlkIG9mIGNyZWF0ZWQgb3BlcmF0b3IKICAgICRPcGVyYXRvcklEID0gJFNlbGYtPk9wZXJhdG9yTG9va3VwKCBOYW1lID0+ICRQYXJhbXtOYW1lfSApOwoKICAgICMgY2hlY2sgaWYgb3BlcmF0b3IgY291bGQgYmUgYWRkZWQKICAgIGlmICggISRPcGVyYXRvcklEICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3BlcmF0b3JBZGQoKSBmYWlsZWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJE9wZXJhdG9ySUQ7Cn0KCj1pdGVtIE9wZXJhdG9yVXBkYXRlKCkKClVwZGF0ZSBhIGNvbmRpdGlvbiBvcGVyYXRvci4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yVXBkYXRlKAogICAgICAgIE9wZXJhdG9ySUQgPT4gMTIzNCwKICAgICAgICBOYW1lICAgICAgID0+ICdOZXdPcGVyYXRvck5hbWUnLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT3BlcmF0b3JVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT3BlcmF0b3JJRCBOYW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3BlcmF0b3IgZGF0YQogICAgbXkgJE9wZXJhdG9yRGF0YSA9ICRTZWxmLT5PcGVyYXRvckdldCgKICAgICAgICBPcGVyYXRvcklEID0+ICRQYXJhbXtPcGVyYXRvcklEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9wZXJhdG9yIGRhdGEKICAgIGlmICggISRPcGVyYXRvckRhdGEgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcGVyYXRvclVwZGF0ZSBvZiAkUGFyYW17T3BlcmF0b3JJRH0gZmFpbGVkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB1cGRhdGUgb3BlcmF0b3IgaW4gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGNvbmRpdGlvbl9vcGVyYXRvciAnCiAgICAgICAgICAgIC4gJ1NFVCBuYW1lID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17T3BlcmF0b3JJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9wZXJhdG9yR2V0KCkKCkdldCBhIGNvbmRpdGlvbiBvcGVyYXRvciBmb3IgYSBnaXZlbiBvcGVyYXRvciBpZC4KUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIG9mIHRoZSBvcGVyYXRvciBkYXRhLgoKICAgIG15ICRDb25kaXRpb25PcGVyYXRvclJlZiA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yR2V0KAogICAgICAgIE9wZXJhdG9ySUQgPT4gMTIzNCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKVGhlIHJldHVybmVkIGhhc2ggcmVmZXJlbmNlIGNvbnRhaW5zIGZvbGxvd2luZyBlbGVtZW50czoKCiAgICAkQ29uZGl0aW9uT3BlcmF0b3J7T3BlcmF0b3JJRH0KICAgICRDb25kaXRpb25PcGVyYXRvcntOYW1lfQoKPWN1dAoKc3ViIE9wZXJhdG9yR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9wZXJhdG9ySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudAogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkLCBuYW1lIEZST00gY29uZGl0aW9uX29wZXJhdG9yIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte09wZXJhdG9ySUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlT3BlcmF0b3JEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT3BlcmF0b3JEYXRhe09wZXJhdG9ySUR9ID0gJFJvd1swXTsKICAgICAgICAkT3BlcmF0b3JEYXRhe05hbWV9ICAgICAgID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGNoZWNrIGVycm9yCiAgICBpZiAoICElT3BlcmF0b3JEYXRhICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3BlcmF0b3JJRCAkUGFyYW17T3BlcmF0b3JJRH0gZG9lcyBub3QgZXhpc3QhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gXCVPcGVyYXRvckRhdGE7Cn0KCj1pdGVtIE9wZXJhdG9yTG9va3VwKCkKClRoaXMgbWV0aG9kIGRvZXMgYSBsb29rdXAgZm9yIGEgY29uZGl0aW9uIG9wZXJhdG9yLiBJZiBhbiBvcGVyYXRvcgppZCBpcyBnaXZlbiwgaXQgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0b3IuIElmIHRoZSBuYW1lIG9mIHRoZQpvcGVyYXRvciBpcyBnaXZlbiwgdGhlIGFwcHJvcHJpYXRlIGlkIGlzIHJldHVybmVkLgoKICAgIG15ICRPcGVyYXRvck5hbWUgPSAkQ29uZGl0aW9uT2JqZWN0LT5PcGVyYXRvckxvb2t1cCgKICAgICAgICBPcGVyYXRvcklEID0+IDQzMjEsCiAgICApOwoKICAgIG15ICRPcGVyYXRvcklEID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JMb29rdXAoCiAgICAgICAgTmFtZSAgID0+ICdPcGVyYXRvck5hbWUnLAogICAgKTsKCj1jdXQKCnN1YiBPcGVyYXRvckxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgYm90aCBwYXJhbWV0ZXJzIGFyZSBnaXZlbgogICAgaWYgKCAkUGFyYW17T3BlcmF0b3JJRH0gJiYgJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPcGVyYXRvcklEIG9yIE5hbWUgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYm90aCBwYXJhbWV0ZXJzIGFyZSBub3QgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtPcGVyYXRvcklEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBPcGVyYXRvcklEIG9yIE5hbWUgLSBub25lIGlzIGdpdmVuIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBPcGVyYXRvcklEIGlzIGEgbnVtYmVyCiAgICBpZiAoICRQYXJhbXtPcGVyYXRvcklEfSAmJiAkUGFyYW17T3BlcmF0b3JJRH0gIX4gbXsgXEEgXGQrIFx6IH14bXMgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcGVyYXRvcklEIG11c3QgYmUgYSBudW1iZXIhIChPcGVyYXRvcklEOiAkUGFyYW17T3BlcmF0b3JJRH0pIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgU1FMIHN0YXRlbWVudHMKICAgIGlmICggJFBhcmFte09wZXJhdG9ySUR9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIGNvbmRpdGlvbl9vcGVyYXRvciBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T3BlcmF0b3JJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGNvbmRpdGlvbl9vcGVyYXRvciBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTG9va3VwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTG9va3VwID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJExvb2t1cDsKfQoKPWl0ZW0gT3BlcmF0b3JMaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGFsbCBjb25kaXRpb24gb3BlcmF0b3JzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJENvbmRpdGlvbk9wZXJhdG9yc1JlZiA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgpUaGUgcmV0dXJuZWQgaGFzaCByZWZlcmVuY2UgY29udGFpbnMgZW50cmllcyBsaWtlIHRoaXM6CgogICAgJENvbmRpdGlvbk9wZXJhdG9ye09iamVjdElEfSA9ICdPYmplY3ROYW1lJwoKPWN1dAoKc3ViIE9wZXJhdG9yTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIG5hbWUgRlJPTSBjb25kaXRpb25fb3BlcmF0b3InLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVPcGVyYXRvckxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRPcGVyYXRvckxpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlT3BlcmF0b3JMaXN0Owp9Cgo9aXRlbSBPcGVyYXRvckRlbGV0ZSgpCgpEZWxldGVzIGEgY29uZGl0aW9uIG9wZXJhdG9yLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmRpdGlvbk9iamVjdC0+T3BlcmF0b3JEZWxldGUoCiAgICAgICAgT3BlcmF0b3JJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT3BlcmF0b3JEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT3BlcmF0b3JJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGNvbmRpdGlvbiBvcGVyYXRvciBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGNvbmRpdGlvbl9vcGVyYXRvciAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17T3BlcmF0b3JJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9wZXJhdG9yRXhlY3V0ZSgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIGdpdmVuIHZhbHVlcyBhcmUgZXF1YWwuCgogICAgbXkgJFJlc3VsdCA9ICRDb25kaXRpb25PYmplY3QtPk9wZXJhdG9yRXhlY3V0ZSgKICAgICAgICBPcGVyYXRvck5hbWUgPT4gJ2lzJywKICAgICAgICBBdHRyaWJ1dGUgICAgPT4gJ1dvcmtPcmRlclN0YXRlSUQnLAogICAgICAgIFNlbGVjdG9yICAgICA9PiAnMTIzNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAoIE9iamVjdEtleSB8IGFueSB8IGFsbCApCiAgICAgICAgT2JqZWN0RGF0YSAgID0+IFsgJFdvcmtPcmRlckRhdGExLCAkV29ya09yZGVyRGF0YTIgXSwKICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ1NvbWVWYWx1ZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciBBY3Rpb25WYWx1ZQogICAgICAgIE9iamVjdE5hbWUgICA9PiAnSVRTTVdvcmtPcmRlcicsICAgICAgICAgICAgICAgICAgICAgICAjIG5lZWRlZCBmb3IgQWN0aW9uVmFsdWUKICAgICAgICBBY3Rpb25JRCAgICAgPT4gMTIzNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZWVkZWQgZm9yIEFjdGlvblZhbHVlCiAgICAgICAgQWN0aW9uVmFsdWUgID0+ICdTb21lVmFsdWUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IgQ29tcGFyZVZhbHVlCiAgICAgICAgVXNlcklEICAgICAgID0+IDEyMzQsCiAgICApOwoKPWN1dAoKc3ViIE9wZXJhdG9yRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPcGVyYXRvck5hbWUgQXR0cmlidXRlIFNlbGVjdG9yIE9iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSAnQ29tcGFyZVZhbHVlJyBhbmQgJ0FjdGlvblZhbHVlJyBpbiBhIHNwZWNpYWwgd2F5CiAgICBpZiAoCiAgICAgICAgKCAhZXhpc3RzICRQYXJhbXtDb21wYXJlVmFsdWV9IHx8ICFkZWZpbmVkICRQYXJhbXtDb21wYXJlVmFsdWV9ICkKICAgICAgICAmJiAoICFleGlzdHMgJFBhcmFte0FjdGlvblZhbHVlfSB8fCAhZGVmaW5lZCAkUGFyYW17QWN0aW9uVmFsdWV9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIGVpdGhlciBDb21wYXJlVmFsdWUgb3IgQWN0aW9uVmFsdWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMgZm9yIGFjdGlvbnMKICAgIHJldHVybiBpZiBleGlzdHMgJFBhcmFte0FjdGlvblZhbHVlfSAmJiAhJFBhcmFte09iamVjdE5hbWV9OwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRQYXJhbXtPYmplY3REYXRhfTsKCiAgICAjIGNoZWNrIE9iamVjdERhdGEKICAgIGlmICggcmVmICRPYmplY3REYXRhIG5lICdBUlJBWScgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdPYmplY3REYXRhIGlzIG5vdCBhbiBhcnJheSByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZvciBhY3Rpb25zICdhbnknIGlzIG5vdCBhbGxvd2VkCiAgICByZXR1cm4gaWYgZXhpc3RzICRQYXJhbXtBY3Rpb25WYWx1ZX0gJiYgJFBhcmFte1NlbGVjdG9yfSBlcSAnYW55JzsKCiAgICAjIGV4ZWN1dGUgb3BlcmF0b3IgZm9yIGFjdGlvbnMgaGVyZQogICAgIyBubyBuZWVkIHRvIGl0ZXJhdGUgb3ZlciBvYmplY3QgaW4gdGhpcyBjYXNlCiAgICBpZiAoIGV4aXN0cyAkUGFyYW17QWN0aW9uVmFsdWV9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X09wZXJhdG9yQWN0aW9uRXhlY3V0ZSgKICAgICAgICAgICAgT3BlcmF0b3IgICAgPT4gJFBhcmFte09wZXJhdG9yTmFtZX0sCiAgICAgICAgICAgIE9iamVjdE5hbWUgID0+ICRQYXJhbXtPYmplY3ROYW1lfSwKICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgICAgIEFjdGlvbklEICAgID0+ICRQYXJhbXtBY3Rpb25JRH0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyByZXR1cm4gZmFsc2UgaWYgbm8gb2JqZWN0IGRhdGEgaXMgZ2l2ZW4KICAgIHJldHVybiBpZiAhQHskT2JqZWN0RGF0YX07CgogICAgIyBleGVjdXRlIG9wZXJhdG9yIGZvciBlYWNoIG9iamVjdAogICAgbXkgQE9wZXJhdG9yRXhlY3V0ZVJlc3VsdDsKICAgIGZvciBteSAkT2JqZWN0ICggQHskT2JqZWN0RGF0YX0gKSB7CgogICAgICAgICMgZ2V0IGVxdWF0aW9uIHJlc3VsdCBmb3Igb2JqZWN0CiAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5fT3BlcmF0b3JFeGVjdXRlKAogICAgICAgICAgICBPcGVyYXRvck5hbWUgPT4gJFBhcmFte09wZXJhdG9yTmFtZX0sCiAgICAgICAgICAgIFZhbHVlMSAgICAgICA9PiAkT2JqZWN0LT57ICRQYXJhbXtBdHRyaWJ1dGV9IH0sCiAgICAgICAgICAgIFZhbHVlMiAgICAgICA9PiAkUGFyYW17Q29tcGFyZVZhbHVlfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICkgfHwgMDsKCiAgICAgICAgIyByZXR1cm4gdHJ1ZSBpZiByZXN1bHQgaXMgcG9zaXRpdmUgYW5kICdhbnknIGlzIHJlcXVlc3RlZAogICAgICAgIGlmICggJFBhcmFte1NlbGVjdG9yfSBlcSAnYW55JyAmJiAkUmVzdWx0ICkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgICMgcmV0dXJuIGZhbHNlIGlmIHJlc3VsdCBpcyBuZWdhdGl2ZSBhbmQgJ2FsbCcgaXMgcmVxdWVzdGVkCiAgICAgICAgaWYgKCAkUGFyYW17U2VsZWN0b3J9IGVxICdhbGwnICYmICEkUmVzdWx0ICkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgY3VycmVudCByZXN1bHQgZm9yIGNvbWluZyBjaGVja3MKICAgICAgICBwdXNoIEBPcGVyYXRvckV4ZWN1dGVSZXN1bHQsICRSZXN1bHQ7CiAgICB9CgogICAgIyBjb3VudCBhbGwgcmVzdWx0cyB3aGljaCBoYXZlIGEgdHJ1ZSB2YWx1ZQogICAgbXkgJFRydWVDb3VudCA9IHNjYWxhciBncmVwIHsgJF8gPT0gMSB9IEBPcGVyYXRvckV4ZWN1dGVSZXN1bHQ7CgogICAgIyByZXR1cm4gZmFsc2UgaWYgbm90IGFsbCByZXN1bHRzIGFyZSB0cnVlCiAgICByZXR1cm4gaWYgJFRydWVDb3VudCAhPSBzY2FsYXIgQHskT2JqZWN0RGF0YX07CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9PcGVyYXRvckV4ZWN1dGUoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JFeGVjdXRlKAogICAgICAgIE9wZXJhdG9yTmFtZSA9PiAnaXMnLAogICAgICAgIFZhbHVlMSAgICAgICA9PiAnU29tZVZhbHVlJywKICAgICAgICBWYWx1ZTIgICAgICAgPT4gJ1NvbWVPdGhlclZhbHVlJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9yRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPcGVyYXRvck5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG1hcCBmb3Igb3BlcmF0b3IgYWN0aW9uCiAgICBteSAlT3BlcmF0b3JBY3Rpb24gPSAoCgogICAgICAgICMgY29tbW9uIG1hdGNoaW5nCiAgICAgICAgJ2lzJyAgICAgICAgICAgPT4gJ19PcGVyYXRvckVxdWFsJywKICAgICAgICAnaXMgbm90JyAgICAgICA9PiAnX09wZXJhdG9yTm90RXF1YWwnLAogICAgICAgICdpcyBlbXB0eScgICAgID0+ICdfT3BlcmF0b3JJc0VtcHR5JywKICAgICAgICAnaXMgbm90IGVtcHR5JyA9PiAnX09wZXJhdG9ySXNOb3RFbXB0eScsCgogICAgICAgICMgZGlnaXQgbWF0Y2hpbmcKICAgICAgICAnaXMgZ3JlYXRlciB0aGFuJyA9PiAnX09wZXJhdG9ySXNHcmVhdGVyVGhhbicsCiAgICAgICAgJ2lzIGxlc3MgdGhhbicgICAgPT4gJ19PcGVyYXRvcklzTGVzc1RoYW4nLAoKICAgICAgICAjIGRhdGUgbWF0Y2hpbmcKICAgICAgICAnaXMgYmVmb3JlJyA9PiAnX09wZXJhdG9ySXNCZWZvcmUnLAogICAgICAgICdpcyBhZnRlcicgID0+ICdfT3BlcmF0b3JJc0FmdGVyJywKCiAgICAgICAgIyBzdHJpbmcgbWF0Y2hpbmcKICAgICAgICAnY29udGFpbnMnICAgICA9PiAnX09wZXJhdG9yQ29udGFpbnMnLAogICAgICAgICdub3QgY29udGFpbnMnID0+ICdfT3BlcmF0b3JOb3RDb250YWlucycsCiAgICAgICAgJ2JlZ2lucyB3aXRoJyAgPT4gJ19PcGVyYXRvckJlZ2luc1dpdGgnLAogICAgICAgICdlbmRzIHdpdGgnICAgID0+ICdfT3BlcmF0b3JFbmRzV2l0aCcsCiAgICApOwoKICAgICMgZ2V0IG9wZXJhdG9yIG5hbWUKICAgIG15ICRPcGVyYXRvck5hbWUgPSAkUGFyYW17T3BlcmF0b3JOYW1lfTsKCiAgICAjIGNoZWNrIGZvciBtYXRjaGluZyBvcGVyYXRvcgogICAgaWYgKCAhZXhpc3RzICRPcGVyYXRvckFjdGlvbnskT3BlcmF0b3JOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIG1hdGNoaW5nIG9wZXJhdG9yIGZvciAnJE9wZXJhdG9yTmFtZScgZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4dHJhY3Qgb3BlcmF0b3Igc3ViCiAgICBteSAkU3ViID0gJE9wZXJhdG9yQWN0aW9ueyRPcGVyYXRvck5hbWV9OwoKICAgICMgY2hlY2sgZm9yIGF2YWlsYWJsZSBmdW5jdGlvbgogICAgaWYgKCAhJFNlbGYtPmNhbigkU3ViKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGZ1bmN0aW9uICckU3ViJyBhdmFpbGFibGUgZm9yICckT3BlcmF0b3JOYW1lJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZXhlY3V0ZSBleHRyYWN0ZWQgbWF0Y2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+JFN1YigKICAgICAgICBWYWx1ZTEgPT4gJFBhcmFte1ZhbHVlMX0sCiAgICAgICAgVmFsdWUyID0+ICRQYXJhbXtWYWx1ZTJ9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWl0ZW0gX09wZXJhdG9yQWN0aW9uRXhlY3V0ZSgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIGdpdmVuIGFjdGlvbiBjb3VsZCBiZQpleGVjdXRlZCBzdWNjZXNzZnVsbHkuCgogICAgbXkgJFJlc3VsdCA9ICRDb25kaXRpb25PYmplY3QtPl9PcGVyYXRvckFjdGlvbkV4ZWN1dGUoCiAgICAgICAgT3BlcmF0b3IgICAgPT4gJ3NldCcsCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFNlbGVjdG9yICAgID0+ICcxMjM0JwogICAgICAgIEF0dHJpYnV0ZSAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICBBY3Rpb25JRCAgICA9PiAyMzQ1LAogICAgICAgIEFjdGlvblZhbHVlID0+ICcxMycsCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9yQWN0aW9uRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPcGVyYXRvciBPYmplY3ROYW1lIFNlbGVjdG9yIEF0dHJpYnV0ZSBBY3Rpb25JRCBBY3Rpb25WYWx1ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZiBpbiBhIHNwZWNpYWwgd2F5CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhBY3Rpb25WYWx1ZSkpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFwIGZvciBvcGVyYXRvciBhY3Rpb24KICAgIG15ICVPcGVyYXRvckFjdGlvbiA9ICgKICAgICAgICAnc2V0JyA9PiAnX09wZXJhdG9yU2V0JywKICAgICk7CgogICAgIyBnZXQgb3BlcmF0b3IgbmFtZQogICAgbXkgJE9wZXJhdG9yTmFtZSA9ICRQYXJhbXtPcGVyYXRvcn07CgogICAgIyBjaGVjayBmb3IgbWF0Y2hpbmcgb3BlcmF0b3IKICAgIGlmICggIWV4aXN0cyAkT3BlcmF0b3JBY3Rpb257JE9wZXJhdG9yTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBtYXRjaGluZyBvcGVyYXRvciBmb3IgJyRPcGVyYXRvck5hbWUnIGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBleHRyYWN0IG9wZXJhdG9yIHN1YgogICAgbXkgJFN1YiA9ICRPcGVyYXRvckFjdGlvbnskT3BlcmF0b3JOYW1lfTsKCiAgICAjIGNoZWNrIGZvciBhdmFpbGFibGUgZnVuY3Rpb24KICAgIGlmICggISRTZWxmLT5jYW4oJFN1YikgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmdW5jdGlvbiAnJFN1YicgYXZhaWxhYmxlIGZvciAnJE9wZXJhdG9yTmFtZSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGV4ZWN1dGUgZXh0cmFjdGVkIGFjdGlvbgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT4kU3ViKAogICAgICAgIE9wZXJhdG9yICAgID0+ICRQYXJhbXtPcGVyYXRvcn0sCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJFBhcmFte09iamVjdE5hbWV9LAogICAgICAgIFNlbGVjdG9yICAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgQWN0aW9uSUQgICAgPT4gJFBhcmFte0FjdGlvbklEfSwKICAgICAgICBBY3Rpb25WYWx1ZSA9PiAkUGFyYW17QWN0aW9uVmFsdWV9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWl0ZW0gX09wZXJhdG9yRXF1YWwoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JFcXVhbCgKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdTb21lT3RoZXJWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvckVxdWFsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiByZXN1bHQgb2YgZXF1YXRpb24KICAgIHJldHVybiAkUGFyYW17VmFsdWUxfSBlcSAkUGFyYW17VmFsdWUyfTsKfQoKPWl0ZW0gX09wZXJhdG9yTm90RXF1YWwoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBnaXZlbiB2YWx1ZXMgYXJlIG5vdCBlcXVhbC4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9yTm90RXF1YWwoCiAgICAgICAgVmFsdWUxID0+ICdTb21lVmFsdWUnLAogICAgICAgIFZhbHVlMiA9PiAnU29tZU90aGVyVmFsdWUnLAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JOb3RFcXVhbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIG5lZ2F0ZWQgZXF1YXRpb24KICAgIHJldHVybiAhJFNlbGYtPl9PcGVyYXRvckVxdWFsKCVQYXJhbSk7Cn0KCj1pdGVtIF9PcGVyYXRvcklzRW1wdHkoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBnaXZlbiB2YWx1ZSBpcyBlbXB0eS4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9ySXNFbXB0eSgKICAgICAgICBWYWx1ZTEgPT4gJycsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvcklzRW1wdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVmFsdWUxKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBsZW5ndGggb2YgdmFsdWUKICAgIG15ICRWYWx1ZUxlbmd0aCA9IGxlbmd0aCAkUGFyYW17VmFsdWUxfTsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgbGVuZ3RoIGNoZWNrCiAgICByZXR1cm4gJFZhbHVlTGVuZ3RoID09IDA7Cn0KCj1pdGVtIF9PcGVyYXRvcklzTm90RW1wdHkoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBnaXZlbiB2YWx1ZSBpcyBub3QgZW1wdHkuCgogICAgbXkgJFJlc3VsdCA9ICRDb25kaXRpb25PYmplY3QtPl9PcGVyYXRvcklzTm90RW1wdHkoCiAgICAgICAgVmFsdWUxID0+ICdTb21lVmFsdWUnLAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JJc05vdEVtcHR5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSkpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiBuZWdhdGVkIGVxdWF0aW9uCiAgICByZXR1cm4gISRTZWxmLT5fT3BlcmF0b3JJc0VtcHR5KCVQYXJhbSk7Cn0KCj1pdGVtIF9PcGVyYXRvcklzR3JlYXRlclRoYW4oKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBWYWx1ZTEgaXMgZ3JlYXRlciB0aGFuCnRoZSBjb21wYXJlIFZhbHVlMi4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9ySXNHcmVhdGVyVGhhbigKICAgICAgICBWYWx1ZTEgPT4gMjM0NSwKICAgICAgICBWYWx1ZTIgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9ySXNHcmVhdGVyVGhhbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgZGlnaXRzCiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMX0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMn0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGdyZWF0ZXIgdGhhbiBjaGVjawogICAgcmV0dXJuICRQYXJhbXtWYWx1ZTF9ID4gJFBhcmFte1ZhbHVlMn07Cn0KCj1pdGVtIF9PcGVyYXRvcklzTGVzc1RoYW4oKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBWYWx1ZTEgaXMgbGVzcyB0aGFuCnRoZSBjb21wYXJlIFZhbHVlMi4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9ySXNMZXNzVGhhbigKICAgICAgICBWYWx1ZTEgPT4gMjM0NSwKICAgICAgICBWYWx1ZTIgPT4gMTIzNCwKICAgICk7Cgo9Y3V0CgpzdWIgX09wZXJhdG9ySXNMZXNzVGhhbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgZGlnaXRzCiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMX0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMn0gIX4gbXsgXEEgXGQrIFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIG5lZ2F0ZWQgZXF1YXRpb24KICAgIHJldHVybiAhJFNlbGYtPl9PcGVyYXRvcklzR3JlYXRlclRoYW4oJVBhcmFtKTsKfQoKPWl0ZW0gX09wZXJhdG9ySXNCZWZvcmUoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiBWYWx1ZTEgaXMgYmVmb3JlIHRoZSBjb21wYXJlIFZhbHVlMi4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9ySXNCZWZvcmUoCiAgICAgICAgVmFsdWUxID0+ICcyMDEwLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICBWYWx1ZTIgPT4gJzIwMTAtMDEtMDEgMTA6MDE6MDEnLAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JJc0JlZm9yZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhWYWx1ZTEgVmFsdWUyKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBkYXRlIGZvcm1hdAogICAgcmV0dXJuIGlmICRQYXJhbXtWYWx1ZTF9ICF+IG17IFxBIFxkezR9LVxkezJ9LVxkezJ9IFxzIFxkezJ9OlxkezJ9OlxkezJ9IFx6IH14bXM7CiAgICByZXR1cm4gaWYgJFBhcmFte1ZhbHVlMn0gIX4gbXsgXEEgXGR7NH0tXGR7Mn0tXGR7Mn0gXHMgXGR7Mn06XGR7Mn06XGR7Mn0gXHogfXhtczsKCiAgICAjIGdldCB0aW1lc3RhbXBzCiAgICBteSAlVGltZXN0YW1wOwogICAgZm9yIG15ICREYXRlIChxdyhWYWx1ZTEgVmFsdWUyKSkgewoKICAgICAgICAjIGNvbnZlcnQgdGltZQogICAgICAgICRUaW1lc3RhbXB7JERhdGV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17JERhdGV9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZm9yIHRpbWUKICAgICAgICByZXR1cm4gaWYgISRUaW1lc3RhbXB7JERhdGV9OwogICAgfQoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiBsb3dlciB0aGFuIGNoZWNrCiAgICByZXR1cm4gJFRpbWVzdGFtcHtWYWx1ZTF9IDwgJFRpbWVzdGFtcHtWYWx1ZTJ9Owp9Cgo9aXRlbSBfT3BlcmF0b3JJc0FmdGVyKCkKClJldHVybnMgdHJ1ZSBvciBmYWxzZSAoMS91bmRlZikgaWYgVmFsdWUxIGlzIGFmdGVyIHRoZSBjb21wYXJlIFZhbHVlMi4KCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9ySXNBZnRlcigKICAgICAgICBWYWx1ZTEgPT4gJzIwMTAtMDEtMDEgMTA6MDE6MDEnLAogICAgICAgIFZhbHVlMiA9PiAnMjAxMC0wMS0wMSAwMTowMTowMScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvcklzQWZ0ZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVmFsdWUxIFZhbHVlMikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgZGF0ZSBmb3JtYXQKICAgIHJldHVybiBpZiAkUGFyYW17VmFsdWUxfSAhfiBteyBcQSBcZHs0fS1cZHsyfS1cZHsyfSBccyBcZHsyfTpcZHsyfTpcZHsyfSAgXHogfXhtczsKICAgIHJldHVybiBpZiAkUGFyYW17VmFsdWUyfSAhfiBteyBcQSBcZHs0fS1cZHsyfS1cZHsyfSBccyBcZHsyfTpcZHsyfTpcZHsyfSAgXHogfXhtczsKCiAgICAjIHJldHVybiByZXN1bHQgb2YgbmVnYXRlZCBlcXVhdGlvbgogICAgcmV0dXJuICEkU2VsZi0+X09wZXJhdG9ySXNCZWZvcmUoJVBhcmFtKTsKfQoKPWl0ZW0gX09wZXJhdG9yQ29udGFpbnMoKQoKUmV0dXJucyB0cnVlIG9yIGZhbHNlICgxL3VuZGVmKSBpZiB2YWx1ZTEgY29udGFpbnMgdmFsdWUyLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JDb250YWlucygKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvckNvbnRhaW5zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsb3dlciBjYXNlLCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICBteSAkTG93ZXJWYWx1ZTEgPSBsYyAkUGFyYW17VmFsdWUxfTsKICAgIG15ICRMb3dlclZhbHVlMiA9IGxjICRQYXJhbXtWYWx1ZTJ9OwoKICAgICMgY2hlY2sgZW1iZWRkZWQgc3RyaW5nCiAgICBteSAkQ29udGFpbnMgPSAkTG93ZXJWYWx1ZTEgPX4gbXsgXEEgLiogJExvd2VyVmFsdWUyIC4qIFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGVxdWF0aW9uCiAgICByZXR1cm4gJENvbnRhaW5zOwp9Cgo9aXRlbSBfT3BlcmF0b3JOb3RDb250YWlucygpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIHZhbHVlMSBub3QgY29udGFpbnMgdmFsdWUyLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JOb3RDb250YWlucygKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdTb21lT3RoZXJWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvck5vdENvbnRhaW5zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiByZXN1bHQgb2YgbmVnYXRlZCBlcXVhdGlvbgogICAgcmV0dXJuICEkU2VsZi0+X09wZXJhdG9yQ29udGFpbnMoJVBhcmFtKTsKfQoKPWl0ZW0gX09wZXJhdG9yQmVnaW5zV2l0aCgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIHZhbHVlMSBiZWdpbnMgd2l0aCB2YWx1ZTIuCgogICAgbXkgJFJlc3VsdCA9ICRDb25kaXRpb25PYmplY3QtPl9PcGVyYXRvckJlZ2luc1dpdGgoCiAgICAgICAgVmFsdWUxID0+ICdTb21lVmFsdWUnLAogICAgICAgIFZhbHVlMiA9PiAnU29tZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvckJlZ2luc1dpdGggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVmFsdWUxIFZhbHVlMikpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxvd2VyIGNhc2UsIGZvciBwZXJmb3JtYW5jZSBpc3N1ZXMKICAgIG15ICRMb3dlclZhbHVlMSA9IGxjICRQYXJhbXtWYWx1ZTF9OwogICAgbXkgJExvd2VyVmFsdWUyID0gbGMgJFBhcmFte1ZhbHVlMn07CgogICAgIyBjaGVjayBlbWJlZGRlZCBzdHJpbmcKICAgIG15ICRCZWdpbnNXaXRoID0gJExvd2VyVmFsdWUxID1+IG17IFxBICRMb3dlclZhbHVlMiAuKiBceiB9eG1zOwoKICAgICMgcmV0dXJuIHJlc3VsdCBvZiBlcXVhdGlvbgogICAgcmV0dXJuICRCZWdpbnNXaXRoOwp9Cgo9aXRlbSBfT3BlcmF0b3JFbmRzV2l0aCgpCgpSZXR1cm5zIHRydWUgb3IgZmFsc2UgKDEvdW5kZWYpIGlmIHZhbHVlMSBlbmRzIHdpdGggdmFsdWUyLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JFbmRzV2l0aCgKICAgICAgICBWYWx1ZTEgPT4gJ1NvbWVWYWx1ZScsCiAgICAgICAgVmFsdWUyID0+ICdWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvckVuZHNXaXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFZhbHVlMSBWYWx1ZTIpKSB7CiAgICAgICAgaWYgKCAhZXhpc3RzICRQYXJhbXskQXJndW1lbnR9IHx8ICFkZWZpbmVkICRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsb3dlciBjYXNlLCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICBteSAkTG93ZXJWYWx1ZTEgPSBsYyAkUGFyYW17VmFsdWUxfTsKICAgIG15ICRMb3dlclZhbHVlMiA9IGxjICRQYXJhbXtWYWx1ZTJ9OwoKICAgICMgY2hlY2sgZW1iZWRkZWQgc3RyaW5nCiAgICBteSAkRW5kc1dpdGggPSAkTG93ZXJWYWx1ZTEgPX4gbXsgXEEgLiogJExvd2VyVmFsdWUyIFx6IH14bXM7CgogICAgIyByZXR1cm4gcmVzdWx0IG9mIGVxdWF0aW9uCiAgICByZXR1cm4gJEVuZHNXaXRoOwp9Cgo9aXRlbSBfT3BlcmF0b3JTZXQoKQoKUmV0dXJucyB0aGUgc3VjY2VzcyBvZiBzZXR0aW5nIGEgbmV3IHZhbHVlLgoKICAgIG15ICRSZXN1bHQgPSAkQ29uZGl0aW9uT2JqZWN0LT5fT3BlcmF0b3JTZXQoCiAgICAgICAgT3BlcmF0b3IgICAgPT4gJ3NldCcsCiAgICAgICAgT2JqZWN0TmFtZSAgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFNlbGVjdG9yICAgID0+ICcxMjM0JwogICAgICAgIEF0dHJpYnV0ZSAgID0+ICdDaGFuZ2VTdGF0ZUlEJywKICAgICAgICBBY3Rpb25JRCAgICA9PiAnQ2hhbmdlU3RhdGVJRCcsCiAgICAgICAgQWN0aW9uVmFsdWUgPT4gJzEzJywKICAgICAgICBVc2VySUQgICAgICA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBfT3BlcmF0b3JTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT3BlcmF0b3IgT2JqZWN0TmFtZSBTZWxlY3RvciBBdHRyaWJ1dGUgQWN0aW9uSUQgQWN0aW9uVmFsdWUgVXNlcklEKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3BlcmF0b3IgbmFtZQogICAgbXkgJE9wZXJhdG9yTmFtZSA9ICRQYXJhbXtPYmplY3ROYW1lfTsKCiAgICAjIGdldCBvcGVyYXRvciBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fT3BlcmF0b3JMb2FkQmFja2VuZCgKICAgICAgICBUeXBlID0+ICRPcGVyYXRvck5hbWUsCiAgICApOwogICAgcmV0dXJuIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGRlZmluZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYmFja2VuZAogICAgbXkgJFN1YiA9ICdTZXQnOwoKICAgICMgY2hlY2sgZm9yIGF2YWlsYWJsZSBmdW5jdGlvbgogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QtPmNhbigkU3ViKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGZ1bmN0aW9uICckU3ViJyBhdmFpbGFibGUgZm9yIGJhY2tlbmQgJyRPcGVyYXRvck5hbWUnISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXN1bHQgdmFsdWUKICAgIG15ICRSZXN1bHQ7CgogICAgIyBleGVjdXRlIGV4dHJhY3RlZCBhY3Rpb24gd2l0aCBzZWxlY3RvciAnYWxsJwogICAgaWYgKCAkUGFyYW17U2VsZWN0b3J9IGVxICdhbGwnICkgewoKICAgICAgICAjIGRlZmluZSAnYWxsJyBmdW5jdGlvbiBmb3IgYmFja2VuZAogICAgICAgICRTdWIgPSAnU2V0QWxsJzsKCiAgICAgICAgIyBjaGVjayBmb3IgYXZhaWxhYmxlIGZ1bmN0aW9uCiAgICAgICAgaWYgKCAhJEJhY2tlbmRPYmplY3QtPmNhbigkU3ViKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIGZ1bmN0aW9uICckU3ViJyBhdmFpbGFibGUgZm9yIGJhY2tlbmQgJyRPcGVyYXRvck5hbWUnISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFjdGlvbgogICAgICAgIG15ICRBY3Rpb24gPSAkU2VsZi0+QWN0aW9uR2V0KAogICAgICAgICAgICBBY3Rpb25JRCA9PiAkUGFyYW17QWN0aW9uSUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGFjdGlvbgogICAgICAgIHJldHVybiBpZiAhJEFjdGlvbjsKCiAgICAgICAgIyBnZXQgb2JqZWN0cyBmb3IgJ2FsbCcKICAgICAgICBteSAkQWN0aW9uT2JqZWN0cyA9ICRTZWxmLT5PYmplY3REYXRhR2V0KAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQWN0aW9uLT57Q29uZGl0aW9uSUR9LAogICAgICAgICAgICBPYmplY3ROYW1lICA9PiAkUGFyYW17T2JqZWN0TmFtZX0sCiAgICAgICAgICAgIFNlbGVjdG9yICAgID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgb2JqZWN0cwogICAgICAgIHJldHVybiAxIGlmICEkQWN0aW9uT2JqZWN0czsKICAgICAgICByZXR1cm4gaWYgcmVmICRBY3Rpb25PYmplY3RzIG5lICdBUlJBWSc7CgogICAgICAgICMgZXhlY3V0ZSBhY3Rpb25zIGZvciBhbGwgb2JqZWN0cwogICAgICAgICRSZXN1bHQgPSAkQmFja2VuZE9iamVjdC0+JFN1YigKICAgICAgICAgICAgT3BlcmF0b3IgICAgPT4gJFBhcmFte09wZXJhdG9yfSwKICAgICAgICAgICAgT2JqZWN0TmFtZSAgPT4gJFBhcmFte09iamVjdE5hbWV9LAogICAgICAgICAgICBPYmplY3RzICAgICA9PiAkQWN0aW9uT2JqZWN0cywKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBleGVjdXRlIGV4dHJhY3RlZCBhY3Rpb24gd2l0aCBzaW5nbGUgc2VsZWN0b3IKICAgICAgICAkUmVzdWx0ID0gJEJhY2tlbmRPYmplY3QtPiRTdWIoCiAgICAgICAgICAgIE9wZXJhdG9yICAgID0+ICRQYXJhbXtPcGVyYXRvcn0sCiAgICAgICAgICAgIE9iamVjdE5hbWUgID0+ICRQYXJhbXtPYmplY3ROYW1lfSwKICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9PcGVyYXRvckxvYWRCYWNrZW5kKCkKClJldHVybnMgYSBuZXdseSBsb2FkZWQgYmFja2VuZCBvYmplY3QKCiAgICBteSAkUmVzdWx0ID0gJENvbmRpdGlvbk9iamVjdC0+X09wZXJhdG9yTG9hZEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZScsCiAgICApOwoKPWN1dAoKc3ViIF9PcGVyYXRvckxvYWRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYmFja2VuZCBtb2R1bGUgbmFtZQogICAgbXkgJE1vZHVsZU5hbWUgPSAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9wZXJhdG9yOjonIC4gJFBhcmFte1R5cGV9OwoKICAgICMgbG9hZCB0aGUgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE1vZHVsZU5hbWUpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkTW9kdWxlTmFtZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgYmFja2VuZCBvYmplY3QKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMjQgJCAkRGF0ZTogMjAxMC8wNi8xNSAwMTowNDo0NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09iamVjdC9JVFNNQ2hhbmdlLnBtIC0gYWxsIGl0c20gY2hhbmdlIG9iamVjdCBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2UucG0sdiAxLjQgMjAxMC8wMS8zMCAwMzo0Njo1MSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T2JqZWN0OjpJVFNNQ2hhbmdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPYmplY3Q6OklUU01DaGFuZ2UgLSBjb25kaXRpb24gaXRzbSBjaGFuZ2Ugb2JqZWN0IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgSVRTTUNoYW5nZSBvYmplY3QgZnVuY3Rpb25zIGZvciBjb25kaXRpb25zIGluIElUU01DaGFuZ2VNYW5hZ2VtZW50LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTUNoYW5nZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25kaXRpb25PYmplY3RJVFNNQ2hhbmdlID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTUNoYW5nZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKUmV0dXJucyBjaGFuZ2UgZGF0YSBpbiBhbiBhcnJheSByZWZlcmVuY2UuCgogICAgbXkgJENoYW5nZURhdGFSZWYgPSAkQ29uZGl0aW9uT2JqZWN0SVRTTUNoYW5nZS0+RGF0YUdldCgKICAgICAgICBTZWxlY3RvciA9PiAxMjM0LAogICAgICAgIFVzZXJJRCAgID0+IDIzNDUsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VsZWN0b3IgVXNlcklEKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZW1hcCBwYXJhbXMKICAgIG15ICVDaGFuZ2VHZXQgPSAoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgY2hhbmdlIGRhdGEgYXMgYW5vbiBoYXNoIHJlZgogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KCVDaGFuZ2VHZXQpOwoKICAgICMgY2hlY2sgZm9yIGNoYW5nZQogICAgcmV0dXJuIGlmICEkQ2hhbmdlOwoKICAgICMgYnVpbGQgYXJyYXkgcmVmCiAgICBteSAkQ2hhbmdlRGF0YSA9IFskQ2hhbmdlXTsKCiAgICByZXR1cm4gJENoYW5nZURhdGE7Cn0KCj1pdGVtIENvbXBhcmVWYWx1ZUxpc3QoKQoKUmV0dXJucyBhIGxpc3Qgb2YgYXZhaWxhYmxlIENvbXBhcmVWYWx1ZXMgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaWQgb2YgYSBjaGFuZ2Ugb2JqZWN0IGFzIGhhc2ggcmVmZXJlbmNlLgoKICAgIG15ICRDb21wYXJlVmFsdWVMaXN0ID0gJENvbmRpdGlvbk9iamVjdElUU01DaGFuZ2UtPkNvbXBhcmVWYWx1ZUxpc3QoCiAgICAgICAgQXR0cmlidXRlTmFtZSA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBsaWtlIHRoaXMsIGZvciB0aGUgY2hhbmdlIGF0dHJpYnV0ZSAnUHJpb3JpdHknOgoKICAgICRDb21wYXJlVmFsdWVMaXN0ID0gewogICAgICAgIDIzICAgID0+ICcxIHZlcnkgbG93JywKICAgICAgICAyNCAgICA9PiAnMiBsb3cnLAogICAgICAgIDI1ICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgMjYgICAgPT4gJzQgaGlnaCcsCiAgICAgICAgMjcgICAgPT4gJzUgdmVyeSBoaWdoJywKICAgIH0KCj1jdXQKCnN1YiBDb21wYXJlVmFsdWVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEF0dHJpYnV0ZU5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRvIHN0b3JlIHRoZSBsaXN0CiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9IHt9OwoKICAgICMgQ2F0ZWdvcnlJRCwgSW1wYWN0SUQsIFByaW9yaXR5SUQKICAgIGlmICggJFBhcmFte0F0dHJpYnV0ZU5hbWV9ID1+IG17IFxBICggQ2F0ZWdvcnkgfCBJbXBhY3QgfCBQcmlvcml0eSApIElEIFx6IH14bXMgKSB7CgogICAgICAgICMgcmVtb3ZlICdJRCcgYXQgdGhlIGVuZCBvZiBhdHRyaWJ1dGUKICAgICAgICBteSAkVHlwZSA9ICQxOwoKICAgICAgICAjIGdldCB0aGUgY2F0ZWdvcnkgb3IgaW1wYWN0IG9yIHByaW9yaXR5IGxpc3QKICAgICAgICAkQ29tcGFyZVZhbHVlTGlzdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgICAgIFR5cGUgICA9PiAkVHlwZSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGFuZ2VTdGF0ZUlECiAgICBlbHNpZiAoICRQYXJhbXtBdHRyaWJ1dGVOYW1lfSBlcSAnQ2hhbmdlU3RhdGVJRCcgKSB7CgogICAgICAgICMgZ2V0IGNoYW5nZSBzdGF0ZSBsaXN0CiAgICAgICAgJENvbXBhcmVWYWx1ZUxpc3QgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ0NoYW5nZUJ1aWxkZXJJRCcKICAgICAgICB8fCAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ0NoYW5nZU1hbmFnZXJJRCcKICAgICAgICApCiAgICB7CgogICAgICAgICMgZ2V0IGEgY29tcGxldGUgbGlzdCBvZiB1c2VycwogICAgICAgIG15ICVVc2VycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJENvbXBhcmVWYWx1ZUxpc3QgPSBcJVVzZXJzOwogICAgfQoKICAgIHJldHVybiAkQ29tcGFyZVZhbHVlTGlzdDsKfQoKPWl0ZW0gU2VsZWN0b3JMaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGFsbCBzZWxlY3RvcnMgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gY2hhbmdlIG9iamVjdCBpZCBhbmQgY29uZGl0aW9uIGlkIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJFNlbGVjdG9yTGlzdCA9ICRDb25kaXRpb25PYmplY3RJVFNNQ2hhbmdlLT5TZWxlY3Rvckxpc3QoCiAgICAgICAgT2JqZWN0SUQgICAgPT4gMTIzNCwKICAgICAgICBDb25kaXRpb25JRCA9PiA1LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKUmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIGxpa2UgdGhpczoKCiAgICAkU2VsZWN0b3JMaXN0ID0gewogICAgICAgIDQ1NiA9PiAnQ2hhbmdlIyAyMDEwMDExNjEwMDAwNjE4JywKICAgIH0KCj1jdXQKCnN1YiBTZWxlY3Rvckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJENoYW5nZURhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGVycm9yCiAgICByZXR1cm4gaWYgISRDaGFuZ2VEYXRhOwoKICAgICMgYnVpbGQgc2VsZWN0b3IgbGlzdAogICAgbXkgJVNlbGVjdG9yTGlzdCA9ICgKICAgICAgICAkQ2hhbmdlRGF0YS0+e0NoYW5nZUlEfSA9PiAkQ2hhbmdlRGF0YS0+e0NoYW5nZU51bWJlcn0sCiAgICApOwoKICAgIHJldHVybiBcJVNlbGVjdG9yTGlzdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNCAkICREYXRlOiAyMDEwLzAxLzMwIDAzOjQ2OjUxICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09iamVjdC9JVFNNV29ya09yZGVyLnBtIC0gYWxsIGl0c20gd29ya29yZGVyIG9iamVjdCBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01Xb3JrT3JkZXIucG0sdiAxLjkgMjAxMC8wNC8yNyAyMDo1MDo0NyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T2JqZWN0OjpJVFNNV29ya09yZGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9iamVjdDo6SVRTTVdvcmtPcmRlciAtIGNvbmRpdGlvbiBpdHNtIHdvcmtvcmRlciBvYmplY3QgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBJVFNNV29ya09yZGVyIG9iamVjdCBmdW5jdGlvbnMgZm9yIGNvbmRpdGlvbnMgaW4gSVRTTUNoYW5nZU1hbmFnZW1lbnQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T2JqZWN0OjpJVFNNV29ya09yZGVyOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmRpdGlvbk9iamVjdElUU01Xb3JrT3JkZXIgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T2JqZWN0OjpJVFNNV29ya09yZGVyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24tPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKUmV0dXJucyB3b3Jrb3JkZXIgZGF0YSBpbiBhbiBhcnJheSByZWZlcmVuY2UuCgogICAgbXkgJFdvcmtPcmRlckRhdGFSZWYgPSAkQ29uZGl0aW9uT2JqZWN0SVRTTVdvcmtPcmRlci0+RGF0YUdldCgKICAgICAgICBTZWxlY3RvciA9PiAxMjM0LAogICAgICAgIFVzZXJJRCAgID0+IDIzNDUsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VsZWN0b3IgVXNlcklEKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBoYW5kbGUgJ2FueScgb3IgJ2FsbCcgaW4gYSBzcGVjaWFsIGNhc2UKICAgIHJldHVybiAkU2VsZi0+X0RhdGFHZXRBbGwoJVBhcmFtKSBpZiAkUGFyYW17U2VsZWN0b3J9IGVxICdhbnknOwogICAgcmV0dXJuICRTZWxmLT5fRGF0YUdldEFsbCglUGFyYW0pIGlmICRQYXJhbXtTZWxlY3Rvcn0gZXEgJ2FsbCc7CgogICAgIyByZW1hcCBwYXJhbXMKICAgIG15ICVXb3JrT3JkZXJHZXQgPSAoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1NlbGVjdG9yfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgd29ya29yZGVyIGFzIGFub24gaGFzaCByZWYKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCglV29ya09yZGVyR2V0KTsKCiAgICAjIGNoZWNrIGZvciB3b3Jrb3JkZXIKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcjsKCiAgICAjIGJ1aWxkIGFycmF5IHJlZgogICAgbXkgJFdvcmtPcmRlckRhdGEgPSBbJFdvcmtPcmRlcl07CgogICAgcmV0dXJuICRXb3JrT3JkZXJEYXRhOwp9Cgo9aXRlbSBDb21wYXJlVmFsdWVMaXN0KCkKClJldHVybnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBDb21wYXJlVmFsdWVzIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlkIG9mIGEgd29ya29yZGVyIG9iamVjdCBhcyBoYXNoIHJlZmVyZW5jZS4KCiAgICBteSAkQ29tcGFyZVZhbHVlTGlzdCA9ICRDb25kaXRpb25PYmplY3RJVFNNV29ya09yZGVyLT5Db21wYXJlVmFsdWVMaXN0KAogICAgICAgIEF0dHJpYnV0ZU5hbWUgPT4gJ1dvcmtPcmRlclN0YXRlSUQnLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgpSZXR1cm5zIGEgaGFzaCByZWZlcmVuY2UgbGlrZSB0aGlzLCBmb3IgdGhlIHdvcmtvcmRlciBhdHRyaWJ1dGUgJ1dvcmtPcmRlclN0YXRlSUQnOgoKICAgICRDb21wYXJlVmFsdWVMaXN0ID0gewogICAgICAgIDEwICAgID0+ICdjcmVhdGVkJywKICAgICAgICAxMiAgICA9PiAnYWNjZXB0ZWQnLAogICAgICAgIDEzICAgID0+ICdyZWFkeScsCiAgICAgICAgMTQgICAgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICAxNSAgICA9PiAnY2xvc2VkJywKICAgICAgICAxNiAgICA9PiAnY2FuY2VsZWQnLAogICAgfQoKPWN1dAoKc3ViIENvbXBhcmVWYWx1ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQXR0cmlidXRlTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgdG8gc3RvcmUgdGhlIGxpc3QKICAgIG15ICRDb21wYXJlVmFsdWVMaXN0ID0ge307CgogICAgIyBXb3JrT3JkZXJTdGF0ZUlECiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGVOYW1lfSBlcSAnV29ya09yZGVyU3RhdGVJRCcgKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBzdGF0ZSBsaXN0CiAgICAgICAgJENvbXBhcmVWYWx1ZUxpc3QgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFdvcmtPcmRlclR5cGVJRAogICAgZWxzaWYgKCAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ1dvcmtPcmRlclR5cGVJRCcgKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciB0eXBlIGxpc3QKICAgICAgICAkQ29tcGFyZVZhbHVlTGlzdCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVHlwZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXR0cmlidXRlTmFtZX0gZXEgJ1dvcmtPcmRlckFnZW50SUQnICkgewoKICAgICAgICAjIGdldCBhIGNvbXBsZXRlIGxpc3Qgb2YgdXNlcnMKICAgICAgICBteSAlVXNlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICRDb21wYXJlVmFsdWVMaXN0ID0gXCVVc2VyczsKICAgIH0KCiAgICByZXR1cm4gJENvbXBhcmVWYWx1ZUxpc3Q7Cn0KCj1pdGVtIFNlbGVjdG9yTGlzdCgpCgpSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VsZWN0b3JzIGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIHdvcmtvcmRlciBvYmplY3QgaWQgYW5kIGNvbmRpdGlvbiBpZCBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRTZWxlY3Rvckxpc3QgPSAkQ29uZGl0aW9uT2JqZWN0SVRTTVdvcmtPcmRlci0+U2VsZWN0b3JMaXN0KAogICAgICAgIE9iamVjdElEICAgID0+IDEyMzQsCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gNSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKClJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSBsaWtlIHRoaXM6CgogICAgJFNlbGVjdG9yTGlzdCA9IHsKICAgICAgICAxMCAgICA9PiAnMSAtIFdvcmtvcmRlclRpdGxlIG9mIFdvcmtvcmRlciAxJywKICAgICAgICAxMiAgICA9PiAnMiAtIFdvcmtvcmRlclRpdGxlIG9mIFdvcmtvcmRlciAyJywKICAgICAgICAzNCAgICA9PiAnMyAtIFdvcmtvcmRlclRpdGxlIG9mIFdvcmtvcmRlciAzJywKICAgICAgICAnYW55JyA9PiAnYW55JywKICAgICAgICAnYWxsJyA9PiAnYWxsJywKICAgIH0KCj1jdXQKCnN1YiBTZWxlY3Rvckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhbGwgd29ya29yZGVyIGlkcyBvZiBjaGFuZ2UKICAgIG15ICRXb3JrT3JkZXJJRHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBmb3Igd29ya29yZGVyIGlkcwogICAgcmV0dXJuIGlmICEkV29ya09yZGVySURzOwogICAgcmV0dXJuIGlmIHJlZiAkV29ya09yZGVySURzIG5lICdBUlJBWSc7CgogICAgIyBidWlsZCBzZWxlY3RvciBsaXN0CiAgICBteSAlU2VsZWN0b3JMaXN0OwogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7JFdvcmtPcmRlcklEc30gKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgbXkgJFdvcmtPcmRlckRhdGEgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZWN0b3JMaXN0eyAkV29ya09yZGVyRGF0YS0+e1dvcmtPcmRlcklEfSB9CiAgICAgICAgICAgID0gJFdvcmtPcmRlckRhdGEtPntXb3JrT3JkZXJOdW1iZXJ9IC4gJyAtICcgLiAkV29ya09yZGVyRGF0YS0+e1dvcmtPcmRlclRpdGxlfTsKICAgIH0KCiAgICAjIGFkZCAnYWxsJyBzZWxlY3RvciAoZm9yIGV4cHJlc3Npb25zIGFuZCBhY3Rpb25zKQogICAgJFNlbGVjdG9yTGlzdHsnYWxsJ30gPSAnYWxsJzsKCiAgICAjIGFkZCAnYW55JyBzZWxlY3RvciBvbmx5IGZvciBleHByZXNzaW9ucwogICAgaWYgKCAkUGFyYW17RXhwcmVzc2lvbklEfSApIHsKICAgICAgICAkU2VsZWN0b3JMaXN0eydhbnknfSA9ICdhbnknOwogICAgfQoKICAgIHJldHVybiBcJVNlbGVjdG9yTGlzdDsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0RhdGFHZXRBbGwoKQoKICAgIG15ICRXb3JrT3JkZXJEYXRhQXJyYXlSZWYgPSAkQ29uZGl0aW9uT2JqZWN0SVRTTVdvcmtPcmRlci0+X0RhdGFHZXRBbGwoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9EYXRhR2V0QWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZGl0aW9uCiAgICBteSAkQ29uZGl0aW9uRGF0YSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uR2V0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGNvbmRpdGlvbgogICAgcmV0dXJuIGlmICEkQ29uZGl0aW9uRGF0YTsKCiAgICAjIGdldCBhbGwgd29ya29yZGVyIGlkcyBvZiBjaGFuZ2UKICAgIG15ICRXb3JrT3JkZXJJRHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENvbmRpdGlvbkRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHdvcmtvcmRlciBpZHMKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcklEczsKICAgIHJldHVybiBpZiByZWYgJFdvcmtPcmRlcklEcyBuZSAnQVJSQVknOwogICAgcmV0dXJuIGlmICFAeyRXb3JrT3JkZXJJRHN9OwoKICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICBteSBAV29ya09yZGVyRGF0YTsKICAgIFdPUktPUkRFUklEOgogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7JFdvcmtPcmRlcklEc30gKSB7CiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgd29ya29yZGVyCiAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgIyBhZGQgd29ya29yZGVyIHRvIHJldHVybiBhcnJheQogICAgICAgIHB1c2ggQFdvcmtPcmRlckRhdGEsICRXb3JrT3JkZXI7CiAgICB9CgogICAgIyByZXR1cm4gd29ya29yZGVyIGRhdGEKICAgIHJldHVybiBcQFdvcmtPcmRlckRhdGE7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS45ICQgJERhdGU6IDIwMTAvMDQvMjcgMjA6NTA6NDcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09wZXJhdG9yL0lUU01DaGFuZ2UucG0gLSBhbGwgaXRzbSBjaGFuZ2Ugb3BlcmF0b3IgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlLnBtLHYgMS41IDIwMTAvMDYvMDkgMDk6NDY6MDEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9wZXJhdG9yOjpJVFNNQ2hhbmdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01DaGFuZ2UgLSBjb25kaXRpb24gaXRzbSBjaGFuZ2Ugb3BlcmF0b3IgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBJVFNNQ2hhbmdlIG9wZXJhdG9yIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9ucyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPcGVyYXRvcjo6SVRTTUNoYW5nZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25kaXRpb25PcGVyYXRvcklUU01DaGFuZ2UgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01DaGFuZ2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFNldCgpCgpVcGRhdGVzIGEgY2hhbmdlIHdpdGggdGhlIGdpdmVuIGRhdGEuCgogICAgbXkgJFN1Y2Nlc3MgPSAkSVRTTUNoYW5nZU9wZXJhdG9yLT5TZXQoCiAgICAgICAgU2VsZWN0b3IgICAgPT4gMTIzNCwKICAgICAgICBBdHRyaWJ1dGUgICA9PiAnQ2hhbmdlU3RhdGVJRCcsCiAgICAgICAgQWN0aW9uVmFsdWUgPT4gMjM0NSwKICAgICAgICBVc2VySUQgICAgICA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VsZWN0b3IgQXR0cmlidXRlIEFjdGlvblZhbHVlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoYW5nZQogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJENoYW5nZTsKICAgIHJldHVybiBpZiByZWYgJENoYW5nZSBuZSAnSEFTSCc7CgogICAgIyBzZXQgY2hhbmdlIGF0dHJpYnV0ZSB0byBlbXB0eSBzdHJpbmcgaWYgaXQgaXMgbm90IHRydWUKICAgICRDaGFuZ2UtPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSB8fD0gJyc7CgogICAgIyBkbyBub3QgdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgaXQgYWxyZWFkeSBoYXMgdGhpcyB2YWx1ZQogICAgIyAoIHRoaXMgd2lsbCBwcmV2ZW50IGluZmluaXRlIGV2ZW50IGxvb3BpbmchICkKICAgIHJldHVybiAxIGlmICRDaGFuZ2UtPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSBlcSAkUGFyYW17QWN0aW9uVmFsdWV9OwoKICAgICMgdXBkYXRlIGNoYW5nZSBhbmQgcmV0dXJuIHVwZGF0ZSByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVVwZGF0ZSgKICAgICAgICBDaGFuZ2VJRCAgICAgICAgICA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgICRQYXJhbXtBdHRyaWJ1dGV9ID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMTAvMDYvMDkgMDk6NDY6MDEgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNQ29uZGl0aW9uL09wZXJhdG9yL0lUU01Xb3JrT3JkZXIucG0gLSBhbGwgaXRzbSB3b3Jrb3JkZXIgb3BlcmF0b3IgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNV29ya09yZGVyLnBtLHYgMS42IDIwMTAvMDQvMjcgMjA6NTE6MTQgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb246Ok9wZXJhdG9yOjpJVFNNV29ya09yZGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01Xb3JrT3JkZXIgLSBjb25kaXRpb24gaXRzbSB3b3Jrb3JkZXIgb3BlcmF0b3IgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBJVFNNV29ya09yZGVyIG9wZXJhdG9yIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9ucyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOjpPcGVyYXRvcjo6SVRTTVdvcmtPcmRlcjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25kaXRpb25PcGVyYXRvcklUU01Xb3JrT3JkZXIgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbjo6T3BlcmF0b3I6OklUU01Xb3JrT3JkZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFNldCgpCgpVcGRhdGVzIGEgd29ya29yZGVyIHdpdGggdGhlIGdpdmVuIGRhdGEuCgogICAgbXkgJFN1Y2Nlc3MgPSAkSVRTTVdvcmtPcmRlck9wZXJhdG9yLT5TZXQoCiAgICAgICAgU2VsZWN0b3IgICAgPT4gMTIzNCwKICAgICAgICBBdHRyaWJ1dGUgICA9PiAnV29ya09yZGVyU3RhdGVJRCcsCiAgICAgICAgQWN0aW9uVmFsdWUgPT4gMjM0NSwKICAgICAgICBVc2VySUQgICAgICA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VsZWN0b3IgQXR0cmlidXRlIEFjdGlvblZhbHVlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFleGlzdHMgJFBhcmFteyRBcmd1bWVudH0gfHwgIWRlZmluZWQgJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlcgogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtTZWxlY3Rvcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZXJyb3IKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlcjsKICAgIHJldHVybiBpZiByZWYgJFdvcmtPcmRlciBuZSAnSEFTSCc7CgogICAgIyBzZXQgd29ya29yZGVyIGF0dHJpYnV0ZSB0byBlbXB0eSBzdHJpbmcgaWYgaXQgaXMgbm90IHRydWUKICAgICRXb3JrT3JkZXItPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSB8fD0gJyc7CgogICAgIyBkbyBub3QgdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgaXQgYWxyZWFkeSBoYXMgdGhpcyB2YWx1ZQogICAgIyAoIHRoaXMgd2lsbCBwcmV2ZW50IGluZmluaXRlIGV2ZW50IGxvb3BpbmchICkKICAgIHJldHVybiAxIGlmICRXb3JrT3JkZXItPnsgJFBhcmFte0F0dHJpYnV0ZX0gfSBlcSAkUGFyYW17QWN0aW9uVmFsdWV9OwoKICAgICMgdXBkYXRlIHdvcmtvcmRlciBhbmQgcmV0dXJuIHVwZGF0ZSByZXN1bHQKICAgIHJldHVybiAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclVwZGF0ZSgKICAgICAgICBXb3JrT3JkZXJJRCAgICAgICA9PiAkUGFyYW17U2VsZWN0b3J9LAogICAgICAgICRQYXJhbXtBdHRyaWJ1dGV9ID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwp9Cgo9aXRlbSBTZXRBbGwoKQoKVXBkYXRlcyBhIHNldCBvZiB3b3Jrb3JkZXJzIHdpdGggdGhlIGdpdmVuIGRhdGEuCgogICAgbXkgJFN1Y2Nlc3MgPSAkSVRTTVdvcmtPcmRlck9wZXJhdG9yLT5TZXRBbGwoCiAgICAgICAgT2JqZWN0cyAgICAgPT4gWyB7Li4ufSwgey4uLn0sIF0sICAjIGRhdGEgb2YgSVRTTVdvcmtPcmRlcnMKICAgICAgICBBdHRyaWJ1dGUgICA9PiAnV29ya09yZGVyU3RhdGVJRCcsCiAgICAgICAgQWN0aW9uVmFsdWUgPT4gMjM0NSwKICAgICAgICBVc2VySUQgICAgICA9PiAxMjM0LAogICAgKTsKCj1jdXQKCnN1YiBTZXRBbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0cyBBdHRyaWJ1dGUgQWN0aW9uVmFsdWUgVXNlcklEKSkgewogICAgICAgIGlmICggIWV4aXN0cyAkUGFyYW17JEFyZ3VtZW50fSB8fCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBvYmplY3RzCiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtPYmplY3RzfSBuZSAnQVJSQVknOwoKICAgICMgdXBkYXRlIGVhY2ggd29ya29yZGVyIG9iamVjdAogICAgV09SS09SREVST0JKRUNUOgogICAgZm9yIG15ICRXb3JrT3JkZXJPYmplY3QgKCBAeyAkUGFyYW17T2JqZWN0c30gfSApIHsKCiAgICAgICAgIyBjaGVjayB3b3Jrb3JkZXIgb2JqZWN0CiAgICAgICAgbmV4dCBXT1JLT1JERVJPQkpFQ1QgaWYgISRXb3JrT3JkZXJPYmplY3Q7CiAgICAgICAgbmV4dCBXT1JLT1JERVJPQkpFQ1QgaWYgcmVmICRXb3JrT3JkZXJPYmplY3QgbmUgJ0hBU0gnOwoKICAgICAgICAjIHVwZGF0ZSB3b3Jrb3JkZXIgb2JqZWN0CiAgICAgICAgJFNlbGYtPlNldCgKICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJFdvcmtPcmRlck9iamVjdC0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgQXR0cmlidXRlICAgPT4gJFBhcmFte0F0dHJpYnV0ZX0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICRQYXJhbXtBY3Rpb25WYWx1ZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgVE9ETzogQWRkIGVycm9yIGhhbmRsaW5nIGhlcmUKICAgICAgICAjIGdldCB0aGUgcmVzdWx0cyBvZiB0aGUgU2V0IGZ1bmN0aW9uIGNhbGxzCiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAxMC8wNC8yNyAyMDo1MToxNCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL0V2ZW50L1dvcmtPcmRlckFjdHVhbFRpbWVzU2V0LnBtIC0gdG8gc2V0IGFjdHVhbCB3b3Jrb3JkZXIgdGltZXMKIyBldmVudCBtb2R1bGUgZm9yIElUU01Xb3JrT3JkZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFdvcmtPcmRlckFjdHVhbFRpbWVzU2V0LnBtLHYgMS4zIDIwMTAvMDUvMjAgMTM6NTE6NDAgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OkV2ZW50OjpXb3JrT3JkZXJBY3R1YWxUaW1lc1NldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6V29ya09yZGVyQWN0dWFsVGltZXNTZXQgLSBXb3JrT3JkZXJBY3R1YWxUaW1lc1NldApldmVudCBtb2R1bGUgZm9yIElUU01Xb3JrT3JkZXIKCj1oZWFkMSBTWU5PUFNJUwoKRXZlbnQgaGFuZGxlciBtb2R1bGUgZm9yIHNldHRpbmcgdGhlIGFjdHVhbCBzdGFydCBhbmQgZW5kIHRpbWUgaW4gV29ya09yZGVycy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6V29ya09yZGVyQWN0dWFsVGltZXNTZXQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFdvcmtPcmRlckFjdHVhbFRpbWVzU2V0T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OkV2ZW50OjpXb3JrT3JkZXJBY3R1YWxUaW1lc1NldC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgICAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBXb3JrT3JkZXJPYmplY3QgPT4gJFdvcmtPcmRlck9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IFdvcmtPcmRlck9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoZSBDPFJ1bigpPiBtZXRob2Qgc2V0cyB0aGUgYWN0dWFsIHN0YXJ0IGFuZCBlbmQgdGltZSBvZiBhIHdvcmtvcmRlciBpZiBpdCBpcyBub3QgeWV0IHNldC4KVGhlIGFjdHVhbCBzdGFydCB0aW1lIGlzIHNldCBpZiBhIGNvbmZpZ3VyYWJsZSB3b3Jrb3JkZXIgc3RhdGUgaXMgcmVhY2hlZCwgdGhlIGFjdHVhbCBlbmQgdGltZSBpcyBzZXQKaWYgdGhlIHdvcmtvcmRlciByZWFjaGVzIGFueSBlbmQgc3RhdGUuCgpUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgQzxXb3JrT3JkZXJVcGRhdGU+IGV2ZW50LgoKVGhlIG1ldGhvZHMgcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICRFdmVudE9iamVjdC0+UnVuKAogICAgICAgIEV2ZW50ID0+ICdXb3JrT3JkZXJVcGRhdGVQb3N0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gMTIzLAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgICAgPT4gJ1dvcmtPcmRlclVwZGF0ZVBvc3QnLAogICAgICAgICAgICBNb2R1bGUgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OkV2ZW50OjpXb3JrT3JkZXJBY3R1YWxUaW1lc1NldCcsCiAgICAgICAgICAgIFRyYW5zYWN0aW9uID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBXb3JrT3JkZXJVcGRhdGUgZXZlbnQKICAgIGlmICggJFBhcmFte0V2ZW50fSBlcSAnV29ya09yZGVyVXBkYXRlUG9zdCcgKSB7CgogICAgICAgICMgZ2V0IFdvcmtPcmRlcgogICAgICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGVycm9yCiAgICAgICAgcmV0dXJuIGlmICEkV29ya09yZGVyOwoKICAgICAgICAjIGdldCBhY3R1YWwgc3RhcnQgdGltZSBmcm9tIHdvcmtvcmRlcgogICAgICAgIG15ICRBY3R1YWxTdGFydFRpbWUgPSAkV29ya09yZGVyLT57QWN0dWFsU3RhcnRUaW1lfTsKCiAgICAgICAgIyBnZXQgY29uZmlndXJlZCB3b3Jrb3JkZXIgc3RhdGVzIHdoZW4gdG8gc2V0IGFjdHVhbCBzdGFydCB0aW1lCiAgICAgICAgbXkgJENvbmZpZ3VyZWRXb3JrT3JkZXJTdGFydFN0YXRlcwogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNV29ya09yZGVyOjpBY3R1YWxTdGFydFRpbWVTZXQ6OlN0YXRlcycpOwoKICAgICAgICAjIGNvbnZlcnQgaW50byBoYXNoIGZvciBlYXNpZXIgbG9va3VwCiAgICAgICAgbXkgJUFjdHVhbFN0YXJ0VGltZVNldFN0YXRlcyA9IG1hcCB7ICRfID0+IDEgfSBAeyRDb25maWd1cmVkV29ya09yZGVyU3RhcnRTdGF0ZXN9OwoKICAgICAgICAjIGdldCBjdXJyZW50IHRpbWUgc3RhbXAKICAgICAgICBteSAkQ3VycmVudFRpbWVTdGFtcCA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKCiAgICAgICAgIyBjaGVjayBpZiBBY3R1YWxTdGFydFRpbWUgaXMgZW1wdHksCiAgICAgICAgIyBhbmQgV29ya09yZGVyU3RhdGUgaXMgaW4gYW4gQWN0dWFsU3RhcnRUaW1lU2V0U3RhdGUKICAgICAgICBpZiAoICEkQWN0dWFsU3RhcnRUaW1lICYmICRBY3R1YWxTdGFydFRpbWVTZXRTdGF0ZXN7ICRXb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZX0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IHRoZSBhY3R1YWwgc3RhcnQgdGltZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICAgICAgV29ya09yZGVySUQgICAgID0+ICRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAkQ3VycmVudFRpbWVTdGFtcCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgQWN0dWFsU3RhcnRUaW1lIGZvciBXb3JrT3JkZXJJRCAnJFBhcmFte0RhdGF9LT57V29ya09yZGVySUR9JyEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciB0aGUganVzdCBzZXQgYWN0dWFsIHN0YXJ0IHRpbWUKICAgICAgICAgICAgJEFjdHVhbFN0YXJ0VGltZSA9ICRDdXJyZW50VGltZVN0YW1wOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGUgQWN0dWFsRW5kVGltZSBpcyBlbXB0eQogICAgICAgICMgYW5kIHRoZSBjdXJyZW50IHdvcmtvcmRlciBzdGF0ZSBpcyBhbiBlbmQgc3RhdGUKICAgICAgICBpZiAoICEkV29ya09yZGVyLT57QWN0dWFsRW5kVGltZX0gKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgcG9zc2libGUgbmV4dCBzdGF0ZSBpZHMKICAgICAgICAgICAgbXkgJE5leHRTdGF0ZUlEc1JlZiA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICAgICAgU3RhdGVJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVyU3RhdGVJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICAgICAgICAgKSB8fCBbXTsKCiAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgb25seSBvbmUgbmV4dCBzdGF0ZSwgd2hpY2ggaXMgYWxzbyAwLAogICAgICAgICAgICAjIHdoaWNoIG1lYW5zIHRoYXQgdGhpcyBpcyBhbiBlbmQgc3RhdGUKICAgICAgICAgICAgaWYgKCAoIHNjYWxhciBAeyROZXh0U3RhdGVJRHNSZWZ9ID09IDEgKSAmJiAoICEkTmV4dFN0YXRlSURzUmVmLT5bMF0gKSApIHsKCiAgICAgICAgICAgICAgICAjIGlmIG5vIGFjdHVhbCBzdGFydCB0aW1lIGlzIHNldCwgdXNlIHRoZSBjdXJyZW50IHRpbWUKICAgICAgICAgICAgICAgIGlmICggISRBY3R1YWxTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjdHVhbFN0YXJ0VGltZSA9ICRDdXJyZW50VGltZVN0YW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaW5jcmVhc2UgdGhlIGN1cnJlbnQgdGltZSBzdGFtcCBieSBvbmUgc2Vjb25kIHRvIGF2b2lkIHRoZSBjYXNlIHRoYXQKICAgICAgICAgICAgICAgICMgYWN0dWFsIHN0YXJ0IGFuZCBlbmQgdGltZXMgYXJlIHRoZSBzYW1lCiAgICAgICAgICAgICAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEN1cnJlbnRUaW1lU3RhbXAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJEFjdHVhbEVuZFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDdXJyZW50U3lzdGVtVGltZSArIDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IHRoZSBhY3R1YWwgZW5kIHRpbWUsCiAgICAgICAgICAgICAgICAjIGFuZCBpZiB0aGUgYWN0dWFsIHN0YXJ0IHRpbWUgd2FzIG5vdCBzZXQsIHNldCBpdCBhbHNvCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEICAgICA9PiAkUGFyYW17RGF0YX0tPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICRBY3R1YWxTdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgID0+ICRBY3R1YWxFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IEFjdHVhbFN0YXJ0VGltZSBmb3IgV29ya09yZGVySUQgJyRQYXJhbXtEYXRhfS0+e1dvcmtPcmRlcklEfSchIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGVycm9yCiAgICBlbHNlIHsKCiAgICAgICAgIyBhbiB1bmtub3duIGV2ZW50CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW17RXZlbnR9IGlzIGFuIHVua25vd24gZXZlbnQgZm9yIHRoaXMgZXZlbnRoYW5kbGVyISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMTAvMDUvMjAgMTM6NTE6NDAgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL0V2ZW50L1dvcmtPcmRlck51bWJlckNhbGMucG0gLSBXb3JrT3JkZXJOdW1iZXJDYWxjCiMgZXZlbnQgbW9kdWxlIGZvciBJVFNNV29ya09yZGVyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXb3JrT3JkZXJOdW1iZXJDYWxjLnBtLHYgMS4xNCAyMDEwLzA1LzIxIDE4OjUzOjE3IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6V29ya09yZGVyTnVtYmVyQ2FsYzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6RXZlbnQ6OldvcmtPcmRlck51bWJlckNhbGMgLSBXb3JrT3JkZXJOdW1iZXJDYWxjCmV2ZW50IG1vZHVsZSBmb3IgSVRTTVdvcmtPcmRlcgoKPWhlYWQxIFNZTk9QU0lTCgpFdmVudCBoYW5kbGVyIG1vZHVsZSBmb3IgcmVjYWxjdWxhdGlvbiBvZiBXb3JrT3JkZXJOdW1iZXJzIGluIElUU01Xb3JrT3JkZXIuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6RXZlbnQ6OldvcmtPcmRlck51bWJlckNhbGM7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENhbGNPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6RXZlbnQ6OldvcmtPcmRlck51bWJlckNhbGMtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgICAgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICAgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgV29ya09yZGVyT2JqZWN0ID0+ICRXb3JrT3JkZXJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBXb3JrT3JkZXJPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoZSBDPFJ1bigpPiBtZXRob2QgcmVjYWxjdWxhdGVzIHRoZSB3b3Jrb3JkZXIgbnVtYmVycyBmb3IgdGhlIGdpdmVuIHdvcmtvcmRlcgphbmQgaXQncyBzaWJsaW5ncy4KVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIEM8V29ya09yZGVyVXBkYXRlPiBhbmQgQzxXb3JrT3JkZXJEZWxldGU+IGV2ZW50cy4KVGhpcyBpc24ndCB0cmlnZ2VyZWQgYnkgQzxXb3JrT3JkZXJBZGQ+IGV2ZW50cyBhcyBDPFdvcmtPcmRlckFkZCgpPiBzZXRzIHRoZQpjb3JyZWN0IHdvcmtvcmRlciBudW1iZXIgYnkgaXRzZWxmLgoKVGhlIG1ldGhvZHMgcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIEM8dW5kZWY+IG90aGVyd2lzZS4KCiAgICBteSAkU3VjY2VzcyA9ICRFdmVudE9iamVjdC0+UnVuKAogICAgICAgIEV2ZW50ID0+ICdXb3JrT3JkZXJVcGRhdGVQb3N0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gMTIzLAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgICAgPT4gJyhXb3JrT3JkZXJVcGRhdGVQb3N0fFdvcmtPcmRlckRlbGV0ZVBvc3QpJywKICAgICAgICAgICAgTW9kdWxlICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpFdmVudDo6V29ya09yZGVyTnVtYmVyQ2FsYycsCiAgICAgICAgICAgIFRyYW5zYWN0aW9uID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgRXZlbnQgQ29uZmlnIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlY2FsY3VsYXRpb24gb2Ygd29ya29yZGVyIG51bWJlcnMgaXMgbmVlZGVkCiAgICByZXR1cm4gMSBpZiAkUGFyYW17RGF0YX0tPntOb051bWJlckNhbGN9OwoKICAgICMgaGFuZGxlIFdvcmtPcmRlclVwZGF0ZSBhbmQgV29ya09yZGVyRGVsZXRlUG9zdCBldmVudHMKICAgIGlmICggJFBhcmFte0V2ZW50fSA9fiBteyBcQSAoIFdvcmtPcmRlclVwZGF0ZVBvc3QgfCBXb3JrT3JkZXJEZWxldGVQb3N0ICkgXHogfXhtcyApIHsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBXb3JrT3JkZXIgbnVtYmVycwogICAgICAgICMgdGhlIENoYW5nZUlEIGlzIGluIHRoZSBPbGRXb3JrT3JkZXJEYXRhIHNvIHdlIGRvIG5vdCBuZWVkIHRvIG1ha2UgYSBXb3JrT3JkZXJHZXQoKSBoZXJlCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X1dvcmtPcmRlck51bWJlckNhbGMoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtPbGRXb3JrT3JkZXJEYXRhfS0+e0NoYW5nZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGVycm9yCiAgICBlbHNlIHsKCiAgICAgICAgIyBhbiB1bmtub3duIGV2ZW50CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW17RXZlbnR9IGlzIGFuIHVua25vd24gZXZlbnQgZm9yIHRoaXMgZXZlbnRoYW5kbGVyISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfV29ya09yZGVyTnVtYmVyQ2FsYygpCgpUaGlzIG1ldGhvZCBhY3R1YWxseSByZWNhbGN1bGF0ZXMgdGhlIFdvcmtPcmRlck51bWJlcnMgZm9yIHRoZSB3b3Jrb3JkZXJzIG9mCnRoZSBnaXZlbiBjaGFuZ2UuCkl0IHJldHVybnMgMSBvbiBzdWNjZXNzLCBDPHVuZGVmPiBvdGhlcndpc2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkRXZlbnRPYmplY3QtPl9Xb3JrT3JkZXJOdW1iZXJDYWxjKAogICAgICAgIENoYW5nZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfV29ya09yZGVyTnVtYmVyQ2FsYyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZiAtIENoYW5nZUlEIGFuZCBVc2VySUQKICAgIGZvciBteSAkTmVlZGVkIChxdyhDaGFuZ2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB1c2UgV29ya09yZGVyU2VhcmNoOiBTZWFyY2ggZm9yIGdpdmVuIElEcywgb3JkZXJlZCBieToKICAgICMgQWN0dWFsU3RhcnRUaW1lLCBQbGFubmVkU3RhcnRUaW1lLCBBY3R1YWxFbmRUaW1lLCBQbGFubmVkRW5kVGltZSwgV29yT3JkZXJJRAogICAgbXkgJFNvcnRlZFdvcmtPcmRlcklEcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU2VhcmNoKAogICAgICAgIENoYW5nZUlEcyA9PiBbICRQYXJhbXtDaGFuZ2VJRH0gXSwKICAgICAgICBPcmRlckJ5ICAgPT4gWwogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZQogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZQogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZQogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklECiAgICAgICAgICAgICAgICApCiAgICAgICAgXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsKICAgICAgICAgICAgcXcoCiAgICAgICAgICAgICAgICBVcAogICAgICAgICAgICAgICAgVXAKICAgICAgICAgICAgICAgIERvd24KICAgICAgICAgICAgICAgIERvd24KICAgICAgICAgICAgICAgIFVwCiAgICAgICAgICAgICAgICApCiAgICAgICAgXSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgY291bnRlciAtIHVzZWQgYXMgV29ya09yZGVyTnVtYmVyCiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyB0byBzdG9yZSB0aGUgV29ya09yZGVySURzIGFuZCB0aGVpciBuZXcgV29ya09yZGVyTnVtYmVycwogICAgbXkgJU5ld1dvcmtPcmRlck51bWJlcjsKCiAgICAjIHNldCBuZXcgV29ya09yZGVyTnVtYmVyCiAgICBXT1JLT1JERVJJRDoKICAgIGZvciBteSAkV29ya09yZGVySUQgKCBAeyRTb3J0ZWRXb3JrT3JkZXJJRHN9ICkgewoKICAgICAgICAjIGluY3JlbWVudCBDb3VudGVyIHRvIGdldCBuZXcgV29ya09yZGVyTnVtYmVyCiAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgIyBnZXQgV29ya09yZGVyCiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIG9ubHkgd2hlbiBOdW1iZXIgY2hhbmdlZCAtIHRvIGF2b2lkIGluZmluaXQgbG9vcHMKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICRDb3VudGVyID09ICRXb3JrT3JkZXItPntXb3JrT3JkZXJOdW1iZXJ9OwoKICAgICAgICAjIHN0b3JlIHRoZSBuZXcgV29ya09yZGVyTnVtYmVyIGZvciB0aGlzIFdvcmtPcmRlcklECiAgICAgICAgJE5ld1dvcmtPcmRlck51bWJlcnskV29ya09yZGVySUR9ID0gJENvdW50ZXI7CiAgICB9CgogICAgIyB1cGRhdGUgdGhlIHdvcmtvcmRlcnMgdGhhdCBuZWVkIGEgbmV3IFdvcmtPcmRlck51bWJlcgogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIGtleXMgJU5ld1dvcmtPcmRlck51bWJlciApIHsKCiAgICAgICAgIyB1cGRhdGUgZWFjaCB3b3Jrb3JkZXIsIHByZXZlbnQgcmVjYWxjdWxhdGlvbiBvZiB0aGUgV29ya09yZGVyTnVtYmVyIGFnYWluCiAgICAgICAgbXkgJENvdWxkVXBkYXRlV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJVcGRhdGUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgIFdvcmtPcmRlck51bWJlciA9PiAkTmV3V29ya09yZGVyTnVtYmVyeyRXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgIE5vTnVtYmVyQ2FsYyAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjE0ICQgJERhdGU6IDIwMTAvMDUvMjEgMTg6NTM6MTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vQ0FCQ2hlY2sucG0gLSBDQUIgYmFzZWQgcGVybWlzc2lvbiBjaGVjawojIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ0FCQ2hlY2sucG0sdiAxLjggMjAwOS8xMS8xOSAxMzo0ODowNiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNBQkNoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q0FCQ2hlY2sgLSBDQUIgYmFzZWQgcGVybWlzc2lvbiBjaGVjawoKPWhlYWQxIFNZTk9QU0lTCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNBQkNoZWNrOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ2hlY2tPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q0FCQ2hlY2stPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlck9iamVjdCAgICAgICAgICAgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgR3JvdXBPYmplY3QgICAgICAgICAgPT4gJEdyb3VwT2JqZWN0LAogICAgICAgIFdvcmtPcmRlck9iamVjdCAgICAgID0+ICRXb3JrT3JkZXJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFdvcmtPcmRlck9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiBBY2Nlc3MgaXMgYWxsb3dlZCB3aGVuIHR5cGUgaXMgJ3JvJyBhbmQgdGhlIGFnZW50IGlzIGEgbWVtYmVyCm9mIHRoZSBDQUIgb2YgdGhlIGNoYW5nZSBvZiB0aGUgd29ya29yZGVyLgoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgICAgICA9PiAxMjMsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ3J3JywgICAgICMgJ3JvJyBvciAncncnCiAgICAgICAgV29ya09yZGVySUQgPT4gNDQ0NCwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlIFdvcmtPcmRlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvbmx5ICdybycgYWNjZXNzIG1pZ2h0IGJlIGdyYW50ZWQgYnkgdGhpcyBtb2R1bGUKICAgIHJldHVybiBpZiAkUGFyYW17VHlwZX0gbmUgJ3JvJzsKCiAgICAjIHRoZXJlIGFscmVhZHkgaXMgYSB3b3Jrb3JkZXIKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIG5vIHdvcmtvcmRlciB3YXMgZm91bmQKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlciB8fCAhJXskV29ya09yZGVyfSB8fCAhJFdvcmtPcmRlci0+e0NoYW5nZUlEfTsKCiAgICAjIGdldCB0aGUgQ0FCIG9mIHRoZSBjaGFuZ2UKICAgIG15ICRDQUIgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUNBQkdldCgKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgKTsKCiAgICAjIGxvb2sgZm9yIGEgQ0FCIG1lbWJlciB3aXRoIHRoZSByZWxldmFudCBVc2VySUQKICAgIG15ICgkRm91bmRDQUJNZW1iZXIpID0gZ3JlcCB7ICRfID09ICRQYXJhbXtVc2VySUR9IH0gQHsgJENBQi0+e0NBQkFnZW50c30gfTsKCiAgICAjIGFsbG93IGFjY2VzcyB0aGUgdGhlIGFnZW50IGlzIGEgQ0FCIG1lbWJlcgogICAgcmV0dXJuIDEgaWYgJEZvdW5kQ0FCTWVtYmVyOwoKICAgICMgZGVueSBhY2Nlc3Mgb3RoZXJ3aXNlCiAgICByZXR1cm47Cn0KCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1oZWFkMSBWRVJTSU9OCgokSWQ6IENBQkNoZWNrLnBtLHYgMS44IDIwMDkvMTEvMTkgMTM6NDg6MDYgYmVzIEV4cCAkCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vQ2hhbmdlQnVpbGRlckNoZWNrLnBtIC0gY2hhbmdlIGJ1aWxkZXIgYmFzZWQgcGVybWlzc2lvbiBjaGVjawojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ2hhbmdlQnVpbGRlckNoZWNrLnBtLHYgMS4xNCAyMDEwLzAxLzMwIDExOjIzOjMxIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q2hhbmdlQnVpbGRlckNoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNoYW5nZUJ1aWxkZXJDaGVjayAtIGNoYW5nZSBidWlsZGVyIGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VCdWlsZGVyQ2hlY2s7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVXNlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRHcm91cE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDaGVja09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VCdWlsZGVyQ2hlY2stPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlck9iamVjdCAgICAgICAgICAgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgR3JvdXBPYmplY3QgICAgICAgICAgPT4gJEdyb3VwT2JqZWN0LAogICAgICAgIFdvcmtPcmRlck9iamVjdCAgICAgID0+ICRXb3JrT3JkZXJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFdvcmtPcmRlck9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiAncm8nIGFuZCAncncnIGFjY2VzcyBpcyBncmFudGVkCndoZW4gdGhlIGFnZW50IGhhcyB0aGUgcHJpdiBpbiB0aGUgJ2l0c20tY2hhbmdlLWJ1aWxkZXInIGdyb3VwIGFuZAp3aGVuIHRoZSBhZ2VudCBpcyB0aGUgY2hhbmdlYnVpbGRlciBvZiB0aGUgY2hhbmdlLgoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgICAgICA9PiAxMjMsCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ3J3JywgICAgICMgJ3JvJyBvciAncncnCiAgICAgICAgV29ya09yZGVySUQgPT4gNDQ0NCwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlIFdvcmtPcmRlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgY2hlY2sgaXMgYmFzZWQgdXBvbiB0aGUgY2hhbmdlIGJ1aWxkZXIKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKCBHcm91cCA9PiAnaXRzbS1jaGFuZ2UtYnVpbGRlcicgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBncm91cCBpcyBub3QgZm91bmQKICAgIHJldHVybiBpZiAhJEdyb3VwSUQ7CgogICAgIyBDYWNoaW5nIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0LgogICAgbXkgJENhY2hlZCA9IGRlZmluZWQgJFBhcmFte0NhY2hlZH0gPyAkUGFyYW17Q2FjaGVkfSA6IDE7CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgIENhY2hlZCA9PiAkQ2FjaGVkLAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzIGlmIHRoZSBhZ2VudCBkb2Vzbid0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHR5cGUgaW4gdGhlIGFwcHJvcHJpYXRlIGdyb3VwCiAgICByZXR1cm4gaWYgISRHcm91cHN7JEdyb3VwSUR9OwoKICAgICMgdGhlcmUgYWxyZWFkeSBpcyBhIHdvcmtvcmRlci4gZS5nLiBBZ2VudElUU01Xb3JrT3JkZXJFZGl0CiAgICBteSAkV29ya09yZGVyID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte1dvcmtPcmRlcklEfSwKICAgICk7CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiBubyB3b3Jrb3JkZXIgd2FzIGZvdW5kCiAgICByZXR1cm4gaWYgISRXb3JrT3JkZXIgfHwgISV7JFdvcmtPcmRlcn0gfHwgISRXb3JrT3JkZXItPntDaGFuZ2VJRH07CgogICAgIyBmb3IgY2hlY2tpbmcgdGhlIGNoYW5nZSBidWlsZGVyLCB3ZSBuZWVkIGluZm9ybWF0aW9uIG9uIHRoZSBjaGFuZ2UKICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyLT57Q2hhbmdlSUR9LAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIG5vIGNoYW5nZSB3YXMgZm91bmQKICAgIHJldHVybiBpZiAhJENoYW5nZSB8fCAhJXskQ2hhbmdlfSB8fCAhJENoYW5nZS0+e0NoYW5nZUJ1aWxkZXJJRH07CgogICAgIyBhbGxvdyBhY2Nlc3MsIHdoZW4gdGhlIGFnZW50IGlzIHRoZSBjaGFuZ2UgYnVpbGRlciBvZiB0aGUgY2hhbmdlCiAgICByZXR1cm4gMSBpZiAkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfSA9PSAkUGFyYW17VXNlcklEfTsKCiAgICAjIGRlbnkgYWNjZXNzIG90aGVyd2lzZQogICAgcmV0dXJuOwp9Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJElkOiBDaGFuZ2VCdWlsZGVyQ2hlY2sucG0sdiAxLjE0IDIwMTAvMDEvMzAgMTE6MjM6MzEgYmVzIEV4cCAkCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vQ2hhbmdlTWFuYWdlckNoZWNrLnBtIC0gY2hhbmdlIG1hbmFnZXIgYmFzZWQgcGVybWlzc2lvbiBjaGVjawojIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ2hhbmdlTWFuYWdlckNoZWNrLnBtLHYgMS4xMiAyMDA5LzExLzE5IDEzOjQ4OjA2IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkNoYW5nZU1hbmFnZXJDaGVjayAtIGNoYW5nZSBtYW5hZ2VyIGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VNYW5hZ2VyQ2hlY2s7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkVXNlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRHcm91cE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwogICAgbXkgJFdvcmtPcmRlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDaGVja09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpDaGFuZ2VNYW5hZ2VyQ2hlY2stPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlck9iamVjdCAgICAgICAgICAgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgR3JvdXBPYmplY3QgICAgICAgICAgPT4gJEdyb3VwT2JqZWN0LAogICAgICAgIFdvcmtPcmRlck9iamVjdCAgICAgID0+ICRXb3JrT3JkZXJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFdvcmtPcmRlck9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKVGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2suICdybycgYW5kICdydycgYWNjZXNzIGlzIGdyYW50ZWQKd2hlbiB0aGUgYWdlbnQgaGFzIHRoZSBwcml2IGluIHRoZSAnaXRzbS1jaGFuZ2UtbWFuYWdlcicgZ3JvdXAuCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICAgICBUeXBlICAgICAgICA9PiAncncnLCAgICAgIyAncm8nIG9yICdydycKICAgICAgICBXb3JrT3JkZXJJRCA9PiA0NDQ0LAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFR5cGUgV29ya09yZGVySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSBjaGFuZ2UgbWFuYWdlcgogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIENhY2hpbmcgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICBteSAkQ2FjaGVkID0gZGVmaW5lZCAkUGFyYW17Q2FjaGVkfSA/ICRQYXJhbXtDYWNoZWR9IDogMTsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgQ2FjaGVkID0+ICRDYWNoZWQsCiAgICApOwoKICAgICMgYWxsb3cgcm8gYW5kIHJ3IGFjY2VzcyBpZiB0aGUgYWdlbnQgaXMgYSBjaGFuZ2UgbWFuYWdlcgogICAgcmV0dXJuIDEgaWYgJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBubyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGFnZW50IGlzIHRoZSBhY3R1YWwgbWFuYWdlciBvZiB0aGUgY2hhbmdlIG9mIHRoZSB3b3Jrb3JkZXIKCiAgICAjIGRlbnkgYWNjZXNzIG90aGVyd2lzZQogICAgcmV0dXJuOwp9Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJElkOiBDaGFuZ2VNYW5hZ2VyQ2hlY2sucG0sdiAxLjEyIDIwMDkvMTEvMTkgMTM6NDg6MDYgYmVzIEV4cCAkCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vRW1wdHlBZ2VudENoZWNrLnBtIC0gZ3JhbnQgcGVybWlzc2lvbiB3aGVuIGFnZW50IGlzIGVtcHR5CiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBFbXB0eUFnZW50Q2hlY2sucG0sdiAxLjIgMjAxMC8wMS8zMCAxMToyMzozMSBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkVtcHR5QWdlbnRDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkVtcHR5QWdlbnRDaGVjayAtIGdyYW50IHBlcm1pc3Npb24gd2hlbiBhZ2VudCBpcyBlbXB0eQoKPWhlYWQxIFNZTk9QU0lTCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkVtcHR5QWdlbnRDaGVjazsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRVc2VyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJEdyb3VwT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7CiAgICBteSAkV29ya09yZGVyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENoZWNrT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246OkVtcHR5QWdlbnRDaGVjay0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCAgICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgICAgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgICAgICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICAgICAgICAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBVc2VyT2JqZWN0ICAgICAgICAgICA9PiAkVXNlck9iamVjdCwKICAgICAgICBHcm91cE9iamVjdCAgICAgICAgICA9PiAkR3JvdXBPYmplY3QsCiAgICAgICAgV29ya09yZGVyT2JqZWN0ICAgICAgPT4gJFdvcmtPcmRlck9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFVzZXJPYmplY3QgR3JvdXBPYmplY3QgV29ya09yZGVyT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpUaGlzIG1ldGhvZCBkb2VzIHRoZSBjaGVjay4gJ3JvJyBhY2Nlc3MgaXMgZ3JhbnRlZCB3aGVuIHRoZSBhZ2VudCBpcyBhICdybycgbWVtYmVyCm9mIHRoZSAnaXRzbS1jaGFuZ2UnIGdyb3VwLiAncncnIGFjY2VzcyBpcyBncmFudGVkIHdoZW4gdGhlIHdvcmtvcmRlciBoYXMgbm8gYWdlbnQuCgogICAgbXkgJEhhc0FjY2VzcyA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICAgICBUeXBlICAgICAgICA9PiAncncnLCAgICAgIyAncm8nIG9yICdydycKICAgICAgICBXb3JrT3JkZXJJRCA9PiA0NDQ0LAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFR5cGUgV29ya09yZGVySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSB3b3Jrb3JkZXIgYWdlbnQKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKCBHcm91cCA9PiAnaXRzbS1jaGFuZ2UnICk7CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiB0aGUgZ3JvdXAgaXMgbm90IGZvdW5kCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgQ2FjaGluZyBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdC4KICAgIG15ICRDYWNoZWQgPSBkZWZpbmVkICRQYXJhbXtDYWNoZWR9ID8gJFBhcmFte0NhY2hlZH0gOiAxOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzLCB3aGVyZSB0aGUgdXNlciBoYXMgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZQogICAgbXkgJUdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgPT4gJENhY2hlZCwKICAgICk7CgogICAgIyBkZW55IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIHdvcmtvcmRlciBhZ2VudHMgYXJlIGdyYW50ZWQgcm8gYWNjZXNzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17VHlwZX0gZXEgJ3JvJzsKCiAgICAjIHRoZXJlIGFscmVhZHkgaXMgYSB3b3Jrb3JkZXIuIGUuZy4gQWdlbnRJVFNNV29ya09yZGVyRWRpdAogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFdvcmtPcmRlcklEID0+ICRQYXJhbXtXb3JrT3JkZXJJRH0sCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gbm8gd29ya29yZGVyIHdhcyBmb3VuZAogICAgcmV0dXJuIGlmICEkV29ya09yZGVyIHx8ICEleyRXb3JrT3JkZXJ9OwoKICAgICMgYWxsb3cgYWNjZXNzLCB3aGVuIHRoZXJlIGlzIG5vIHdvcmtvcmRlciBhZ2VudAogICAgcmV0dXJuIDEgaWYgISRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHdvcmtvcmRlciBhZ2VudCBpcyBlbXB0eQogICAgcmV0dXJuIGlmICEkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH07CgogICAgIyBkZW55IHJ3IGFjY2VzcyBvdGhlcndpc2UKICAgIHJldHVybjsKfQoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWhlYWQxIFZFUlNJT04KCiRJZDogRW1wdHlBZ2VudENoZWNrLnBtLHYgMS4yIDIwMTAvMDEvMzAgMTE6MjM6MzEgYmVzIEV4cCAkCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vTGlzdEFnZW50Q2hlY2sucG0gLSBncmFudCBwZXJtaXNzaW9uIHdoZW4gdGhlIGFnZW50IGlzIGluIGEgbGlzdAojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTGlzdEFnZW50Q2hlY2sucG0sdiAxLjMgMjAxMC8wMi8wMSAwOToyNzowNiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246Okxpc3RBZ2VudENoZWNrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6TGlzdEFnZW50Q2hlY2sgLSBncmFudCBwZXJtaXNzaW9uIHdoZW4gdGhlIGFnZW50IGlzIGluIGEgbGlzdAoKPWhlYWQxIFNZTk9QU0lTCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI6OlBlcm1pc3Npb246Okxpc3RBZ2VudENoZWNrOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ2hlY2tPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6TGlzdEFnZW50Q2hlY2stPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlck9iamVjdCAgICAgICAgICAgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgR3JvdXBPYmplY3QgICAgICAgICAgPT4gJEdyb3VwT2JqZWN0LAogICAgICAgIFdvcmtPcmRlck9iamVjdCAgICAgID0+ICRXb3JrT3JkZXJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFdvcmtPcmRlck9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKVGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2suICdybycgYWNjZXNzIGlzIGdyYW50ZWQgd2hlbiB0aGUgYWdlbnQgaXMgYSAncm8nIG1lbWJlcgpvZiB0aGUgJ2l0c20tY2hhbmdlJyBncm91cC4gJ3J3JyBhY2Nlc3MgaXMgZ3JhbnRlZCB3aGVuIHRoZSBjdXJyZW50IHdvcmtvcmRlciBhZ2VudAppcyBjb250YWluZWQgaW4gdGhlIGNvbmZpZ3VyZWQgbGlzdC4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIFdvcmtPcmRlcklEID0+IDQ0NDQsCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgVHlwZSBXb3JrT3JkZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgY2hlY2sgaXMgYmFzZWQgdXBvbiB0aGUgd29ya29yZGVyIGFnZW50CiAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCggR3JvdXAgPT4gJ2l0c20tY2hhbmdlJyApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIENhY2hpbmcgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICBteSAkQ2FjaGVkID0gZGVmaW5lZCAkUGFyYW17Q2FjaGVkfSA/ICRQYXJhbXtDYWNoZWR9IDogMTsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgQ2FjaGVkID0+ICRDYWNoZWQsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyB3b3Jrb3JkZXIgYWdlbnRzIGFyZSBncmFudGVkIHJvIGFjY2VzcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1R5cGV9IGVxICdybyc7CgogICAgIyB0aGVyZSBhbHJlYWR5IGlzIGEgd29ya29yZGVyLiBlLmcuIEFnZW50SVRTTVdvcmtPcmRlckVkaXQKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIG5vIHdvcmtvcmRlciB3YXMgZm91bmQKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlciB8fCAhJXskV29ya09yZGVyfTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHdvcmtvcmRlciBhZ2VudCBpcyBlbXB0eQogICAgcmV0dXJuIGlmICEkV29ya09yZGVyLT57V29ya09yZGVyQWdlbnRJRH07CgogICAgbXkgJFdvcmtPcmRlckFnZW50ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxvb2t1cCgKICAgICAgICBVc2VySUQgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9LAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIHRoZSBuYW1lIGNhbiBub3QgYmUgbG9va2VkIHVwCiAgICByZXR1cm4gaWYgISRXb3JrT3JkZXJBZ2VudDsKCiAgICAjIHRha2UgbGlzdCBvZiBzcGVjaWFsIGFnZW50cyBmcm9tIHRoZSBzeXNjb25maWcKICAgIG15ICRBZ2VudExpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6VGFrZVBlcm1pc3Npb246Okxpc3QnKTsKCiAgICAjIGFsbG93IGFjY2Vzcywgd2hlbiB0aGUgd29ya29yZGVyIGFnZW50IGlzIGluIHRoZSBsaXN0CiAgICByZXR1cm4gMSBpZiAkQWdlbnRMaXN0LT57JFdvcmtPcmRlckFnZW50fTsKCiAgICAjIGRlbnkgcncgYWNjZXNzIG90aGVyd2lzZQogICAgcmV0dXJuOwp9Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJElkOiBMaXN0QWdlbnRDaGVjay5wbSx2IDEuMyAyMDEwLzAyLzAxIDA5OjI3OjA2IGJlcyBFeHAgJAoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9JVFNNV29ya09yZGVyL1Blcm1pc3Npb24vV29ya09yZGVyQWdlbnRDaGVjay5wbSAtIHdvcmtvcmRlciBhZ2VudCBiYXNlZCBwZXJtaXNzaW9uIGNoZWNrCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBXb3JrT3JkZXJBZ2VudENoZWNrLnBtLHYgMS4xMyAyMDEwLzAxLzMwIDExOjIzOjMxIGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6V29ya09yZGVyQWdlbnRDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpXb3JrT3JkZXJBZ2VudENoZWNrIC0gd29ya29yZGVyIGFnZW50IGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOjpQZXJtaXNzaW9uOjpXb3JrT3JkZXJBZ2VudENoZWNrOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgIG15ICRXb3JrT3JkZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ2hlY2tPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjo6UGVybWlzc2lvbjo6V29ya09yZGVyQWdlbnRDaGVjay0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCAgICAgICAgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ICAgICAgICAgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgICAgICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICAgICAgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICAgICAgICAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICAgICAgICAgID0+ICREQk9iamVjdCwKICAgICAgICBVc2VyT2JqZWN0ICAgICAgICAgICA9PiAkVXNlck9iamVjdCwKICAgICAgICBHcm91cE9iamVjdCAgICAgICAgICA9PiAkR3JvdXBPYmplY3QsCiAgICAgICAgV29ya09yZGVyT2JqZWN0ICAgICAgPT4gJFdvcmtPcmRlck9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFVzZXJPYmplY3QgR3JvdXBPYmplY3QgV29ya09yZGVyT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFJ1bigpCgpUaGlzIG1ldGhvZCBkb2VzIHRoZSBjaGVjay4gJ3JvJyBhY2Nlc3MgaXMgZ3JhbnRlZCB3aGVuIHRoZSBhZ2VudCBpcyBhICdybycgbWVtYmVyCm9mIHRoZSAnaXRzbS1jaGFuZ2UnIGdyb3VwLiAncncnIGFjY2VzcyBpcyBncmFudGVkIHdoZW4gdGhlIGFnZW50IGlzIHRoZSB3b3Jrb3JkZXIgYWdlbnQKb2YgdGhlIHdvcmtvcmRlci4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIFdvcmtPcmRlcklEID0+IDQ0NDQsICAgICAjIG9wdGlvbmFsIGZvciBXb3JrT3JkZXJBZGQKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlIFdvcmtPcmRlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB0aGUgY2hlY2sgaXMgYmFzZWQgdXBvbiB0aGUgd29ya29yZGVyIGFnZW50CiAgICBteSAkR3JvdXBJRCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExvb2t1cCggR3JvdXAgPT4gJ2l0c20tY2hhbmdlJyApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIENhY2hpbmcgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICBteSAkQ2FjaGVkID0gZGVmaW5lZCAkUGFyYW17Q2FjaGVkfSA/ICRQYXJhbXtDYWNoZWR9IDogMTsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgQ2FjaGVkID0+ICRDYWNoZWQsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyB3b3Jrb3JkZXIgYWdlbnRzIGFyZSBncmFudGVkIHJvIGFjY2VzcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1R5cGV9IGVxICdybyc7CgogICAgIyB0aGVyZSBhbHJlYWR5IGlzIGEgd29ya29yZGVyLiBlLmcuIEFnZW50SVRTTVdvcmtPcmRlckVkaXQKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgKTsKCiAgICAjIGRlbnkgYWNjZXNzLCB3aGVuIG5vIHdvcmtvcmRlciB3YXMgZm91bmQKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlciB8fCAhJXskV29ya09yZGVyfSB8fCAhJFdvcmtPcmRlci0+e1dvcmtPcmRlckFnZW50SUR9OwoKICAgICMgYWxsb3cgYWNjZXNzLCB3aGVuIHRoZSBhZ2VudCBpcyB0aGUgd29ya29yZGVyIGFnZW50IG9mIHRoZSB3b3Jrb3JkZXIKICAgIHJldHVybiAxIGlmICRXb3JrT3JkZXItPntXb3JrT3JkZXJBZ2VudElEfSA9PSAkUGFyYW17VXNlcklEfTsKCiAgICAjIGRlbnkgcncgYWNjZXNzIG90aGVyd2lzZQogICAgcmV0dXJuOwp9Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJElkOiBXb3JrT3JkZXJBZ2VudENoZWNrLnBtLHYgMS4xMyAyMDEwLzAxLzMwIDExOjIzOjMxIGJlcyBFeHAgJAoKPWN1dAoKMTsK
IyAtLQojIElUU01DaGFuZ2UvTnVtYmVyL0RhdGUucG0gLSBhIGRhdGUgYmFzZWQgY2hhbmdlIG51bWJlciBnZW5lcmF0b3IKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGUucG0sdiAxLjEgMjAxMC8wNi8yOSAxMjo0MTozNiBzYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyBHZW5lcmF0ZXMgdGlja2V0IG51bWJlcnMgbGlrZSB5eXl5bW1kZHNzIyMjIyMgKGUuIGcuIDIwMDIwNjIzMDAwMDEpCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXI6OkRhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIENoYW5nZU51bWJlckNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBjb25maWcgb3B0aW9ucwogICAgbXkgJENvdW50ZXJMb2cgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6Q291bnRlckxvZycpOwoKICAgICMgZGVmaW5lIG51bWJlciBvZiBtYXhpbXVtIGxvb3BzIGlmIGNyZWF0ZWQgY2hhbmdlIG51bWJlciBleGlzdHMKICAgIG15ICRNYXhSZXRyeU51bWJlciAgICAgICAgPSAxNjAwMDsKICAgIG15ICRMb29wUHJvdGVjdGlvbkNvdW50ZXIgPSAwOwoKICAgICMgdHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZSBjaGFuZ2UgbnVtYmVyIGZvciB1cCB0byAkTWF4UmV0cnlOdW1iZXIgdGltZXMKICAgIHdoaWxlICggJExvb3BQcm90ZWN0aW9uQ291bnRlciA8PSAkTWF4UmV0cnlOdW1iZXIgKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgdGltZQogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKCiAgICAgICAgIyByZWFkIGNvdW50CiAgICAgICAgbXkgJENvdW50ICAgICAgPSAwOwogICAgICAgIG15ICRMYXN0TW9kaWZ5ID0gJyc7CiAgICAgICAgaWYgKCAtZiAkQ291bnRlckxvZyApIHsKICAgICAgICAgICAgbXkgJENvbnRlbnRTQ0FMQVJSZWYgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgICAgIExvY2F0aW9uID0+ICRDb3VudGVyTG9nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDb250ZW50U0NBTEFSUmVmICYmICR7JENvbnRlbnRTQ0FMQVJSZWZ9ICkgewogICAgICAgICAgICAgICAgKCAkQ291bnQsICRMYXN0TW9kaWZ5ICkgPSBzcGxpdCggLzsvLCAkeyRDb250ZW50U0NBTEFSUmVmfSApOwoKICAgICAgICAgICAgICAgICMganVzdCBkZWJ1ZwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWFkIGNvdW50ZXIgZnJvbSAkQ291bnRlckxvZzogJENvdW50IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNvdW50ZXIKICAgICAgICBpZiAoICEkTGFzdE1vZGlmeSB8fCAkTGFzdE1vZGlmeSBuZSAiJFllYXItJE1vbnRoLSREYXkiICkgewogICAgICAgICAgICAkQ291bnQgPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBjb3VudCBhdXRvIGluY3JlbWVudAogICAgICAgICRDb3VudCsrOwoKICAgICAgICAjIGluY3JlYXNlIHRoZSB0aGUgY291bnRlciBmYXN0ZXIgaWYgd2UgYXJlIGluIGxvb3AgcHJldGVjdGlvbiBtb2RlCiAgICAgICAgJENvdW50ICs9ICRMb29wUHJvdGVjdGlvbkNvdW50ZXI7CgogICAgICAgIG15ICRDb250ZW50ID0gJENvdW50IC4gIjskWWVhci0kTW9udGgtJERheTsiOwoKICAgICAgICAjIHdyaXRlIG5ldyBjb3VudAogICAgICAgIG15ICRXcml0ZSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVXcml0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJENvdW50ZXJMb2csCiAgICAgICAgICAgIENvbnRlbnQgID0+IFwkQ29udGVudCwKICAgICAgICApOwogICAgICAgIGlmICgkV3JpdGUpIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXcml0ZSBjb3VudGVyOiAkQ291bnQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwYWQgY2hhbmdlIG51bWJlciB3aXRoIGxlYWRpbmcgJzAnIHRvIGxlbmd0aCA1CiAgICAgICAgJENvdW50ID0gc3ByaW50ZiAiJTA1ZCIsICRDb3VudDsKCiAgICAgICAgIyBjcmVhdGUgbmV3IGNoYW5nZSBudW1iZXIKICAgICAgICBteSAkQ2hhbmdlTnVtYmVyID0gJFllYXIgLiAkTW9udGggLiAkRGF5IC4gJENvdW50OwoKICAgICAgICAjIGxvb2t1cCBpZiBjaGFuZ2UgbnVtYmVyIGV4aXN0cyBhbHJlYWR5CiAgICAgICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPkNoYW5nZUxvb2t1cCgKICAgICAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICRDaGFuZ2VOdW1iZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyBub3cgd2UgaGF2ZSBhIG5ldyB1bnVzZWQgY2hhbmdlIG51bWJlciBhbmQgcmV0dXJuIGl0CiAgICAgICAgcmV0dXJuICRDaGFuZ2VOdW1iZXIgaWYgISRDaGFuZ2VJRDsKCiAgICAgICAgIyBzdGFydCBsb29wIHByb3RlY3Rpb24gbW9kZQogICAgICAgICRMb29wUHJvdGVjdGlvbkNvdW50ZXIrKzsKCiAgICAgICAgIyBjcmVhdGUgbmV3IGNoYW5nZSBudW1iZXIgYWdhaW4KICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDaGFuZ2VOdW1iZXIgKCRDaGFuZ2VOdW1iZXIpIGV4aXN0cyEgQ3JlYXRpbmcgYSBuZXcgb25lLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvb3Agd2FzIHJ1bm5pbmcgdG9vIGxvbmcKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gIkxvb3BQcm90ZWN0aW9uQ291bnRlciBpcyBub3cgJExvb3BQcm90ZWN0aW9uQ291bnRlciEiCiAgICAgICAgICAgIC4gIiBTdG9wcGVkIENoYW5nZU51bWJlckNyZWF0ZSgpISIsCiAgICApOwogICAgcmV0dXJuOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAxMC8wNi8yOSAxMjo0MTozNiAkCgo9Y3V0Cg==
IyAtLQojIElUU01DaGFuZ2UvTnVtYmVyL0RhdGVDaGVja3N1bS5wbSAtIGEgZGF0ZSBiYXNlZCBjaGFuZ2UgbnVtYmVyIGdlbmVyYXRvcgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGF0ZUNoZWNrc3VtLnBtLHYgMS4xIDIwMTAvMDYvMjkgMTI6NDE6MzYgc2IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgTm90ZToKIyBhdmFpbGFibGUgb2JqZWN0cyBhcmU6IENvbmZpZ09iamVjdCwgTG9nT2JqZWN0IGFuZCBEQk9iamVjdAojCiMgVGhlIGFsZ29yaXRobSB0byBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGlzIGRlcml2ZWQgZnJvbSB0aGUgb25lCiMgRGV1dHNjaGUgQnVuZGVzYmFobiAoZ2VybWFuIHJhaWx3YXkgY29tcGFueSkgdXNlcyBmb3IgY2FsY3VsYXRpb24KIyBvZiB0aGUgY2hlY2sgZGlnaXQgb2YgdGhlaXIgdmVoaWtlbCBudW1iZXJpbmcuCiMgVGhlIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgYnkgYWx0ZXJuYXRlbHkgbXVsdGlwbHlpbmcgdGhlIGRpZ2l0cwojIHdpdGggMSBhbmQgMiBhbmQgYWRkaW5nIHRoZSByZXN1bHN0cyBmcm9tIGxlZnQgdG8gcmlnaHQgb2YgdGhlCiMgdmVoaWtlbCBudW1iZXIuIFRoZSBtb2R1bHVzIHRvIDEwIG9mIHRoaXMgc3VtIGlzIHN1YnN0cmFjdGVkIGZyb20KIyAxMC4gU2VlOiBodHRwOi8vd3d3LnBydWVmemlmZmVybmJlcmVjaG51bmcuZGUvRi9GYWhyemV1Z251bW1lci5zaHRtbAojIChnZXJtYW4pCiMKIyBHZW5lcmF0ZXMgdGlja2V0IG51bWJlcnMgbGlrZSB5eXl5bW1kZHNzSUQjIyMjI0MgKGUuIGcuIDIwMDIwNjIzMTAxMDAwMTEpCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpOdW1iZXI6OkRhdGVDaGVja3N1bTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgQ2hhbmdlTnVtYmVyQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIGNvbmZpZyBvcHRpb25zCiAgICBteSAkQ291bnRlckxvZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpDb3VudGVyTG9nJyk7CiAgICBteSAkU3lzdGVtSUQgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTeXN0ZW1JRCcpOwoKICAgICMgZGVmaW5lIG51bWJlciBvZiBtYXhpbXVtIGxvb3BzIGlmIGNyZWF0ZWQgY2hhbmdlIG51bWJlciBleGlzdHMKICAgIG15ICRNYXhSZXRyeU51bWJlciAgICAgICAgPSAxNjAwMDsKICAgIG15ICRMb29wUHJvdGVjdGlvbkNvdW50ZXIgPSAwOwoKICAgICMgdHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZSBjaGFuZ2UgbnVtYmVyIGZvciB1cCB0byAkTWF4UmV0cnlOdW1iZXIgdGltZXMKICAgIHdoaWxlICggJExvb3BQcm90ZWN0aW9uQ291bnRlciA8PSAkTWF4UmV0cnlOdW1iZXIgKSB7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgdGltZQogICAgICAgIG15ICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKCiAgICAgICAgIyByZWFkIGNvdW50CiAgICAgICAgbXkgJENvdW50ICAgICAgPSAwOwogICAgICAgIG15ICRMYXN0TW9kaWZ5ID0gJyc7CiAgICAgICAgaWYgKCAtZiAkQ291bnRlckxvZyApIHsKICAgICAgICAgICAgbXkgJENvbnRlbnRTQ0FMQVJSZWYgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgICAgIExvY2F0aW9uID0+ICRDb3VudGVyTG9nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDb250ZW50U0NBTEFSUmVmICYmICR7JENvbnRlbnRTQ0FMQVJSZWZ9ICkgewogICAgICAgICAgICAgICAgKCAkQ291bnQsICRMYXN0TW9kaWZ5ICkgPSBzcGxpdCggLzsvLCAkeyRDb250ZW50U0NBTEFSUmVmfSApOwoKICAgICAgICAgICAgICAgICMganVzdCBkZWJ1ZwogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWFkIGNvdW50ZXIgZnJvbSAkQ291bnRlckxvZzogJENvdW50IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNvdW50ZXIKICAgICAgICBpZiAoICEkTGFzdE1vZGlmeSB8fCAkTGFzdE1vZGlmeSBuZSAiJFllYXItJE1vbnRoLSREYXkiICkgewogICAgICAgICAgICAkQ291bnQgPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBjb3VudCBhdXRvIGluY3JlbWVudAogICAgICAgICRDb3VudCsrOwoKICAgICAgICAjIGluY3JlYXNlIHRoZSB0aGUgY291bnRlciBmYXN0ZXIgaWYgd2UgYXJlIGluIGxvb3AgcHJldGVjdGlvbiBtb2RlCiAgICAgICAgJENvdW50ICs9ICRMb29wUHJvdGVjdGlvbkNvdW50ZXI7CgogICAgICAgIG15ICRDb250ZW50ID0gJENvdW50IC4gIjskWWVhci0kTW9udGgtJERheTsiOwoKICAgICAgICAjIHdyaXRlIG5ldyBjb3VudAogICAgICAgIG15ICRXcml0ZSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVXcml0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJENvdW50ZXJMb2csCiAgICAgICAgICAgIENvbnRlbnQgID0+IFwkQ29udGVudCwKICAgICAgICApOwogICAgICAgIGlmICgkV3JpdGUpIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXcml0ZSBjb3VudGVyOiAkQ291bnQiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwYWQgY2hhbmdlIG51bWJlciB3aXRoIGxlYWRpbmcgJzAnIHRvIGxlbmd0aCA1CiAgICAgICAgJENvdW50ID0gc3ByaW50ZiAiJTA1ZCIsICRDb3VudDsKCiAgICAgICAgIyBjcmVhdGUgbmV3IGNoYW5nZSBudW1iZXIKICAgICAgICBteSAkQ2hhbmdlTnVtYmVyID0gJFllYXIgLiAkTW9udGggLiAkRGF5IC4gJFN5c3RlbUlEIC4gJENvdW50OwoKICAgICAgICAjIGNhbGN1bGF0ZSBhIGNoZWNrc3VtCiAgICAgICAgbXkgJENoa1N1bSA9IDA7CiAgICAgICAgbXkgJE11bHQgICA9IDE7CiAgICAgICAgZm9yICggbXkgJGkgPSAwOyAkaSA8IGxlbmd0aCgkQ2hhbmdlTnVtYmVyKTsgKyskaSApIHsKICAgICAgICAgICAgbXkgJERpZ2l0ID0gc3Vic3RyKCAkQ2hhbmdlTnVtYmVyLCAkaSwgMSApOwogICAgICAgICAgICAkQ2hrU3VtID0gJENoa1N1bSArICggJE11bHQgKiAkRGlnaXQgKTsKICAgICAgICAgICAgJE11bHQgKz0gMTsKICAgICAgICAgICAgaWYgKCAkTXVsdCA9PSAzICkgewogICAgICAgICAgICAgICAgJE11bHQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRDaGtTdW0gJT0gMTA7CiAgICAgICAgJENoa1N1bSA9IDEwIC0gJENoa1N1bTsKICAgICAgICBpZiAoICRDaGtTdW0gPT0gMTAgKSB7CiAgICAgICAgICAgICRDaGtTdW0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgY2hlY2tzdW0gdG8gY2hhbmdlIG51bWJlcgogICAgICAgICRDaGFuZ2VOdW1iZXIgLj0gJENoa1N1bTsKCiAgICAgICAgIyBsb29rdXAgaWYgY2hhbmdlIG51bWJlciBleGlzdHMgYWxyZWFkeQogICAgICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT5DaGFuZ2VMb29rdXAoCiAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAkQ2hhbmdlTnVtYmVyLAogICAgICAgICk7CgogICAgICAgICMgbm93IHdlIGhhdmUgYSBuZXcgdW51c2VkIGNoYW5nZSBudW1iZXIgYW5kIHJldHVybiBpdAogICAgICAgIHJldHVybiAkQ2hhbmdlTnVtYmVyIGlmICEkQ2hhbmdlSUQ7CgogICAgICAgICMgc3RhcnQgbG9vcCBwcm90ZWN0aW9uIG1vZGUKICAgICAgICAkTG9vcFByb3RlY3Rpb25Db3VudGVyKys7CgogICAgICAgICMgY3JlYXRlIG5ldyBjaGFuZ2UgbnVtYmVyIGFnYWluCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2hhbmdlTnVtYmVyICgkQ2hhbmdlTnVtYmVyKSBleGlzdHMhIENyZWF0aW5nIGEgbmV3IG9uZS4iLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb29wIHdhcyBydW5uaW5nIHRvbyBsb25nCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJMb29wUHJvdGVjdGlvbkNvdW50ZXIgaXMgbm93ICRMb29wUHJvdGVjdGlvbkNvdW50ZXIhIgogICAgICAgICAgICAuICIgU3RvcHBlZCBDaGFuZ2VOdW1iZXJDcmVhdGUoKSEiLAogICAgKTsKICAgIHJldHVybjsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMTAvMDYvMjkgMTI6NDE6MzYgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NBQkNoZWNrLnBtIC0gQ0FCIGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENBQkNoZWNrLnBtLHYgMS42IDIwMDkvMTEvMTkgMTM6NDg6MDYgYmVzIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDQUJDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNBQkNoZWNrIC0gQ0FCIGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDQUJDaGVjazsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRVc2VyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJEdyb3VwT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7CiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENoZWNrT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNBQkNoZWNrLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgICAgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgICAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgICAgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFVzZXJPYmplY3QgICAgICAgICAgID0+ICRVc2VyT2JqZWN0LAogICAgICAgIEdyb3VwT2JqZWN0ICAgICAgICAgID0+ICRHcm91cE9iamVjdCwKICAgICAgICBDaGFuZ2VPYmplY3QgICAgICAgICA9PiAkQ2hhbmdlT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgVXNlck9iamVjdCBHcm91cE9iamVjdCBDaGFuZ2VPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiBBY2Nlc3MgaXMgYWxsb3dlZCB3aGVuIHR5cGUgaXMgJ3JvJyBhbmQgdGhlIGFnZW50IGlzIGEgbWVtYmVyCm9mIHRoZSBDQUIgb2YgdGhlIGNoYW5nZS4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIENoYW5nZUlEID0+IDMzMzMsICAgICAjIG9wdGlvbmFsIGZvciBDaGFuZ2VBZGQKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvbmx5ICdybycgYWNjZXNzIG1pZ2h0IGJlIGdyYW50ZWQgYnkgdGhpcyBtb2R1bGUKICAgIHJldHVybiBpZiAkUGFyYW17VHlwZX0gbmUgJ3JvJzsKCiAgICAjIGRlbnkgYWNjZXNzIHdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlLCBhbmQgdGh1cyBubyBDQUIKICAgIHJldHVybiBpZiAhJFBhcmFte0NoYW5nZUlEfTsKCiAgICAjIGdldCB0aGUgQ0FCIG9mIHRoZSBjaGFuZ2UKICAgIG15ICRDQUIgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUNBQkdldCgKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKCiAgICAjIGxvb2sgZm9yIGEgQ0FCIG1lbWJlciB3aXRoIHRoZSByZWxldmFudCBVc2VySUQKICAgIG15ICgkRm91bmRDQUJNZW1iZXIpID0gZ3JlcCB7ICRfID09ICRQYXJhbXtVc2VySUR9IH0gQHsgJENBQi0+e0NBQkFnZW50c30gfTsKCiAgICAjIGFsbG93IGFjY2VzcyB0aGUgdGhlIGFnZW50IGlzIGEgQ0FCIG1lbWJlcgogICAgcmV0dXJuIDEgaWYgJEZvdW5kQ0FCTWVtYmVyOwoKICAgICMgZGVueSBhY2Nlc3Mgb3RoZXJ3aXNlCiAgICByZXR1cm47Cn0KCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1oZWFkMSBWRVJTSU9OCgokSWQ6IENBQkNoZWNrLnBtLHYgMS42IDIwMDkvMTEvMTkgMTM6NDg6MDYgYmVzIEV4cCAkCgo9Y3V0CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NoYW5nZUFnZW50Q2hlY2sucG0gLSBjaGFuZ2UgYWdlbnQgYmFzZWQgcGVybWlzc2lvbiBjaGVjawojIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ2hhbmdlQWdlbnRDaGVjay5wbSx2IDEuMTUgMjAwOS8xMS8xOSAxMzo0ODowNiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUFnZW50Q2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE1ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlQWdlbnRDaGVjayAtIGNoYW5nZSBhZ2VudCBiYXNlZCBwZXJtaXNzaW9uIGNoZWNrCgo9aGVhZDEgU1lOT1BTSVMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlQWdlbnRDaGVjazsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRVc2VyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJEdyb3VwT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7CiAgICBteSAkQ2hhbmdlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENoZWNrT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUFnZW50Q2hlY2stPm5ldygKICAgICAgICBDb25maWdPYmplY3QgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgICAgICAgID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICAgICAgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgICAgICAgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgICAgICAgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgICAgICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVXNlck9iamVjdCAgICAgICAgICAgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgR3JvdXBPYmplY3QgICAgICAgICAgPT4gJEdyb3VwT2JqZWN0LAogICAgICAgIENoYW5nZU9iamVjdCAgICAgICAgID0+ICRDaGFuZ2VPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IENoYW5nZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSdW4oKQoKVGhpcyBtZXRob2QgZG9lcyB0aGUgY2hlY2suICdybycgYWNjZXNzIGlzIGFsbG93ZWQgd2hlbiB0aGUgYWdlbnQgaXMgYSAncm8nIG1lbWJlcgpvZiB0aGUgJ2l0c20tY2hhbmdlJyBncm91cC4KCiAgICBteSAkSGFzQWNjZXNzID0gJENoZWNrT2JqZWN0LT5SdW4oCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgICAgIFR5cGUgICAgID0+ICdydycsICAgICAjICdybycgb3IgJ3J3JwogICAgICAgIENoYW5nZUlEID0+IDMzMzMsICAgICAjIG9wdGlvbmFsIGZvciBDaGFuZ2VBZGQKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvbmx5ICdybycgYWNjZXNzIG1pZ2h0IGJlIGdyYW50ZWQgYnkgdGhpcyBtb2R1bGUKICAgIHJldHVybiBpZiAkUGFyYW17VHlwZX0gbmUgJ3JvJzsKCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSBjaGFuZ2UgYWdlbnQKICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKCBHcm91cCA9PiAnaXRzbS1jaGFuZ2UnICk7CgogICAgIyBkZW55IGFjY2Vzcywgd2hlbiB0aGUgZ3JvdXAgaXMgbm90IGZvdW5kCiAgICByZXR1cm4gaWYgISRHcm91cElEOwoKICAgICMgQ2FjaGluZyBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdC4KICAgIG15ICRDYWNoZWQgPSBkZWZpbmVkICRQYXJhbXtDYWNoZWR9ID8gJFBhcmFte0NhY2hlZH0gOiAxOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzLCB3aGVyZSB0aGUgdXNlciBoYXMgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZQogICAgbXkgJUdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgPT4gJENhY2hlZCwKICAgICk7CgogICAgIyBkZW55IGFjY2VzcyBpZiB0aGUgYWdlbnQgZG9lc24ndCBoYXZlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHRoZSBhcHByb3ByaWF0ZSBncm91cAogICAgcmV0dXJuIGlmICEkR3JvdXBzeyRHcm91cElEfTsKCiAgICAjIGNoYW5nZSBhZ2VudHMgYXJlIGdyYW50ZWQgcm8gYWNjZXNzCiAgICByZXR1cm4gMTsKfQoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWhlYWQxIFZFUlNJT04KCiRJZDogQ2hhbmdlQWdlbnRDaGVjay5wbSx2IDEuMTUgMjAwOS8xMS8xOSAxMzo0ODowNiBiZXMgRXhwICQKCj1jdXQKCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NoYW5nZUJ1aWxkZXJDaGVjay5wbSAtIGNoYW5nZSBidWlsZGVyIGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENoYW5nZUJ1aWxkZXJDaGVjay5wbSx2IDEuMTYgMjAxMC8wMS8zMCAxMToyMzozMSBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZUJ1aWxkZXJDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDaGFuZ2VCdWlsZGVyQ2hlY2sgLSBjaGFuZ2UgYnVpbGRlciBiYXNlZCBwZXJtaXNzaW9uIGNoZWNrCgo9aGVhZDEgU1lOT1BTSVMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlQnVpbGRlckNoZWNrOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgIG15ICRDaGFuZ2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ2hlY2tPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlQnVpbGRlckNoZWNrLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgICAgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgICAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgICAgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFVzZXJPYmplY3QgICAgICAgICAgID0+ICRVc2VyT2JqZWN0LAogICAgICAgIEdyb3VwT2JqZWN0ICAgICAgICAgID0+ICRHcm91cE9iamVjdCwKICAgICAgICBDaGFuZ2VPYmplY3QgICAgICAgICA9PiAkQ2hhbmdlT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgVXNlck9iamVjdCBHcm91cE9iamVjdCBDaGFuZ2VPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiBXaGVuIG5vIENoYW5nZUlEIGlzIHBhc3NlZCwgdGhhbiAncm8nIGFuZCAncncnIGFjY2VzcyBpcyBncmFudGVkCndoZW4gdGhlIGFnZW50IGhhcyB0aGUgcHJpdiBpbiB0aGUgJ2l0c20tY2hhbmdlLWJ1aWxkZXInIGdyb3VwLgpXaGVuIHRoZSBDaGFuZ2VJRCB3YXMgcGFzc2VkLCB0aGFuIHRoZSBhZ2VudCBtdXN0IGFkZGl0aW9uYWxseSBiZSB0aGUgY2hhbmdlYnVpbGRlciBvZiB0aGUgY2hhbmdlLgoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICAgICAgVHlwZSAgICAgPT4gJ3J3JywgICAgICMgJ3JvJyBvciAncncnCiAgICAgICAgQ2hhbmdlSUQgPT4gMzMzMywgICAgICMgb3B0aW9uYWwgZm9yIENoYW5nZUFkZAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSBjaGFuZ2UgYnVpbGRlcgogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICdpdHNtLWNoYW5nZS1idWlsZGVyJyApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIENhY2hpbmcgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICBteSAkQ2FjaGVkID0gZGVmaW5lZCAkUGFyYW17Q2FjaGVkfSA/ICRQYXJhbXtDYWNoZWR9IDogMTsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgQ2FjaGVkID0+ICRDYWNoZWQsCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MgaWYgdGhlIGFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbiB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAKICAgIHJldHVybiBpZiAhJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBBbGxvdyBhIGNoYW5nZSBidWlsZGVyIHRvIGNyZWF0ZSBhIGNoYW5nZSwgd2hlbiB0aGVyZSBpc24ndCBhIGNoYW5nZSB5ZXQuCiAgICByZXR1cm4gMSBpZiAhJFBhcmFte0NoYW5nZUlEfTsKCiAgICAjIHRoZXJlIGFscmVhZHkgaXMgYSBjaGFuZ2UuIGUuZy4gQWdlbnRJVFNNQ2hhbmdlRWRpdAogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gbm8gY2hhbmdlIHdhcyBmb3VuZAogICAgcmV0dXJuIGlmICEkQ2hhbmdlIHx8ICEleyRDaGFuZ2V9IHx8ICEkQ2hhbmdlLT57Q2hhbmdlQnVpbGRlcklEfTsKCiAgICAjIGFsbG93IGFjY2Vzcywgd2hlbiB0aGUgYWdlbnQgaXMgdGhlIGNoYW5nZSBidWlsZGVyIG9mIHRoZSBjaGFuZ2UKICAgIHJldHVybiAxIGlmICRDaGFuZ2UtPntDaGFuZ2VCdWlsZGVySUR9ID09ICRQYXJhbXtVc2VySUR9OwoKICAgICMgZGVueSBhY2Nlc3Mgb3RoZXJ3aXNlCiAgICByZXR1cm47Cn0KCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1oZWFkMSBWRVJTSU9OCgokSWQ6IENoYW5nZUJ1aWxkZXJDaGVjay5wbSx2IDEuMTYgMjAxMC8wMS8zMCAxMToyMzozMSBiZXMgRXhwICQKCj1jdXQKCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9QZXJtaXNzaW9uL0NoYW5nZU1hbmFnZXJDaGVjay5wbSAtIGNoYW5nZSBtYW5hZ2VyIGJhc2VkIHBlcm1pc3Npb24gY2hlY2sKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENoYW5nZU1hbmFnZXJDaGVjay5wbSx2IDEuMTQgMjAwOS8xMS8xOSAxMzo0ODowNiBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlBlcm1pc3Npb246OkNoYW5nZU1hbmFnZXJDaGVjazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpQZXJtaXNzaW9uOjpDaGFuZ2VNYW5hZ2VyQ2hlY2sgLSBjaGFuZ2UgbWFuYWdlciBiYXNlZCBwZXJtaXNzaW9uIGNoZWNrCgo9aGVhZDEgU1lOT1BTSVMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgIG15ICRDaGFuZ2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ2hlY2tPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6UGVybWlzc2lvbjo6Q2hhbmdlTWFuYWdlckNoZWNrLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgICAgICAgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgICAgICAgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgICAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgICAgICAgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgICAgICAgICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFVzZXJPYmplY3QgICAgICAgICAgID0+ICRVc2VyT2JqZWN0LAogICAgICAgIEdyb3VwT2JqZWN0ICAgICAgICAgID0+ICRHcm91cE9iamVjdCwKICAgICAgICBDaGFuZ2VPYmplY3QgICAgICAgICA9PiAkQ2hhbmdlT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgVXNlck9iamVjdCBHcm91cE9iamVjdCBDaGFuZ2VPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKClRoaXMgbWV0aG9kIGRvZXMgdGhlIGNoZWNrLiAncm8nIGFuZCAncncnIGFjY2VzcyBpcyBncmFudGVkCndoZW4gdGhlIGFnZW50IGhhcyB0aGUgcHJpdiBpbiB0aGUgJ2l0c20tY2hhbmdlLW1hbmFnZXInIGdyb3VwLgoKICAgIG15ICRIYXNBY2Nlc3MgPSAkQ2hlY2tPYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICAgICAgVHlwZSAgICAgPT4gJ3J3JywgICAgICMgJ3JvJyBvciAncncnCiAgICAgICAgQ2hhbmdlSUQgPT4gMzMzMywgICAgICMgb3B0aW9uYWwgZm9yIENoYW5nZUFkZAogICAgKTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIFR5cGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRoZSBjaGVjayBpcyBiYXNlZCB1cG9uIHRoZSBjaGFuZ2UgbWFuYWdlcgogICAgbXkgJEdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoIEdyb3VwID0+ICdpdHNtLWNoYW5nZS1tYW5hZ2VyJyApOwoKICAgICMgZGVueSBhY2Nlc3MsIHdoZW4gdGhlIGdyb3VwIGlzIG5vdCBmb3VuZAogICAgcmV0dXJuIGlmICEkR3JvdXBJRDsKCiAgICAjIENhY2hpbmcgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICBteSAkQ2FjaGVkID0gZGVmaW5lZCAkUGFyYW17Q2FjaGVkfSA/ICRQYXJhbXtDYWNoZWR9IDogMTsKCiAgICAjIGdldCB1c2VyIGdyb3Vwcywgd2hlcmUgdGhlIHVzZXIgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgQ2FjaGVkID0+ICRDYWNoZWQsCiAgICApOwoKICAgICMgYWxsb3cgcm8gYW5kIHJ3IGFjY2VzcyBpZiB0aGUgYWdlbnQgaXMgYSBjaGFuZ2UgbWFuYWdlcgogICAgcmV0dXJuIDEgaWYgJEdyb3Vwc3skR3JvdXBJRH07CgogICAgIyBubyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGFnZW50IGlzIHRoZSBhY3R1YWwgbWFuYWdlciBvZiB0aGUgY2hhbmdlCgogICAgIyBkZW55IGFjY2VzcyBvdGhlcndpc2UKICAgIHJldHVybjsKfQoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWhlYWQxIFZFUlNJT04KCiRJZDogQ2hhbmdlTWFuYWdlckNoZWNrLnBtLHYgMS4xNCAyMDA5LzExLzE5IDEzOjQ4OjA2IGJlcyBFeHAgJAoKPWN1dAoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9DQUIucG0gLSBhbGwgdGVtcGxhdGUgZnVuY3Rpb25zIGZvciBDQUJzCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBDQUIucG0sdiAxLjIgMjAxMC8wMi8wOSAxNToyNDo0NCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpDQUI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIERhdGE6OkR1bXBlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpDQUIgLSBhbGwgdGVtcGxhdGUgZnVuY3Rpb25zIGZvciBDQUIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3IgQ0FCIHRlbXBsYXRlcyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6Q0FCOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OlRlbXBsYXRlOjpDQUItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWJ1ZyBmbGFnCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFNlcmlhbGl6ZSgpCgpTZXJpYWxpemUgdGhlIENBQiBvZiBhIGNoYW5nZS4gVGhpcyBpcyBkb25lIHdpdGggRGF0YTo6RHVtcGVyLiBJdCByZXR1cm5zCmEgc2VyaWFsaXplZCBzdHJpbmcgb2YgdGhlIGRhdGFzdHJ1Y3R1cmUuIFRoZSBDQUIgYWN0aW9ucwphcmUgIndyYXBwZWQiIHdpdGhpbiBhIGhhc2hyZWZlcmVuY2UuLi4KCiAgICBteSAkVGVtcGxhdGVTdHJpbmcgPSAkVGVtcGxhdGVPYmplY3QtPlNlcmlhbGl6ZSgKICAgICAgICBDaGFuZ2VJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgUmV0dXJuICAgPT4gJ0hBU0gnLCAjIChvcHRpb25hbCkgSEFTSHxTVFJJTkcgZGVmYXVsdCAnU1RSSU5HJwogICAgKTsKCnJldHVybnMKCiAgICAne0NBQkFkZCA9PiB7IENBQkN1c3RvbWVycyA9PiBbICdtbUBsb2NhbGhvc3QnIF0sIC4uLiB9fScKCklmIHBhcmFtZXRlciBDPFJldHVybj4gaXMgc2V0IHRvIEM8SEFTSD4sIHRoZSBQZXJsIGRhdGFzdHJ1Y3R1cmUKaXMgcmV0dXJuZWQKCiAgICB7CiAgICAgICAgQ0FCQWRkICAgPT4geyAuLi4gfSwKICAgICAgICBDaGlsZHJlbiA9PiBbIC4uLiBdLAogICAgfQoKPWN1dAoKc3ViIFNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUgZm9yICdSZXR1cm4nCiAgICAkUGFyYW17UmV0dXJufSB8fD0gJ1NUUklORyc7CgogICAgIyBnZXQgQ0FCIG9mIHRoZSBjaGFuZ2UKICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDaGFuZ2U7CgogICAgIyB0ZW1wbGF0ZXMgaGF2ZSB0byBiZSBhbiBhcnJheSByZWZlcmVuY2U7CiAgICBteSAkT3JpZ2luYWxEYXRhID0gewogICAgICAgIENBQkFkZCA9PiB7CiAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiAkQ2hhbmdlLT57Q0FCQ3VzdG9tZXJzfSwKICAgICAgICAgICAgQ0FCQWdlbnRzICAgID0+ICRDaGFuZ2UtPntDQUJBZ2VudHN9LAogICAgICAgIH0sCiAgICB9OwoKICAgIGlmICggJFBhcmFte1JldHVybn0gZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAkT3JpZ2luYWxEYXRhOwogICAgfQoKICAgICMgbm8gaW5kZW50YXRpb24gKHNhdmVzIHNwYWNlKQogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiAgICAjIGRvIG5vdCB1c2UgY3Jvc3MtcmVmZXJlbmNpbmcKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkRlZXBjb3B5ID0gMTsKCiAgICAjIHNlcmlhbGl6ZSB0aGUgZGF0YSAoZG8gbm90IHVzZSAkVkFSMSwgYnV0ICRUZW1wbGF0ZURhdGEgZm9yIER1bXBlciBvdXRwdXQpCiAgICBteSAkU2VyaWFsaXplZERhdGEgPSAkU2VsZi0+e01haW5PYmplY3R9LT5EdW1wKCAkT3JpZ2luYWxEYXRhLCAnYmluYXJ5JyApOwoKICAgIHJldHVybiAkU2VyaWFsaXplZERhdGE7Cn0KCj1pdGVtIERlU2VyaWFsaXplKCkKClVwZGF0ZXMgdGhlIENBQiBvZiBhIGNoYW5nZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gQ0FCIHRlbXBsYXRlLiBJdApyZXR1cm5zIHRoZSBjaGFuZ2UgaWQgdGhlIGNhYiBpcyBmb3IuCgogICAgbXkgJENoYW5nZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5EZVNlcmlhbGl6ZSgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsgJ21tQGxvY2FsaG9zdCcgXSwKICAgICAgICAgICAgQ0FCQWdlbnRzICAgID0+IFsgMSwgMiBdLAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBEZVNlcmlhbGl6ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3VycmVudCBDQUIgb2YgY2hhbmdlCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhIENBQiBhZGQgaXMgYWN0dWFsbHkgYSBDQUIgdXBkYXRlIG9uIGEgY2hhbmdlCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0FCVXBkYXRlKAogICAgICAgIENoYW5nZUlEICAgICA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgICAgIENBQkN1c3RvbWVycyA9PiBbIEB7ICRQYXJhbXtEYXRhfS0+e0NBQkN1c3RvbWVyc30gfSwgQHsgJENoYW5nZS0+e0NBQkN1c3RvbWVyc30gfSBdLAogICAgICAgIENBQkFnZW50cyAgICA9PiBbIEB7ICRQYXJhbXtEYXRhfS0+e0NBQkFnZW50c30gfSwgQHsgJENoYW5nZS0+e0NBQkFnZW50c30gfSBdLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJUluZm8gPSAoCiAgICAgICAgSUQgICAgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBDaGFuZ2VJRCA9PiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKCiAgICByZXR1cm4gJUluZm87Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAxMC8wMi8wOSAxNToyNDo0NCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9JVFNNQ2hhbmdlLnBtIC0gYWxsIHRlbXBsYXRlIGZ1bmN0aW9ucyBmb3IgY2hhbmdlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNoYW5nZS5wbSx2IDEuNiAyMDEwLzA2LzI5IDEyOjU2OjMxIHNiIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNvbmRpdGlvbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBEYXRhOjpEdW1wZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNoYW5nZSAtIGFsbCB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIGNoYW5nZXMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3IgY2hhbmdlIHRlbXBsYXRlcyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNoYW5nZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNoYW5nZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgJFNlbGYtPntXb3JrT3JkZXJUZW1wbGF0ZU9iamVjdH0KICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTVdvcmtPcmRlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDb25kaXRpb25UZW1wbGF0ZU9iamVjdH0KICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNvbmRpdGlvbi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmUtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFNlcmlhbGl6ZSgpCgpTZXJpYWxpemUgYSBjaGFuZ2UuIFRoaXMgaXMgZG9uZSB3aXRoIERhdGE6OkR1bXBlci4gSXQgcmV0dXJucwphIHNlcmlhbGl6ZWQgc3RyaW5nIG9mIHRoZSBkYXRhc3RydWN0dXJlLiBUaGUgY2hhbmdlIGFjdGlvbnMKYXJlICJ3cmFwcGVkIiB3aXRoaW4gYW4gYXJyYXlyZWZlcmVuY2UuLi4KCiAgICBteSAkVGVtcGxhdGVTdHJpbmcgPSAkVGVtcGxhdGVPYmplY3QtPlNlcmlhbGl6ZSgKICAgICAgICBDaGFuZ2VJRCAgID0+IDEsCiAgICAgICAgU3RhdGVSZXNldCA9PiAxLCAjIChvcHRpb25hbCkgcmVzZXQgdG8gZGVmYXVsdCBzdGF0ZQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBSZXR1cm4gICAgID0+ICdIQVNIJywgIyAob3B0aW9uYWwpIEhBU0h8U1RSSU5HIGRlZmF1bHQgJ1NUUklORycKICAgICk7CgpyZXR1cm5zCgogICAgJ3tDaGFuZ2VBZGQgPT4ge1RpdGxlID0+ICd0aXRsZScsIC4uLn19LCB7V29ya09yZGVyQWRkID0+IHsgQ2hhbmdlSUQgPT4gMTIzLCAuLi4gfX0nCgpJZiBwYXJhbWV0ZXIgQzxSZXR1cm4+IGlzIHNldCB0byBDPEhBU0g+LCB0aGUgUGVybCBkYXRhc3RydWN0dXJlCmlzIHJldHVybmVkCgogICAgewogICAgICAgIENoYW5nZUFkZCA9PiB7IC4uLiB9LAogICAgICAgIENoaWxkcmVuICA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7IC4uLiB9LAogICAgICAgICAgICAgICAgQ2hpbGRyZW4gICAgID0+IFsgLi4uIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7IC4uLiB9LAogICAgICAgICAgICAgICAgQ2hpbGRyZW4gICAgID0+IFsgLi4uIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgIH0KCj1jdXQKCnN1YiBTZXJpYWxpemUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIENoYW5nZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlIGZvciAnUmV0dXJuJwogICAgJFBhcmFte1JldHVybn0gfHw9ICdTVFJJTkcnOwoKICAgICMgZ2V0IGNoYW5nZQogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJENoYW5nZTsKCiAgICAjIGtlZXAgb25seSB3YW50ZWQgYXR0cmlidXRlcwogICAgbXkgJENsZWFuQ2hhbmdlOwogICAgZm9yIG15ICRBdHRyaWJ1dGUgKAogICAgICAgIHF3KAogICAgICAgIENoYW5nZUlEIENoYW5nZU51bWJlciBDaGFuZ2VTdGF0ZUlEIENoYW5nZVRpdGxlIERlc2NyaXB0aW9uIERlc2NyaXB0aW9uUGxhaW4KICAgICAgICBKdXN0aWZpY2F0aW9uIEp1c3RpZmljYXRpb25QbGFpbiBDaGFuZ2VNYW5hZ2VySUQgQ2hhbmdlQnVpbGRlcklECiAgICAgICAgQ2F0ZWdvcnlJRCBJbXBhY3RJRCBQcmlvcml0eUlEIENBQkFnZW50cyBDQUJDdXN0b21lcnMgUmVxdWVzdGVkVGltZQogICAgICAgIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSBQbGFubmVkU3RhcnRUaW1lIFBsYW5uZWRFbmRUaW1lKQogICAgICAgICkKICAgIHsKICAgICAgICAkQ2xlYW5DaGFuZ2UtPnskQXR0cmlidXRlfSA9ICRDaGFuZ2UtPnskQXR0cmlidXRlfTsKICAgIH0KCiAgICAjIHJlc2V0IGNoYW5nZSBzdGF0ZSB0byBkZWZhdWx0IGlmIHJlcXVlc3RlZAogICAgaWYgKCAkUGFyYW17U3RhdGVSZXNldH0gKSB7CgogICAgICAgICMgZ2V0IGluaXRpYWwgY2hhbmdlIHN0YXRlIGlkCiAgICAgICAgbXkgJE5leHRTdGF0ZUlEcyA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0KAogICAgICAgICAgICBTdGF0ZUlEID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgICAgICk7CiAgICAgICAgJENsZWFuQ2hhbmdlLT57Q2hhbmdlU3RhdGVJRH0gPSAkTmV4dFN0YXRlSURzLT5bMF07CiAgICB9CgogICAgIyBhZGQgY2hhbmdlIGZyZWVrZXkgYW5kIGZyZWV0ZXh0IGZpZWxkcyB0byBsaXN0IG9mIHdhbnRlZCBhdHRyaWJ1dGVzCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJXskQ2hhbmdlfSApIHsKCiAgICAgICAgIyBmaW5kIHRoZSBjaGFuZ2UgZnJlZWtleSBhbmQgZnJlZXRleHQgYXR0cmlidXRlcwogICAgICAgIGlmICggJEF0dHJpYnV0ZSA9fiBteyBcQSAoIENoYW5nZUZyZWVLZXkgfCBDaGFuZ2VGcmVlVGV4dCApIH14bXMgKSB7CgogICAgICAgICAgICAkQ2xlYW5DaGFuZ2UtPnskQXR0cmlidXRlfSA9ICRDaGFuZ2UtPnskQXR0cmlidXRlfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE9yaWdpbmFsRGF0YSA9IHsgQ2hhbmdlQWRkID0+ICRDbGVhbkNoYW5nZSB9OwoKICAgICMgZ2V0IGF0dGFjaG1lbnRzCiAgICBteSAlQ2hhbmdlQXR0YWNobWVudHMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICApOwogICAgZm9yIG15ICRGaWxlSUQgKCBrZXlzICVDaGFuZ2VBdHRhY2htZW50cyApIHsKCiAgICAgICAgIyBzYXZlIGF0dGFjaG1lbnRzIHRvIHRoaXMgdGVtcGxhdGUKICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgeyBBdHRhY2htZW50QWRkID0+IHsgRmlsZUlEID0+ICRGaWxlSUQgfSB9OwogICAgfQoKICAgICMgZ2V0IHdvcmtvcmRlcnMKICAgIFdPUktPUkRFUklEOgogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7ICRDaGFuZ2UtPntXb3JrT3JkZXJJRHN9IH0gKSB7CiAgICAgICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyVGVtcGxhdGVPYmplY3R9LT5TZXJpYWxpemUoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgU3RhdGVSZXNldCAgPT4gJFBhcmFte1N0YXRlUmVzZXR9IHx8IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBSZXR1cm4gICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBXT1JLT1JERVJJRCBpZiAhJFdvcmtPcmRlcjsKCiAgICAgICAgcHVzaCBAeyAkT3JpZ2luYWxEYXRhLT57Q2hpbGRyZW59IH0sICRXb3JrT3JkZXI7CiAgICB9CgogICAgIyBnZXQgY29uZGl0aW9uIGxpc3QgZm9yIHRoZSBjaGFuZ2UKICAgIG15ICRDb25kaXRpb25MaXN0ID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25MaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVmFsaWQgICAgPT4gMCwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICkgfHwgW107CgogICAgIyBnZXQgZWFjaCBjb25kaXRpb24KICAgIENPTkRJVElPTklEOgogICAgZm9yIG15ICRDb25kaXRpb25JRCAoIEB7JENvbmRpdGlvbkxpc3R9ICkgewogICAgICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+e0NvbmRpdGlvblRlbXBsYXRlT2JqZWN0fS0+U2VyaWFsaXplKAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBSZXR1cm4gICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05ESVRJT05JRCBpZiAhJENvbmRpdGlvbjsKCiAgICAgICAgcHVzaCBAeyAkT3JpZ2luYWxEYXRhLT57Q2hpbGRyZW59IH0sICRDb25kaXRpb247CiAgICB9CgogICAgIyBnZXQgbGlua3MgdG8gb3RoZXIgb2JqZWN0CiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBLZXkgICAgPT4gJENoYW5nZS0+e0NoYW5nZUlEfSwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0ICgga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhfSApIHsKICAgICAgICBmb3IgbXkgJFR5cGUgKCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0tPnskVHlwZX0gfSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0SUQgKCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0tPnskVHlwZX0tPnskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rSW5mbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRDaGFuZ2UtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldElELAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgeyBMaW5rQWRkID0+ICRMaW5rSW5mbyB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFBhcmFte1JldHVybn0gZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAkT3JpZ2luYWxEYXRhOwogICAgfQoKICAgICMgbm8gaW5kZW50YXRpb24gKHNhdmVzIHNwYWNlKQogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiAgICAjIGRvIG5vdCB1c2UgY3Jvc3MtcmVmZXJlbmNpbmcKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkRlZXBjb3B5ID0gMTsKCiAgICAjIHNlcmlhbGl6ZSB0aGUgZGF0YSAoZG8gbm90IHVzZSAkVkFSMSwgYnV0ICRUZW1wbGF0ZURhdGEgZm9yIER1bXBlciBvdXRwdXQpCiAgICBteSAkU2VyaWFsaXplZERhdGEgPSAkU2VsZi0+e01haW5PYmplY3R9LT5EdW1wKCAkT3JpZ2luYWxEYXRhLCAnYmluYXJ5JyApOwoKICAgIHJldHVybiAkU2VyaWFsaXplZERhdGE7Cn0KCj1pdGVtIERlU2VyaWFsaXplKCkKCkRlU2VyaWFsaXplKCkgaXMgYSB3cmFwcGVyIGZvciBhbGwgdGhlIF9YWFhBZGQgbWV0aG9kcy4KCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+RGVTZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgQ2hhbmdlQWRkCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgTWV0aG9kICAgPT4gJ0NoYW5nZUFkZCcsCiAgICApOwoKPWN1dAoKc3ViIERlU2VyaWFsaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBNZXRob2QgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkaXNwYXRjaCB0YWJsZQogICAgbXkgJU1ldGhvZDJTdWIgPSAoCiAgICAgICAgQ2hhbmdlQWRkICAgICA9PiAnX0NoYW5nZUFkZCcsCiAgICAgICAgQXR0YWNobWVudEFkZCA9PiAnX0F0dGFjaG1lbnRBZGQnLAogICAgICAgIExpbmtBZGQgICAgICAgPT4gJ19MaW5rQWRkJywKICAgICk7CgogICAgbXkgJFN1YiA9ICRNZXRob2QyU3VieyAkUGFyYW17TWV0aG9kfSB9OwoKICAgIGlmICggISRTdWIgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIE1ldGhvZG5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPiRTdWIoJVBhcmFtKTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0NoYW5nZUFkZCgpCgpDcmVhdGVzIGEgbmV3IGNoYW5nZSBiYXNlZCBvbiBhIHRlbXBsYXRlLiBJdCByZXR1cm5zIGEgaGFzaCB3aXRoIGFkZGl0aW9uYWwKaW5mbyBsaWtlIENoYW5nZUlELgoKICAgIG15ICVSZXR1cm4gPSAkVGVtcGxhdGVPYmplY3QtPl9DaGFuZ2VBZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICd0ZXN0JywKICAgICAgICB9LAogICAgICAgICMgb3RoZXIgY2hhbmdlIGF0dHJpYnV0ZXMKICAgICAgICBDaGFuZ2VJRCA9PiAwLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9DaGFuZ2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBhIGxvY2FsIGNvcHkKICAgIG15ICVEYXRhID0gJXsgJFBhcmFte0RhdGF9IH07CgogICAgIyB3ZSBuZWVkIHRoZSBvbGQgY2hhbmdlIGlkIGZvciBleHByZXNzaW9ucwogICAgbXkgJE9sZENoYW5nZUlEID0gJERhdGF7Q2hhbmdlSUR9OwoKICAgICMgdGhlc2UgYXR0cmlidXRlcyBhcmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHksIHNvIGRvbid0IHBhc3MgdGhlbSB0byBDaGFuZ2VBZGQoKQogICAgZGVsZXRlIEBEYXRhe3F3KENoYW5nZUlEIENoYW5nZU51bWJlciBDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpfTsKICAgIGRlbGV0ZSBARGF0YXtxdyhEZXNjcmlwdGlvblBsYWluIEp1c3RpZmljYXRpb25QbGFpbil9OwoKICAgICMgaWYgdXNlciBzZXQgYSBuZXcgdGltZSwgY2FsY3VsYXRlIGRpZmZlcmVuY2UKICAgIG15ICREaWZmZXJlbmNlOwogICAgaWYgKCAkUGFyYW17TmV3VGltZUluRXBvY2hlfSApIHsKICAgICAgICBteSAkT2xkVGltZSA9ICREYXRheyAkUGFyYW17TW92ZVRpbWVUeXBlfSB9OwoKICAgICAgICBpZiAoJE9sZFRpbWUpIHsKICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAkU2VsZi0+X0dldFRpbWVEaWZmZXJlbmNlKAogICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgICAgID0+ICRPbGRUaW1lLAogICAgICAgICAgICAgICAgTmV3VGltZUluRXBvY2hlID0+ICRQYXJhbXtOZXdUaW1lSW5FcG9jaGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIFBsYW5uZWRYWFhUaW1lIHdhcyBzYXZlZCBqdXN0IGZvciAibW92ZSB0aW1lIiBwdXJwb3NlcwogICAgZGVsZXRlICREYXRhe1BsYW5uZWRFbmRUaW1lfTsKICAgIGRlbGV0ZSAkRGF0YXtQbGFubmVkU3RhcnRUaW1lfTsKCiAgICAjIFJlcXVlc3RlZFRpbWUgc2hvdWxkIG5vdCBiZSBzZXQKICAgIGRlbGV0ZSAkRGF0YXtSZXF1ZXN0ZWRUaW1lfTsKCiAgICAjIGRlbGV0ZSBhbGwgcGFyYW1ldGVycyB3aG9zZSB2YWx1ZXMgYXJlICd1bmRlZicKICAgICMgX0NoZWNrQ2hhbmdlUGFyYW1zIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UKICAgIGZvciBteSAkUGFyYW1ldGVyICgga2V5cyAlRGF0YSApIHsKICAgICAgICBkZWxldGUgJERhdGF7JFBhcmFtZXRlcn0gaWYgIWRlZmluZWQgJERhdGF7JFBhcmFtZXRlcn07CiAgICB9CgogICAgIyByZXBsYWNlIHRoZSBDaGFuZ2VCdWlsZGVySUQgZnJvbSB0aGUgc2F2ZWQgdGVtcGxhdGUgd2l0aCB0aGUgY3VycmVudCB1c2VyIGlkCiAgICAkRGF0YXtDaGFuZ2VCdWlsZGVySUR9ID0gJFBhcmFte1VzZXJJRH07CgogICAgIyBhZGQgdGhlIGNoYW5nZQogICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBZGQoCiAgICAgICAgJURhdGEsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlSW5mbyA9ICgKICAgICAgICBJRCAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJENoYW5nZUlELAogICAgICAgIFRpbWVEaWZmZXJlbmNlID0+ICREaWZmZXJlbmNlLAogICAgICAgIE9sZENoYW5nZUlEICAgID0+ICRPbGRDaGFuZ2VJRCwKICAgICk7CgogICAgcmV0dXJuICVJbmZvOwp9Cgo9aXRlbSBfR2V0VGltZURpZmZlcmVuY2UoKQoKSWYgYSBuZXcgcGxhbm5lZCBzdGFydC9lbmQgdGltZSB3YXMgZ2l2ZW4sIHRoZSBkaWZmZXJlbmNlIGlzIG5lZWRlZAp0byBtb3ZlIGFsbCB0aW1lIHZhbHVlcwoKICAgIG15ICREaWZmSW5TZWNvbmRzID0gJFRlbXBsYXRlT2JqZWN0LT5fR2V0VGltZURpZmZlcmVuY2UoCiAgICAgICAgQ3VycmVudFRpbWUgICAgID0+ICcyMDEwLTAxLTEyIDAwOjAwOjAwJywKICAgICAgICBOZXdUaW1lSW5FcG9jaGUgPT4gMTIzNDU2Nzg5MCwKICAgICk7Cgo9Y3V0CgpzdWIgX0dldFRpbWVEaWZmZXJlbmNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEN1cnJlbnRUaW1lIE5ld1RpbWVJbkVwb2NoZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3VycmVudCB0aW1lIGFzIHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtDdXJyZW50VGltZX0sCiAgICApOwoKICAgIG15ICREaWZmU2Vjb25kcyA9ICRQYXJhbXtOZXdUaW1lSW5FcG9jaGV9IC0gJEN1cnJlbnRTeXN0ZW1UaW1lOwoKICAgIHJldHVybiAkRGlmZlNlY29uZHM7Cn0KCj1pdGVtIF9BdHRhY2htZW50QWRkKCkKCkNyZWF0ZXMgbmV3IGF0dGFjaG1lbnRzIGZvciBhIGNoYW5nZSBvciBhIHdvcmtvcmRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuIEl0CnJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uICh3aXRoIGp1c3Qgb25lIGtleSAtICJTdWNjZXNzIikKCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+X0F0dGFjaG1lbnRBZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgQXR0YWNobWVudEFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfQXR0YWNobWVudEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEF0dGFjaG1lbnQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRHZXQoCiAgICAgICAgRmlsZUlEID0+ICRQYXJhbXtEYXRhfS0+e0ZpbGVJRH0sCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBdHRhY2htZW50QWRkKAogICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVJbmZvID0gKAogICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKPWl0ZW0gX0xpbmtBZGQoKQoKQ3JlYXRlcyBuZXcgbGlua3MgZm9yIGEgY2hhbmdlIG9yIGEgd29ya29yZGVyIGJhc2VkIG9uIHRoZSBnaXZlbiB0ZW1wbGF0ZS4gSXQKcmV0dXJucyBhIGhhc2ggb2YgaW5mb3JtYXRpb24gKHdpdGgganVzdCBvbmUga2V5IC0gIlN1Y2Nlc3MiKQoKICAgIG15ICVJbmZvID0gJFRlbXBsYXRlT2JqZWN0LT5fTGlua0FkZCgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgIyAuLi4gUGFyYW1zIGZvciBMaW5rQWRkCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCAgICA9PiAxLAogICAgICAgIFdvcmtPcmRlcklEID0+IDEyMywgIyBvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9MaW5rQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU291cmNlS2V5OwoKICAgIGlmICggJFBhcmFte0RhdGF9LT57U291cmNlT2JqZWN0fSBlcSAnSVRTTUNoYW5nZScgKSB7CiAgICAgICAgJFNvdXJjZUtleSA9ICRQYXJhbXtDaGFuZ2VJRH07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e1NvdXJjZU9iamVjdH0gZXEgJ0lUU01Xb3JrT3JkZXInICkgewogICAgICAgICRTb3VyY2VLZXkgPSAkUGFyYW17V29ya09yZGVySUR9OwogICAgfQoKICAgIGlmICggISRTb3VyY2VLZXkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFdvcmtPcmRlcklEIG9yIENoYW5nZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICV7ICRQYXJhbXtEYXRhfSB9LAogICAgICAgIFNvdXJjZUtleSA9PiAkU291cmNlS2V5LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJUluZm8gPSAoCiAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICk7CgogICAgcmV0dXJuICVJbmZvOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDEwLzA2LzI5IDEyOjU2OjMxICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9JVFNNQ29uZGl0aW9uLnBtIC0gYWxsIHRlbXBsYXRlIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNvbmRpdGlvbi5wbSx2IDEuMiAyMDEwLzAyLzA5IDE1OjI0OjQ0IHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGU6OklUU01Db25kaXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBEYXRhOjpEdW1wZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNvbmRpdGlvbiAtIGFsbCB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIGNvbmRpdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9uIHRlbXBsYXRlcyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNvbmRpdGlvbjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNvbmRpdGlvbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU2VyaWFsaXplKCkKClNlcmlhbGl6ZSBhIGNvbmRpdGlvbi4gVGhpcyBpcyBkb25lIHdpdGggRGF0YTo6RHVtcGVyLiBJdCByZXR1cm5zCmEgc2VyaWFsaXplZCBzdHJpbmcgb2YgdGhlIGRhdGFzdHJ1Y3R1cmUuIFRoZSBjb25kaXRpb24gYWN0aW9ucwphcmUgIndyYXBwZWQiIHdpdGhpbiBhIGhhc2hyZWZlcmVuY2UuLi4KCiAgICBteSAkVGVtcGxhdGVTdHJpbmcgPSAkVGVtcGxhdGVPYmplY3QtPlNlcmlhbGl6ZSgKICAgICAgICBDb25kaXRpb25JRCA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgUmV0dXJuICAgICAgPT4gJ0hBU0gnLCAjIChvcHRpb25hbCkgSEFTSHxTVFJJTkcgZGVmYXVsdCAnU1RSSU5HJwogICAgKTsKCnJldHVybnMKCiAgICAne0NvbmRpdGlvbkFkZCA9PiB7IC4uLiB9fScKCklmIHBhcmFtZXRlciBDPFJldHVybj4gaXMgc2V0IHRvIEM8SEFTSD4sIHRoZSBQZXJsIGRhdGFzdHJ1Y3R1cmUKaXMgcmV0dXJuZWQKCiAgICB7CiAgICAgICAgQ29uZGl0aW9uQWRkID0+IHsgLi4uIH0sCiAgICAgICAgQ2hpbGRyZW4gICAgID0+IFsgLi4uIF0sCiAgICB9Cgo9Y3V0CgpzdWIgU2VyaWFsaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBDb25kaXRpb25JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgJ1JldHVybicKICAgICRQYXJhbXtSZXR1cm59IHx8PSAnU1RSSU5HJzsKCiAgICAjIGdldCBjb25kaXRpb24KICAgIG15ICRDb25kaXRpb24gPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkNvbmRpdGlvbkdldCgKICAgICAgICBDb25kaXRpb25JRCA9PiAkUGFyYW17Q29uZGl0aW9uSUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDb25kaXRpb247CgogICAgIyB0ZW1wbGF0ZXMgaGF2ZSB0byBiZSBhbiBhcnJheSByZWZlcmVuY2U7CiAgICBteSAkT3JpZ2luYWxEYXRhID0geyBDb25kaXRpb25BZGQgPT4gJENvbmRpdGlvbiB9OwoKICAgICMgZ2V0IGV4cHJlc3Npb25zCiAgICBteSAkRXhwcmVzc2lvbnMgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgYWRkIGVhY2ggZXhwcmVzc2lvbiB0byBjb25kaXRpb24gZGF0YQogICAgZm9yIG15ICRFeHByZXNzaW9uSUQgKCBAeyRFeHByZXNzaW9uc30gKSB7CiAgICAgICAgbXkgJEV4cHJlc3Npb24gPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25HZXQoCiAgICAgICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAeyAkT3JpZ2luYWxEYXRhLT57Q2hpbGRyZW59IH0sIHsgRXhwcmVzc2lvbkFkZCA9PiAkRXhwcmVzc2lvbiB9OwogICAgfQoKICAgICMgZ2V0IGFjdGlvbnMKICAgIG15ICRBY3Rpb25zID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25MaXN0KAogICAgICAgIENvbmRpdGlvbklEID0+ICRQYXJhbXtDb25kaXRpb25JRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApIHx8IFtdOwoKICAgICMgYWRkIGVhY2ggYWN0aW9uIHRvIGNvbmRpdGlvbiBkYXRhCiAgICBmb3IgbXkgJEFjdGlvbklEICggQHskQWN0aW9uc30gKSB7CiAgICAgICAgbXkgJEFjdGlvbiA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+QWN0aW9uR2V0KAogICAgICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQHsgJE9yaWdpbmFsRGF0YS0+e0NoaWxkcmVufSB9LCB7IEFjdGlvbkFkZCA9PiAkQWN0aW9uIH07CiAgICB9CgogICAgaWYgKCAkUGFyYW17UmV0dXJufSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICRPcmlnaW5hbERhdGE7CiAgICB9CgogICAgIyBubyBpbmRlbnRhdGlvbiAoc2F2ZXMgc3BhY2UpCiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwoKICAgICMgZG8gbm90IHVzZSBjcm9zcy1yZWZlcmVuY2luZwogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6RGVlcGNvcHkgPSAxOwoKICAgICMgc2VyaWFsaXplIHRoZSBkYXRhIChkbyBub3QgdXNlICRWQVIxLCBidXQgJFRlbXBsYXRlRGF0YSBmb3IgRHVtcGVyIG91dHB1dCkKICAgIG15ICRTZXJpYWxpemVkRGF0YSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkR1bXAoICRPcmlnaW5hbERhdGEsICdiaW5hcnknICk7CgogICAgcmV0dXJuICRTZXJpYWxpemVkRGF0YTsKfQoKPWl0ZW0gRGVTZXJpYWxpemUoKQoKRGVTZXJpYWxpemUoKSBpcyBhIHdyYXBwZXIgZm9yIGFsbCB0aGUgX1hYWEFkZCBtZXRob2RzLgoKICAgIG15ICVJbmZvID0gJFRlbXBsYXRlT2JqZWN0LT5EZVNlcmlhbGl6ZSgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgIyAuLi4gUGFyYW1zIGZvciBDb25kaXRpb25BZGQKICAgICAgICB9LAogICAgICAgIENoYW5nZUlEID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBNZXRob2QgICA9PiAnQ29uZGl0aW9uQWRkJywKICAgICk7Cgo9Y3V0CgpzdWIgRGVTZXJpYWxpemUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIE1ldGhvZCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRpc3BhdGNoIHRhYmxlCiAgICBteSAlTWV0aG9kMlN1YiA9ICgKICAgICAgICBDb25kaXRpb25BZGQgID0+ICdfQ29uZGl0aW9uQWRkJywKICAgICAgICBFeHByZXNzaW9uQWRkID0+ICdfRXhwcmVzc2lvbkFkZCcsCiAgICAgICAgQWN0aW9uQWRkICAgICA9PiAnX0FjdGlvbkFkZCcsCiAgICApOwoKICAgIG15ICRTdWIgPSAkTWV0aG9kMlN1YnsgJFBhcmFte01ldGhvZH0gfTsKCiAgICBpZiAoICEkU3ViICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCBNZXRob2RuYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT4kU3ViKCVQYXJhbSk7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9Db25kaXRpb25BZGQoKQoKQ3JlYXRlcyBuZXcgY29uZGl0aW9ucyBmb3IgYSBjaGFuZ2UgYmFzZWQgb24gdGhlIGdpdmVuIHRlbXBsYXRlLiBJdApyZXR1cm5zIGEgaGFzaCBvZiBpbmZvcm1hdGlvbiAoY2hhbmdlIGlkIGl0IHdhcyBjcmVhdGVkIGZvciwgaWQgaXMKdGhlIGNvbmRpdGlvbiBpZCkKCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+X0NvbmRpdGlvbkFkZCgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgIyAuLi4gUGFyYW1zIGZvciBDb25kaXRpb25BZGQKICAgICAgICB9LAogICAgICAgIENoYW5nZUlEID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0NvbmRpdGlvbkFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJURhdGEgPSAleyAkUGFyYW17RGF0YX0gfTsKCiAgICAjIGRlbGV0ZSBhdHRyaWJ1dGVzCiAgICBkZWxldGUgJERhdGF7Q29uZGl0aW9uSUR9OwoKICAgICMgYWRkIGNvbmRpdGlvbgogICAgbXkgJENvbmRpdGlvbklEID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25BZGQoCiAgICAgICAgJURhdGEsCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJUluZm8gPSAoCiAgICAgICAgSUQgICAgICAgICAgPT4gJENvbmRpdGlvbklELAogICAgICAgIENoYW5nZUlEICAgID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgKTsKCiAgICByZXR1cm4gJUluZm87Cn0KCj1pdGVtIF9FeHByZXNzaW9uQWRkKCkKCkNyZWF0ZXMgbmV3IGV4cHJlc3Npb25zIGZvciBhIGNvbmRpdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuIEl0CnJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uIChjaGFuZ2UgaWQgaXQgd2FzIGNyZWF0ZWQgZm9yLCBpZCBpcwp0aGUgZXhwcmVzc2lvbiBpZCkKCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+X0V4cHJlc3Npb25BZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgRXhwcmVzc2lvbkFkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfRXhwcmVzc2lvbkFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQgRGF0YSBDb25kaXRpb25JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJURhdGEgPSAleyAkUGFyYW17RGF0YX0gfTsKCiAgICAjIGRlbGV0ZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBuZWVkZWQKICAgIGRlbGV0ZSAkRGF0YXtFeHByZXNzaW9uSUR9OwoKICAgICMgcmVwbGFjZSBvbGQgaWRzIHdpdGggbmV3IGlkcwogICAgJERhdGF7Q29uZGl0aW9uSUR9ID0gJFBhcmFte0NvbmRpdGlvbklEfTsKCiAgICAjIHJlcGxhY2Ugb2xkIGlkIG9ubHkgaWYgaXQgaXMgYW4gSUQKICAgIGlmICggJERhdGF7U2VsZWN0b3J9ID1+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgICAgIG15ICRPYmplY3QgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdEdldCgKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJERhdGF7T2JqZWN0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRPYmplY3QtPntOYW1lfSBlcSAnSVRTTUNoYW5nZScgKSB7CiAgICAgICAgICAgICREYXRhe1NlbGVjdG9yfSA9ICRQYXJhbXtDaGFuZ2VJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9iamVjdC0+e05hbWV9IGVxICdJVFNNV29ya09yZGVyJyApIHsKICAgICAgICAgICAgJERhdGF7U2VsZWN0b3J9ID0gJFBhcmFte09sZFdvcmtPcmRlcklEc30tPnsgJERhdGF7U2VsZWN0b3J9IH07CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGV4cHJlc3Npb24KICAgIG15ICRFeHByZXNzaW9uSUQgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25BZGQoCiAgICAgICAgJURhdGEsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlSW5mbyA9ICgKICAgICAgICBJRCAgICAgICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICBDaGFuZ2VJRCAgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICk7CgogICAgcmV0dXJuICVJbmZvOwp9Cgo9aXRlbSBfQWN0aW9uQWRkKCkKCkNyZWF0ZXMgbmV3IGFjdGlvbnMgZm9yIGEgY29uZGl0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiB0ZW1wbGF0ZS4gSXQKcmV0dXJucyBhIGhhc2ggb2YgaW5mb3JtYXRpb24gKGNoYW5nZSBpZCBpdCB3YXMgY3JlYXRlZCBmb3IsIGlkIGlzCnRoZSBhY3Rpb24gaWQpCgogICAgbXkgJUluZm8gPSAkVGVtcGxhdGVPYmplY3QtPl9BY3Rpb25BZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgQWN0aW9uQWRkCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9BY3Rpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVXNlcklEIENoYW5nZUlEIERhdGEgQ29uZGl0aW9uSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVEYXRhID0gJXsgJFBhcmFte0RhdGF9IH07CgogICAgIyBkZWxldGUgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgbmVlZGVkCiAgICBkZWxldGUgJERhdGF7QWN0aW9uSUR9OwoKICAgICMgcmVwbGFjZSBvbGQgaWRzIHdpdGggbmV3IGlkcwogICAgJERhdGF7Q29uZGl0aW9uSUR9ID0gJFBhcmFte0NvbmRpdGlvbklEfTsKCiAgICAjIHJlcGxhY2Ugb2xkIGlkIG9ubHkgaWYgaXQgaXMgYW4gSUQKICAgIGlmICggJERhdGF7U2VsZWN0b3J9ID1+IG17IFxBIFxkKyBceiB9eG1zICkgewogICAgICAgIG15ICRPYmplY3QgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdEdldCgKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJERhdGF7T2JqZWN0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRPYmplY3QtPntOYW1lfSBlcSAnSVRTTUNoYW5nZScgKSB7CiAgICAgICAgICAgICREYXRhe1NlbGVjdG9yfSA9ICRQYXJhbXtDaGFuZ2VJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9iamVjdC0+e05hbWV9IGVxICdJVFNNV29ya09yZGVyJyApIHsKICAgICAgICAgICAgJERhdGF7U2VsZWN0b3J9ID0gJFBhcmFte09sZFdvcmtPcmRlcklEc30tPnsgJERhdGF7U2VsZWN0b3J9IH07CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGFjdGlvbgogICAgbXkgJEFjdGlvbklEID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25BZGQoCiAgICAgICAgJURhdGEsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlSW5mbyA9ICgKICAgICAgICBJRCAgICAgICA9PiAkQWN0aW9uSUQsCiAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAxMC8wMi8wOSAxNToyNDo0NCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNoYW5nZS9UZW1wbGF0ZS9JVFNNV29ya09yZGVyLnBtIC0gYWxsIHRlbXBsYXRlIGZ1bmN0aW9ucyBmb3Igd29ya29yZGVycwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTVdvcmtPcmRlci5wbSx2IDEuNSAyMDEwLzA2LzI5IDEyOjU2OjMxIHNiIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTVdvcmtPcmRlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBEYXRhOjpEdW1wZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTUNoYW5nZSAtIGFsbCB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIHdvcmtvcmRlcnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucyBmb3Igd29ya29yZGVyIHRlbXBsYXRlcyBpbiBJVFNNQ2hhbmdlTWFuYWdlbWVudC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTVdvcmtPcmRlcjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTo6SVRTTVdvcmtPcmRlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlYnVnIGZsYWcKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTZXJpYWxpemUoKQoKU2VyaWFsaXplIGEgd29ya29yZGVyLiBUaGlzIGlzIGRvbmUgd2l0aCBEYXRhOjpEdW1wZXIuIEl0IHJldHVybnMKYSBzZXJpYWxpemVkIHN0cmluZyBvZiB0aGUgZGF0YXN0cnVjdHVyZS4gVGhlIHdvcmtvcmRlciBhY3Rpb25zCmFyZSAid3JhcHBlZCIgd2l0aGluIGEgaGFzaHJlZmVyZW5jZS4uLgoKICAgIG15ICRUZW1wbGF0ZVN0cmluZyA9ICRUZW1wbGF0ZU9iamVjdC0+U2VyaWFsaXplKAogICAgICAgIFdvcmtPcmRlcklEID0+IDEsCiAgICAgICAgU3RhdGVSZXNldCAgPT4gMSwgIyAob3B0aW9uYWwpIHJlc2V0IHRvIGRlZmF1bHQgc3RhdGUKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIFJldHVybiAgICAgID0+ICdIQVNIJywgIyAob3B0aW9uYWwpIEhBU0h8U1RSSU5HIGRlZmF1bHQgJ1NUUklORycKICAgICk7CgpyZXR1cm5zCgogICAgJ3tXb3JrT3JkZXJBZGQgPT4geyBDaGFuZ2VJRCA9PiAxMjMsIC4uLiB9fScKCklmIHBhcmFtZXRlciBDPFJldHVybj4gaXMgc2V0IHRvIEM8SEFTSD4sIHRoZSBQZXJsIGRhdGFzdHJ1Y3R1cmUKaXMgcmV0dXJuZWQKCiAgICB7CiAgICAgICAgV29ya09yZGVyQWRkID0+IHsgLi4uIH0sCiAgICAgICAgQ2hpbGRyZW4gICAgID0+IFsgLi4uIF0sCiAgICB9Cgo9Y3V0CgpzdWIgU2VyaWFsaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBXb3JrT3JkZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgJ1JldHVybicKICAgICRQYXJhbXtSZXR1cm59IHx8PSAnU1RSSU5HJzsKCiAgICAjIGdldCB3b3Jrb3JkZXIKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRXb3JrT3JkZXI7CgogICAgIyBrZWVwIGp1c3Qgd2FudGVkIGF0dHJpYnV0ZXMKICAgIG15ICRDbGVhbldvcmtPcmRlcjsKICAgIGZvciBteSAkQXR0cmlidXRlICgKICAgICAgICBxdygKICAgICAgICBXb3JrT3JkZXJJRCBDaGFuZ2VJRCBXb3JrT3JkZXJOdW1iZXIgV29ya09yZGVyVGl0bGUgSW5zdHJ1Y3Rpb24gSW5zdHJ1Y3Rpb25QbGFpbgogICAgICAgIFJlcG9ydCBSZXBvcnRQbGFpbiBXb3JrT3JkZXJTdGF0ZUlEIFdvcmtPcmRlclR5cGVJRCBXb3JrT3JkZXJBZ2VudElECiAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSBBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSBBY2NvdW50ZWRUaW1lIFBsYW5uZWRFZmZvcnQKICAgICAgICBDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpCiAgICAgICAgKQogICAgewogICAgICAgICRDbGVhbldvcmtPcmRlci0+eyRBdHRyaWJ1dGV9ID0gJFdvcmtPcmRlci0+eyRBdHRyaWJ1dGV9OwogICAgfQoKICAgICMgcmVzZXQgd29ya29yZGVyIHN0YXRlIHRvIGRlZmF1bHQgaWYgcmVxdWVzdGVkCiAgICBpZiAoICRQYXJhbXtTdGF0ZVJlc2V0fSApIHsKCiAgICAgICAgIyBnZXQgaW5pdGlhbCB3b3Jrb3JkZXIgc3RhdGUgaWQKICAgICAgICBteSAkTmV4dFN0YXRlSURzID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25HZXQoCiAgICAgICAgICAgIFN0YXRlSUQgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgKTsKICAgICAgICAkQ2xlYW5Xb3JrT3JkZXItPntXb3JrT3JkZXJTdGF0ZUlEfSA9ICROZXh0U3RhdGVJRHMtPlswXTsKICAgIH0KCiAgICAjIGFkZCB3b3Jrb3JkZXIgZnJlZWtleSBhbmQgZnJlZXRleHQgZmllbGRzIHRvIGxpc3Qgb2Ygd2FudGVkIGF0dHJpYnV0ZXMKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAleyRXb3JrT3JkZXJ9ICkgewoKICAgICAgICAjIGZpbmQgdGhlIHdvcmtvcmRlciBmcmVla2V5IGFuZCBmcmVldGV4dCBhdHRyaWJ1dGVzCiAgICAgICAgaWYgKCAkQXR0cmlidXRlID1+IG17IFxBICggV29ya09yZGVyRnJlZUtleSB8IFdvcmtPcmRlckZyZWVUZXh0ICkgfXhtcyApIHsKCiAgICAgICAgICAgICRDbGVhbldvcmtPcmRlci0+eyRBdHRyaWJ1dGV9ID0gJFdvcmtPcmRlci0+eyRBdHRyaWJ1dGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHRlbXBsYXRlcyBoYXZlIHRvIGJlIGFuIGFycmF5IHJlZmVyZW5jZTsKICAgIG15ICRPcmlnaW5hbERhdGEgPSB7IFdvcmtPcmRlckFkZCA9PiAkQ2xlYW5Xb3JrT3JkZXIgfTsKCiAgICAjIGdldCBhdHRhY2htZW50cwogICAgbXkgJVdvcmtPcmRlckF0dGFjaG1lbnRzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50TGlzdCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVyLT57V29ya09yZGVySUR9LAogICAgKTsKCiAgICBmb3IgbXkgJEZpbGVJRCAoIGtleXMgJVdvcmtPcmRlckF0dGFjaG1lbnRzICkgewoKICAgICAgICAjIHNhdmUgYXR0YWNobWVudHMgdG8gdGhpcyB0ZW1wbGF0ZQogICAgICAgIHB1c2ggQHsgJE9yaWdpbmFsRGF0YS0+e0NoaWxkcmVufSB9LCB7IEF0dGFjaG1lbnRBZGQgPT4geyBGaWxlSUQgPT4gJEZpbGVJRCB9IH07CiAgICB9CgogICAgIyBnZXQgbGlua3MgdG8gb3RoZXIgb2JqZWN0CiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBLZXkgICAgPT4gJFdvcmtPcmRlci0+e1dvcmtPcmRlcklEfSwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0ICgga2V5cyAleyRMaW5rTGlzdFdpdGhEYXRhfSApIHsKICAgICAgICBmb3IgbXkgJFR5cGUgKCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0tPnskVHlwZX0gfSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0SUQgKCBrZXlzICV7ICRMaW5rTGlzdFdpdGhEYXRhLT57JFRhcmdldE9iamVjdH0tPnskVHlwZX0tPnskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMaW5rSW5mbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRXb3JrT3JkZXItPntXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldElELAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRPcmlnaW5hbERhdGEtPntDaGlsZHJlbn0gfSwgeyBMaW5rQWRkID0+ICRMaW5rSW5mbyB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFBhcmFte1JldHVybn0gZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAkT3JpZ2luYWxEYXRhOwogICAgfQoKICAgICMgbm8gaW5kZW50YXRpb24gKHNhdmVzIHNwYWNlKQogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKCiAgICAjIGRvIG5vdCB1c2UgY3Jvc3MtcmVmZXJlbmNpbmcKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkRlZXBjb3B5ID0gMTsKCiAgICAjIHNlcmlhbGl6ZSB0aGUgZGF0YSAoZG8gbm90IHVzZSAkVkFSMSwgYnV0ICRUZW1wbGF0ZURhdGEgZm9yIER1bXBlciBvdXRwdXQpCiAgICBteSAkU2VyaWFsaXplZERhdGEgPSAkU2VsZi0+e01haW5PYmplY3R9LT5EdW1wKCAkT3JpZ2luYWxEYXRhLCAnYmluYXJ5JyApOwoKICAgIHJldHVybiAkU2VyaWFsaXplZERhdGE7Cn0KCj1pdGVtIERlU2VyaWFsaXplKCkKCkRlU2VyaWFsaXplKCkgaXMgYSB3cmFwcGVyIGZvciBhbGwgdGhlIF9YWFhBZGQgbWV0aG9kcy4KCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+RGVTZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgV29ya09yZGVyQWRkCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgTWV0aG9kICAgPT4gJ1dvcmtPcmRlckFkZCcsCiAgICApOwoKPWN1dAoKc3ViIERlU2VyaWFsaXplIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBNZXRob2QgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkaXNwYXRjaCB0YWJsZQogICAgbXkgJU1ldGhvZDJTdWIgPSAoCiAgICAgICAgV29ya09yZGVyQWRkICA9PiAnX1dvcmtPcmRlckFkZCcsCiAgICAgICAgQXR0YWNobWVudEFkZCA9PiAnX0F0dGFjaG1lbnRBZGQnLAogICAgICAgIExpbmtBZGQgICAgICAgPT4gJ19MaW5rQWRkJywKICAgICk7CgogICAgbXkgJFN1YiA9ICRNZXRob2QyU3VieyAkUGFyYW17TWV0aG9kfSB9OwoKICAgIGlmICggISRTdWIgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIE1ldGhvZG5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPiRTdWIoJVBhcmFtKTsKfQoKPWl0ZW0gX1dvcmtPcmRlckFkZCgpCgpDcmVhdGVzIGEgbmV3IHdvcmtvcmRlciBiYXNlZCBvbiBhIHRlbXBsYXRlLiBJdCByZXR1cm5zIHRoZQpjaGFuZ2UgaWQgaXQgd2FzIGNyZWF0ZWQgZm9yIGFuZCB0aGUgbmV3IHdvcmtvcmRlciBpZC4KCiAgICBteSAoICRDaGFuZ2VJRCwgJFdvcmtPcmRlcklEICkgPSAkVGVtcGxhdGVPYmplY3QtPl9Xb3JrT3JkZXJBZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICd0ZXN0JywKICAgICAgICB9LAogICAgICAgIENoYW5nZUlEICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1dvcmtPcmRlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgQ2hhbmdlSUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBtYWtlIGEgbG9jYWwgY29weQogICAgbXkgJURhdGEgPSAleyAkUGFyYW17RGF0YX0gfTsKCiAgICAjIHdlIG5lZWQgdGhlIG9sZCBjaGFuZ2UgaWQgZm9yIGV4cHJlc3Npb25zCiAgICBteSAkT2xkV29ya09yZGVySUQgPSAkRGF0YXtXb3JrT3JkZXJJRH07CgogICAgIyB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSwgc28gZG9uJ3QgcGFzcyB0aGVtIHRvIFdvcmtPcmRlckFkZCgpCiAgICBkZWxldGUgQERhdGF7cXcoV29ya09yZGVySUQgV29ya09yZGVyTnVtYmVyIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSl9OwogICAgZGVsZXRlIEBEYXRhe3F3KEluc3RydWN0aW9uUGxhaW4gUmVwb3J0UGxhaW4pfTsKCiAgICAjIGRlbGV0ZSBhbGwgcGFyYW1ldGVycyB3aG9zZSB2YWx1ZXMgYXJlICd1bmRlZicKICAgICMgX0NoZWNrV29ya09yZGVyUGFyYW1zIHRocm93cyBhbiBlcnJvciBvdGhlcndpc2UKICAgIGZvciBteSAkUGFyYW1ldGVyICgga2V5cyAlRGF0YSApIHsKICAgICAgICBkZWxldGUgJERhdGF7JFBhcmFtZXRlcn0gaWYgIWRlZmluZWQgJERhdGF7JFBhcmFtZXRlcn07CiAgICB9CgogICAgIyB4eHgoPzpTdGFydHxFbmQpVGltZXMgYXJlIGVtcHR5IHN0cmluZ3Mgb24gV29ya09yZGVyR2V0IHdoZW4KICAgICMgbm8gdGltZSB2YWx1ZSBpcyBzZXQuIFRoaXMgY29uZnVzZXMgX0NoZWNrVGltZXN0YW1wcy4gVGh1cwogICAgIyBkZWxldGUgdGhlc2UgcGFyYW1ldGVycy4KICAgIGZvciBteSAkUHJlZml4IChxdyhBY3R1YWwgUGxhbm5lZCkpIHsKICAgICAgICBmb3IgbXkgJFN1ZmZpeCAocXcoU3RhcnQgRW5kKSkgewogICAgICAgICAgICBpZiAoICREYXRheyIkUHJlZml4JHtTdWZmaXh9VGltZSJ9IGVxICcnICkgewogICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyIkUHJlZml4JHtTdWZmaXh9VGltZSJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbW92ZSB0aW1lIHNsb3QgZm9yIHdvcmtvcmRlciBpZgogICAgbXkgJERpZmZlcmVuY2UgPSAkUGFyYW17VGltZURpZmZlcmVuY2V9OwogICAgaWYgKCAkRGlmZmVyZW5jZSB8fCAkUGFyYW17TmV3VGltZUluRXBvY2hlfSApIHsKCiAgICAgICAgIyBjYWxjIG5ldyB2YWx1ZXMgZm9yIHN0YXJ0IGFuZCBlbmQgdGltZQogICAgICAgIGZvciBteSAkU3VmZml4IChxdyhTdGFydCBFbmQpKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7IlBsYW5uZWQke1N1ZmZpeH1UaW1lIn0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZGlmZmVyZW5jZSBpZiBub3QgYWxyZWFkeSBjYWxjdWxhdGVkCiAgICAgICAgICAgICAgICBpZiAoICEkRGlmZmVyZW5jZSAmJiAkUGFyYW17TmV3VGltZUluRXBvY2hlfSApIHsKICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9ICRTZWxmLT5fR2V0VGltZURpZmZlcmVuY2UoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICAgICA9PiAkRGF0YXsiUGxhbm5lZCR7U3VmZml4fVRpbWUifSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV3VGltZUluRXBvY2hlID0+ICRQYXJhbXtOZXdUaW1lSW5FcG9jaGV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgbmV3IHZhbHVlCiAgICAgICAgICAgICAgICAkRGF0YXsiUGxhbm5lZCR7U3VmZml4fVRpbWUifSA9ICRTZWxmLT5fTW92ZVRpbWUoCiAgICAgICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgPT4gJERhdGF7IlBsYW5uZWQke1N1ZmZpeH1UaW1lIn0sCiAgICAgICAgICAgICAgICAgICAgRGlmZmVyZW5jZSAgPT4gJERpZmZlcmVuY2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICAjIG92ZXJyaWRlIHRoZSBjaGFuZ2UgaWQgZnJvbSB0aGUgdGVtcGxhdGUKICAgIG15ICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQWRkKAogICAgICAgICVEYXRhLAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtDaGFuZ2VJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgd2UgbmVlZCBhIG1hcHBpbmcgIm9sZCBpZCIgdG8gIm5ldyBpZCIgZm9yIHRoZSBjb25kaXRpb25zCiAgICBteSAkT2xkSURzMk5ld0lEcyA9IHsKICAgICAgICAleyAkUGFyYW17T2xkV29ya09yZGVySURzfSB8fCB7fSB9LAogICAgICAgICRPbGRXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICB9OwoKICAgIG15ICVJbmZvID0gKAogICAgICAgIElEICAgICAgICAgICAgICA9PiAkV29ya09yZGVySUQsCiAgICAgICAgV29ya09yZGVySUQgICAgID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBDaGFuZ2VJRCAgICAgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBPbGRXb3JrT3JkZXJJRHMgPT4gJE9sZElEczJOZXdJRHMsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0dldFRpbWVEaWZmZXJlbmNlKCkKCklmIGEgbmV3IHBsYW5uZWQgc3RhcnQvZW5kIHRpbWUgd2FzIGdpdmVuLCB0aGUgZGlmZmVyZW5jZSBpcyBuZWVkZWQKdG8gbW92ZSBhbGwgdGltZSB2YWx1ZXMKCiAgICBteSAkRGlmZkluU2Vjb25kcyA9ICRUZW1wbGF0ZU9iamVjdC0+X0dldFRpbWVEaWZmZXJlbmNlKAogICAgICAgIEN1cnJlbnRUaW1lICAgICA9PiAnMjAxMC0wMS0xMiAwMDowMDowMCcsCiAgICAgICAgTmV3VGltZUluRXBvY2hlID0+IDEyMzQ1Njc4OTAsCiAgICApOwoKPWN1dAoKc3ViIF9HZXRUaW1lRGlmZmVyZW5jZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDdXJyZW50VGltZSBOZXdUaW1lSW5FcG9jaGUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSBhcyB0aW1lc3RhbXAKICAgIG15ICRDdXJyZW50U3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17Q3VycmVudFRpbWV9LAogICAgKTsKCiAgICBteSAkRGlmZlNlY29uZHMgPSAkUGFyYW17TmV3VGltZUluRXBvY2hlfSAtICRDdXJyZW50U3lzdGVtVGltZTsKCiAgICByZXR1cm4gJERpZmZTZWNvbmRzOwp9Cgo9aXRlbSBfTW92ZVRpbWUoKQoKVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3IHZhbHVlIGZvciBhIHRpbWUgY29sdW1uIGJhc2VkIG9uIHRoZQpkaWZmZXJlbmNlLgoKICAgIG15ICRUaW1lVmFsdWUgPSAkVGVtcGxhdGVPYmplY3QtPl9Nb3ZlVGltZSgKICAgICAgICBDdXJyZW50VGltZSA9PiAnMjAxMC0wMS0xMiAwMDowMDowMCcsCiAgICAgICAgRGlmZmVyZW5jZSAgPT4gMTM1LCAgICAgICAgICAgICAgICAgICAgICMgaW4gc2Vjb25kcwogICAgKTsKCj1jdXQKCnN1YiBfTW92ZVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VycmVudFRpbWUgRGlmZmVyZW5jZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3VycmVudCB0aW1lIGFzIHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtDdXJyZW50VGltZX0sCiAgICApOwoKICAgICMgZ2V0IHBsYW5uZWQgdGltZSBhcyB0aW1lc3RhbXAKICAgIG15ICROZXdUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkQ3VycmVudFN5c3RlbVRpbWUgKyAkUGFyYW17RGlmZmVyZW5jZX0sCiAgICApOwoKICAgIHJldHVybiAkTmV3VGltZTsKfQoKPWl0ZW0gX0F0dGFjaG1lbnRBZGQoKQoKQ3JlYXRlcyBuZXcgYXR0YWNobWVudHMgZm9yIGEgY2hhbmdlIG9yIGEgd29ya29yZGVyIGJhc2VkIG9uIHRoZSBnaXZlbiB0ZW1wbGF0ZS4gSXQKcmV0dXJucyBhIGhhc2ggb2YgaW5mb3JtYXRpb24gKHdpdGgganVzdCBvbmUga2V5IC0gIlN1Y2Nlc3MiKQoKICAgIG15ICVJbmZvID0gJFRlbXBsYXRlT2JqZWN0LT5fQXR0YWNobWVudEFkZCgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgIyAuLi4gUGFyYW1zIGZvciBBdHRhY2htZW50QWRkCiAgICAgICAgfSwKICAgICAgICBDaGFuZ2VJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9BdHRhY2htZW50QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFVzZXJJRCBDaGFuZ2VJRCBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXR0YWNobWVudCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudEdldCgKICAgICAgICBGaWxlSUQgPT4gJFBhcmFte0RhdGF9LT57RmlsZUlEfSwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnRBZGQoCiAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gJFBhcmFte0NoYW5nZUlEfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17V29ya09yZGVySUR9LAogICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlSW5mbyA9ICgKICAgICAgICBTdWNjZXNzID0+ICRTdWNjZXNzLAogICAgKTsKCiAgICByZXR1cm4gJUluZm87Cn0KCj1pdGVtIF9MaW5rQWRkKCkKCkNyZWF0ZXMgbmV3IGxpbmtzIGZvciBhIGNoYW5nZSBvciBhIHdvcmtvcmRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGVtcGxhdGUuIEl0CnJldHVybnMgYSBoYXNoIG9mIGluZm9ybWF0aW9uICh3aXRoIGp1c3Qgb25lIGtleSAtICJTdWNjZXNzIikKCiAgICBteSAlSW5mbyA9ICRUZW1wbGF0ZU9iamVjdC0+X0xpbmtBZGQoCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICMgLi4uIFBhcmFtcyBmb3IgTGlua0FkZAogICAgICAgIH0sCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gMSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAxMjMsICMgb3B0aW9uYWwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfTGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhVc2VySUQgRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFNvdXJjZUtleTsKCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1NvdXJjZU9iamVjdH0gZXEgJ0lUU01DaGFuZ2UnICkgewogICAgICAgICRTb3VyY2VLZXkgPSAkUGFyYW17Q2hhbmdlSUR9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RGF0YX0tPntTb3VyY2VPYmplY3R9IGVxICdJVFNNV29ya09yZGVyJyApIHsKICAgICAgICAkU291cmNlS2V5ID0gJFBhcmFte1dvcmtPcmRlcklEfTsKICAgIH0KCiAgICBpZiAoICEkU291cmNlS2V5ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXb3JrT3JkZXJJRCBvciBDaGFuZ2VJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICAleyAkUGFyYW17RGF0YX0gfSwKICAgICAgICBTb3VyY2VLZXkgPT4gJFNvdXJjZUtleSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVJbmZvID0gKAogICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICApOwoKICAgIHJldHVybiAlSW5mbzsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAxMC8wNi8yOSAxMjo1NjozMSAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9JVFNNQ2hhbmdlLnBtIC0gdG8gbGluayBjaGFuZ2Ugb2JqZWN0cwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZS5wbSx2IDEuNiAyMDEwLzAyLzA0IDEyOjA0OjU2IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDo6SVRTTUNoYW5nZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgTGlua09iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0xpc3RXaXRoRGF0YSgpCgpmaWxsIHVwIHRoZSBsaW5rIGxpc3Qgd2l0aCBkYXRhCgogICAgJFN1Y2Nlc3MgPSAkTGlua09iamVjdEJhY2tlbmQtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgTGlua0xpc3QgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0xpc3RXaXRoRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhMaW5rTGlzdCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbGluayBsaXN0CiAgICBpZiAoIHJlZiAkUGFyYW17TGlua0xpc3R9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xpbmtMaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0gfSApIHsKCiAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9IH0gKSB7CgogICAgICAgICAgICBDSEFOR0VJRDoKICAgICAgICAgICAgZm9yIG15ICRDaGFuZ2VJRCAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgaWQgZnJvbSBoYXNoIGlmIENoYW5nZUdldCgpIHJldHVybnMgbm8gcmVzdWx0cwogICAgICAgICAgICAgICAgaWYgKCAhJENoYW5nZURhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskQ2hhbmdlSUR9OwogICAgICAgICAgICAgICAgICAgIG5leHQgQ0hBTkdFSUQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgY2hhbmdlIGRhdGEKICAgICAgICAgICAgICAgICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskQ2hhbmdlSUR9ID0gJENoYW5nZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdERlc2NyaXB0aW9uR2V0KCkKCnJldHVybiBhIGhhc2ggb2Ygb2JqZWN0IGRlc2NyaXB0aW9ucwoKUmV0dXJuCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICJDaGFuZ2UjIDIwMDkxMDIxMTAwMDE2NzQiLAogICAgICAgIExvbmcgICA9PiAiQ2hhbmdlIyAyMDA5MTAyMTEwMDAxNjc0OiBUaGUgQ2hhbmdlIFRpdGxlIiwKICAgICk7CgogICAgJURlc2NyaXB0aW9uID0gJExpbmtPYmplY3QtPk9iamVjdERlc2NyaXB0aW9uR2V0KAogICAgICAgIEtleSAgICAgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGVzY3JpcHRpb25HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICBteSAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICdDaGFuZ2UnLAogICAgICAgIExvbmcgICA9PiAnQ2hhbmdlJywKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbiBpZiAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDaGFuZ2VEYXRhOwogICAgcmV0dXJuIGlmICEleyRDaGFuZ2VEYXRhfTsKCiAgICAjIGRlZmluZSBkZXNjcmlwdGlvbiB0ZXh0CiAgICBteSAkQ2hhbmdlSG9vayAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6Okhvb2snKTsKICAgIG15ICREZXNjcmlwdGlvblRleHQgPSAiJENoYW5nZUhvb2sgJENoYW5nZURhdGEtPntDaGFuZ2VOdW1iZXJ9IjsKCiAgICAjIGNyZWF0ZSBkZXNjcmlwdGlvbgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAkRGVzY3JpcHRpb25UZXh0LAogICAgICAgIExvbmcgICA9PiAiJERlc2NyaXB0aW9uVGV4dDogJENoYW5nZURhdGEtPntDaGFuZ2VUaXRsZX0iLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uOwp9Cgo9aXRlbSBPYmplY3RTZWFyY2goKQoKcmV0dXJuIGEgaGFzaCBsaXN0IG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkU2VhcmNoTGlzdCA9IHsKICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAzMzIgPT4gJERhdGFPZkl0ZW0zMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgJFNlYXJjaExpc3QgPSAkTGlua09iamVjdEJhY2tlbmQtPk9iamVjdFNlYXJjaCgKICAgICAgICBTZWFyY2hQYXJhbXMgPT4gJEhhc2hSZWYsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgcGFyYW1zCiAgICAkUGFyYW17U2VhcmNoUGFyYW1zfSB8fD0ge307CgogICAgIyBhZGQgd2lsZGNhcmRzCiAgICBteSAlU2VhcmNoOwogICAgZm9yIG15ICRFbGVtZW50IChxdyhDaGFuZ2VOdW1iZXIgQ2hhbmdlVGl0bGUgV29ya09yZGVyVGl0bGUpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VhcmNoUGFyYW1zfS0+eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgJFNlYXJjaHskRWxlbWVudH0gPSAnKicgLiAkUGFyYW17U2VhcmNoUGFyYW1zfS0+eyRFbGVtZW50fSAuICcqJzsKICAgICAgICB9CiAgICB9CgogICAgIyBzZWFyY2ggdGhlIGNoYW5nZXMKICAgICMgbm8gbmVlZCB0byB1c2UgT3JkZXJCeSBoZXJlLCBiZWNhdXNlIGl0IGlzIHNvcnRlZCBpbiBUYWJsZUNyZWF0ZUNvbXBsZXggYW5kIFRhYmxlQ3JlYXRlU2ltcGxlCiAgICBteSAkQ2hhbmdlSURzUmVmID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgJXsgJFBhcmFte1NlYXJjaFBhcmFtc30gfSwKICAgICAgICAlU2VhcmNoLAogICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDEsCgogICAgICAgICMgVE9ETzoKICAgICAgICAjIHVzZSBzeXNjb25maWcgb3B0aW9uIGZvciAnbGltaXQnIGluc3RlYWQsIGRlY2lkZSB3aGVhdGVyIHRoaXMgb3B0aW9uIHdvdWxkIGJlIG9ubHkKICAgICAgICAjIHZhbGlkIGZvciBsaW5raW5nIGNoYW5nZXMsIG9yIGp1c3QgdXNlIGEgZ2xvYmFsIHNldHRpbmcgZm9yIGFsbCBsaW5raW5nIHN0dWZmCiAgICAgICAgTGltaXQgPT4gMjAwLAoKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15ICVTZWFyY2hMaXN0OwogICAgQ0hBTkdFSUQ6CiAgICBmb3IgbXkgJENoYW5nZUlEICggQHskQ2hhbmdlSURzUmVmfSApIHsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgICAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgQ2hhbmdlSUQgaWYgISRDaGFuZ2VEYXRhOwoKICAgICAgICAjIGFkZCBjaGFuZ2UgZGF0YQogICAgICAgICRTZWFyY2hMaXN0e05PVExJTktFRH0tPntTb3VyY2V9LT57JENoYW5nZUlEfSA9ICRDaGFuZ2VEYXRhOwogICAgfQoKICAgIHJldHVybiBcJVNlYXJjaExpc3Q7Cn0KCj1pdGVtIExpbmtBZGRQcmUoKQoKbGluayBhZGQgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkUHJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rQWRkUG9zdCgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZFBvc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgIyBnZXQgaW5mb3JtYXRpb24gYWJvdXQgbGlua2VkIG9iamVjdAogICAgbXkgJElEICAgICA9ICRQYXJhbXtUYXJnZXRLZXl9ICAgIHx8ICRQYXJhbXtTb3VyY2VLZXl9OwogICAgbXkgJE9iamVjdCA9ICRQYXJhbXtUYXJnZXRPYmplY3R9IHx8ICRQYXJhbXtTb3VyY2VPYmplY3R9OwoKICAgICMgdHJpZ2dlciBDaGFuZ2VMaW5rQWRkUG9zdC1FdmVudAogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NoYW5nZUxpbmtBZGRQb3N0JywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0LCAgICAgICAgICMgdGhlIG90aGVyIG9iamVjdCBvZiB0aGUgbGluawogICAgICAgICAgICBJRCAgICAgICA9PiAkSUQsICAgICAgICAgICAgICMgaWQgb2YgdGhlIG90aGVyIG9iamVjdAogICAgICAgICAgICBUeXBlICAgICA9PiAkUGFyYW17VHlwZX0sICAgICMgdGhlIGxpbmsgdHlwZQogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUHJlKCkKCmxpbmsgZGVsZXRlIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0RlbGV0ZVByZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IHRyaWdnZXIgZXZlbnQgZm9yIHRlbXBvcmFyeSBsaW5rcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTGlua0RlbGV0ZVBvc3QoKQoKbGluayBkZWxldGUgcG9zdCBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IHRyaWdnZXIgZXZlbnQgZm9yIHRlbXBvcmFyeSBsaW5rcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBpbmZvcm1hdGlvbiBhYm91dCBsaW5rZWQgb2JqZWN0CiAgICBteSAkSUQgICAgID0gJFBhcmFte1RhcmdldEtleX0gICAgfHwgJFBhcmFte1NvdXJjZUtleX07CiAgICBteSAkT2JqZWN0ID0gJFBhcmFte1RhcmdldE9iamVjdH0gfHwgJFBhcmFte1NvdXJjZU9iamVjdH07CgogICAgIyB0cmlnZ2VyIENoYW5nZUxpbmtEZWxldGVQb3N0LUV2ZW50CiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2hhbmdlTGlua0RlbGV0ZVBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIE9iamVjdCAgID0+ICRPYmplY3QsICAgICAgICAgIyB0aGUgb3RoZXIgb2JqZWN0IG9mIHRoZSBsaW5rCiAgICAgICAgICAgIElEICAgICAgID0+ICRJRCwgICAgICAgICAgICAgIyBpZCBvZiB0aGUgb3RoZXIgb2JqZWN0CiAgICAgICAgICAgIFR5cGUgICAgID0+ICRQYXJhbXtUeXBlfSwgICAgIyB0aGUgbGluayB0eXBlCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC9JVFNNV29ya09yZGVyLnBtIC0gdG8gbGluayB3b3Jrb3JkZXIgb2JqZWN0cwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTVdvcmtPcmRlci5wbSx2IDEuMTMgMjAxMC8wMi8wOCAxNDoyODowNCBiZXMgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OklUU01Xb3JrT3JkZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IExpbmtPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBMaW5rTGlzdFdpdGhEYXRhKCkKCmZpbGwgdXAgdGhlIGxpbmsgbGlzdCB3aXRoIGRhdGEKCiAgICAkU3VjY2VzcyA9ICRMaW5rT2JqZWN0QmFja2VuZC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBMaW5rTGlzdCA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rTGlzdFdpdGhEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExpbmtMaXN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIGlmICggcmVmICRQYXJhbXtMaW5rTGlzdH0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTGlua0xpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fSB9ICkgewoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0gfSApIHsKCiAgICAgICAgICAgIFdPUktPUkRFUklEOgogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICgga2V5cyAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBpZCBmcm9tIGhhc2ggaWYgV29ya09yZGVyR2V0KCkgcmV0dXJucyBubyByZXN1bHRzCiAgICAgICAgICAgICAgICBpZiAoICEkV29ya09yZGVyRGF0YSApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufS0+eyRXb3JrT3JkZXJJRH07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBXT1JLT1JERVJJRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBjaGFuZ2UgZGF0YSBmb3IgdGhpcyB3b3Jrb3JkZXIKICAgICAgICAgICAgICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdvcmtvcmRlciBpZCBmcm9tIGhhc2ggaWYgY2hhbmdlIGZvciB0aGlzIHdvcmtvcmRlciByZXR1cm5zIG5vIHJlc3VsdHMKICAgICAgICAgICAgICAgIGlmICggISRDaGFuZ2VEYXRhICkgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JFdvcmtPcmRlcklEfTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFdPUktPUkRFUklEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBjaGFuZ2UgZGF0YSB0byB3b3Jrb3JkZXIgZGF0YQogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAoCiAgICAgICAgICAgICAgICAgICAgJXskV29ya09yZGVyRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRGF0YSA9PiAkQ2hhbmdlRGF0YSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgd29ya29yZGVyIGRhdGEKICAgICAgICAgICAgICAgICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskV29ya09yZGVySUR9ID0gXCVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBPYmplY3REZXNjcmlwdGlvbkdldCgpCgpyZXR1cm4gYSBoYXNoIG9mIG9iamVjdCBkZXNjcmlwdGlvbnMKClJldHVybgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAiV29ya29yZGVyIyAyMDA5MTAyMTEwMDAxNjc0LTEiLAogICAgICAgIExvbmcgICA9PiAiV29ya29yZGVyIyAyMDA5MTAyMTEwMDAxNjc0LTE6IFRoZSBXb3Jrb3JkZXIgVGl0bGUiLAogICAgKTsKCiAgICAlRGVzY3JpcHRpb24gPSAkTGlua09iamVjdC0+T2JqZWN0RGVzY3JpcHRpb25HZXQoCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJ1dvcmtvcmRlcicsCiAgICAgICAgTG9uZyAgID0+ICdXb3Jrb3JkZXInLAogICAgKTsKCiAgICByZXR1cm4gJURlc2NyaXB0aW9uIGlmICRQYXJhbXtNb2RlfSAmJiAkUGFyYW17TW9kZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgIyBnZXQgd29ya29yZGVyIGRhdGEKICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJFdvcmtPcmRlckRhdGE7CiAgICByZXR1cm4gaWYgISV7JFdvcmtPcmRlckRhdGF9OwoKICAgICMgZ2V0IGNoYW5nZSBkYXRhIGZvciB0aGlzIHdvcmtvcmRlcgogICAgbXkgJENoYW5nZURhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ2hhbmdlRGF0YTsKICAgIHJldHVybiBpZiAhJXskQ2hhbmdlRGF0YX07CgogICAgIyBkZWZpbmUgZGVzY3JpcHRpb24gdGV4dAogICAgbXkgJFdvcmtPcmRlckhvb2sgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVdvcmtPcmRlcjo6SG9vaycpOwogICAgbXkgJERlc2NyaXB0aW9uVGV4dAogICAgICAgID0gIiRXb3JrT3JkZXJIb29rICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfS0kV29ya09yZGVyRGF0YS0+e1dvcmtPcmRlck51bWJlcn0iOwoKICAgICMgY3JlYXRlIGRlc2NyaXB0aW9uCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICREZXNjcmlwdGlvblRleHQsCiAgICAgICAgTG9uZyAgID0+ICIkRGVzY3JpcHRpb25UZXh0OiAkV29ya09yZGVyRGF0YS0+e1dvcmtPcmRlclRpdGxlfSIsCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb247Cn0KCj1pdGVtIE9iamVjdFNlYXJjaCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2YgdGhlIHNlYXJjaCByZXN1bHRzCgpSZXR1cm4KICAgICRTZWFyY2hMaXN0ID0gewogICAgICAgIE5PVExJTktFRCA9PiB7CiAgICAgICAgICAgIFNvdXJjZSA9PiB7CiAgICAgICAgICAgICAgICAxMiAgPT4gJERhdGFPZkl0ZW0xMiwKICAgICAgICAgICAgICAgIDIxMiA9PiAkRGF0YU9mSXRlbTIxMiwKICAgICAgICAgICAgICAgIDMzMiA9PiAkRGF0YU9mSXRlbTMzMiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICAkU2VhcmNoTGlzdCA9ICRMaW5rT2JqZWN0QmFja2VuZC0+T2JqZWN0U2VhcmNoKAogICAgICAgIFNlYXJjaFBhcmFtcyA9PiAkSGFzaFJlZiwgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdFNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBwYXJhbXMKICAgICRQYXJhbXtTZWFyY2hQYXJhbXN9IHx8PSB7fTsKCiAgICAjIGFkZCB3aWxkY2FyZHMKICAgIG15ICVTZWFyY2g7CiAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KENoYW5nZU51bWJlciBDaGFuZ2VUaXRsZSBXb3JrT3JkZXJUaXRsZSkpIHsKICAgICAgICBpZiAoICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57JEVsZW1lbnR9ICkgewogICAgICAgICAgICAkU2VhcmNoeyRFbGVtZW50fSA9ICcqJyAuICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57JEVsZW1lbnR9IC4gJyonOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNlYXJjaCB0aGUgd29ya29yZGVycwogICAgIyBubyBuZWVkIHRvIHVzZSBPcmRlckJ5IGhlcmUsIGJlY2F1c2UgaXQgaXMgc29ydGVkIGluIFRhYmxlQ3JlYXRlQ29tcGxleCBhbmQgVGFibGVDcmVhdFNpbXBsZQogICAgbXkgJFdvcmtPcmRlcklEc1JlZiA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU2VhcmNoKAogICAgICAgICV7ICRQYXJhbXtTZWFyY2hQYXJhbXN9IH0sCiAgICAgICAgJVNlYXJjaCwKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAxLAoKICAgICAgICAjIFRPRE86CiAgICAgICAgIyB1c2Ugc3lzY29uZmlnIG9wdGlvbiBmb3IgJ2xpbWl0JyBpbnN0ZWFkLCBkZWNpZGUgd2hlYXRlciB0aGlzIG9wdGlvbiB3b3VsZCBiZSBvbmx5CiAgICAgICAgIyB2YWxpZCBmb3IgbGlua2luZyB3b3Jrb3JkZXJzLCBvciBqdXN0IHVzZSBhIGdsb2JhbCBzZXR0aW5nIGZvciBhbGwgbGlua2luZyBzdHVmZgogICAgICAgIExpbWl0ID0+IDIwMCwKCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBteSAlU2VhcmNoTGlzdDsKICAgIFdPUktPUkRFUklEOgogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7JFdvcmtPcmRlcklEc1JlZn0gKSB7CgogICAgICAgICMgZ2V0IHdvcmtvcmRlciBkYXRhCiAgICAgICAgbXkgJFdvcmtPcmRlckRhdGEgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFdPUktPUkRFUklEIGlmICEkV29ya09yZGVyRGF0YTsKCiAgICAgICAgIyBnZXQgY2hhbmdlIGRhdGEgZm9yIHRoaXMgd29ya29yZGVyCiAgICAgICAgbXkgJENoYW5nZURhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckRhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgV09SS09SREVSSUQgaWYgISRDaGFuZ2VEYXRhOwoKICAgICAgICAjIGFkZCB0aGUgY2hhbmdlIGRhdGEgdG8gd29ya29yZGVyIGRhdGEKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgJXskV29ya09yZGVyRGF0YX0sCiAgICAgICAgICAgIENoYW5nZURhdGEgPT4gJENoYW5nZURhdGEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgd29ya29yZGVyIGRhdGEKICAgICAgICAkU2VhcmNoTGlzdHtOT1RMSU5LRUR9LT57U291cmNlfS0+eyRXb3JrT3JkZXJJRH0gPSBcJURhdGE7CiAgICB9CgogICAgcmV0dXJuIFwlU2VhcmNoTGlzdDsKfQoKPWl0ZW0gTGlua0FkZFByZSgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIG5vdCB0cmlnZ2VyIGV2ZW50IGZvciB0ZW1wb3JhcnkgbGlua3MKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtBZGRQb3N0KCkKCmxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgU291cmNlS2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkUG9zdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gbm90IHRyaWdnZXIgZXZlbnQgZm9yIHRlbXBvcmFyeSBsaW5rcwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1N0YXRlfSBlcSAnVGVtcG9yYXJ5JzsKCiAgICAjIGdldCBpbmZvcm1hdGlvbiBhYm91dCBsaW5rZWQgb2JqZWN0CiAgICBteSAkSUQgICAgID0gJFBhcmFte1RhcmdldEtleX0gICAgfHwgJFBhcmFte1NvdXJjZUtleX07CiAgICBteSAkT2JqZWN0ID0gJFBhcmFte1RhcmdldE9iamVjdH0gfHwgJFBhcmFte1NvdXJjZU9iamVjdH07CgogICAgIyB0cmlnZ2VyIFdvcmtPcmRlckxpbmtBZGRQb3N0LUV2ZW50CiAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnV29ya09yZGVyTGlua0FkZFBvc3QnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIE9iamVjdCAgICAgID0+ICRPYmplY3QsICAgICAgICAgIyB0aGUgb3RoZXIgb2JqZWN0IG9mIHRoZSBsaW5rCiAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJRCwgICAgICAgICAgICAgIyBpZCBvZiB0aGUgb3RoZXIgb2JqZWN0CiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICRQYXJhbXtUeXBlfSwgICAgIyB0aGUgbGluayB0eXBlCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFRhcmdldEtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rRGVsZXRlUHJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlUG9zdCgpCgpsaW5rIGRlbGV0ZSBwb3N0IGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkbyBub3QgdHJpZ2dlciBldmVudCBmb3IgdGVtcG9yYXJ5IGxpbmtzCiAgICByZXR1cm4gMSBpZiAkUGFyYW17U3RhdGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGxpbmtlZCBvYmplY3QKICAgIG15ICRJRCAgICAgPSAkUGFyYW17VGFyZ2V0S2V5fSAgICB8fCAkUGFyYW17U291cmNlS2V5fTsKICAgIG15ICRPYmplY3QgPSAkUGFyYW17VGFyZ2V0T2JqZWN0fSB8fCAkUGFyYW17U291cmNlT2JqZWN0fTsKCiAgICAjIHRyaWdnZXIgV29ya09yZGVyTGlua0RlbGV0ZVBvc3QtRXZlbnQKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdXb3JrT3JkZXJMaW5rRGVsZXRlUG9zdCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgT2JqZWN0ICAgICAgPT4gJE9iamVjdCwgICAgICAgICAjIHRoZSBvdGhlciBvYmplY3Qgb2YgdGhlIGxpbmsKICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJElELCAgICAgICAgICAgICAjIGlkIG9mIHRoZSBvdGhlciBvYmplY3QKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJFBhcmFte1R5cGV9LCAgICAjIHRoZSBsaW5rIHR5cGUKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSAtIGFsbCBhZHZpY2UgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlTWFuYWdlbWVudC5wbSx2IDEuMTEgMjAxMC8wMi8yMiAxMDowOToxMCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNQ2hhbmdlTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IFRpbWVPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50JzsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjaGFuZ2Ugc3RhdGUgbGlzdAogICAgbXkgJENoYW5nZVN0YXRlcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJUNoYW5nZVN0YXRlTGlzdCA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7JENoYW5nZVN0YXRlc307CgogICAgIyBnZXQgY2lwIGxpc3RzCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdDYXRlZ29yeScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJUNhdGVnb3J5TGlzdCA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7JENhdGVnb3JpZXN9OwoKICAgIG15ICRJbXBhY3RzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICBUeXBlICAgPT4gJ0ltcGFjdCcsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJUltcGFjdExpc3QgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0gfSBAeyRJbXBhY3RzfTsKCiAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdQcmlvcml0eScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJVByaW9yaXR5TGlzdCA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7JFByaW9yaXRpZXN9OwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzQ4NzAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2hhbmdlIFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJUNoYW5nZVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDYXRlZ29yeUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ2F0ZWdvcnlMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0ltcGFjdCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0ltcGFjdElEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVJbXBhY3RMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUaW1lcGVyaW9kJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVGltZVBlcmlvZCcsCiAgICAgICAgICAgIFRpbWVQZXJpb2RGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsICAgICMgJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVGltZVN0b3AgICAgICAgICA9PiAkVG9kYXksCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnQ3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNlYXJjaCB0aWNrZXRzCiAgICByZXR1cm4gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0NPVU5UJywKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICAlUGFyYW0sCiAgICApOwp9CgpzdWIgRXhwb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgd3JhcCBpZHMgdG8gdXNlZCBzcGVsbGluZwogICAgZm9yIG15ICRVc2UgKHF3KFVzZUFzVmFsdWVTZXJpZXMgVXNlQXNSZXN0cmljdGlvbiBVc2VBc1h2YWx1ZSkpIHsKICAgICAgICBFTEVNRU5UOgogICAgICAgIGZvciBteSAkRWxlbWVudCAoIEB7ICRQYXJhbXskVXNlfSB9ICkgewoKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudDsKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIG15ICRFbGVtZW50TmFtZSA9ICRFbGVtZW50LT57RWxlbWVudH07CiAgICAgICAgICAgIG15ICRWYWx1ZXMgICAgICA9ICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwoKICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJ1N0YXRlSURzJyApIHsKICAgICAgICAgICAgICAgIG15ICRTdGF0ZUxpc3QgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KCBVc2VySUQgPT4gMSApOwogICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkSUQ7CgogICAgICAgICAgICAgICAgICAgIFNUQVRFOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkU3RhdGUgKCBAeyRTdGF0ZUxpc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFNUQVRFIGlmICRJRC0+e0NvbnRlbnR9IG5lICRTdGF0ZS0+e0tleX07CiAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJFN0YXRlLT57VmFsdWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJEVsZW1lbnROYW1lIGVxICdDYXRlZ29yeUlEcycgfHwgJEVsZW1lbnROYW1lIGVxICdJbXBhY3RJRHMnCiAgICAgICAgICAgICAgICB8fCAkRWxlbWVudE5hbWUgZXEgJ1ByaW9yaXR5SURzJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAoJFR5cGUpID0gJEVsZW1lbnROYW1lID1+IG17IFxBICguKj8pIElEcyBceiB9eG1zOwoKICAgICAgICAgICAgICAgIG15ICRDSVBMaXN0ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZUNJUEdldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICBFTEVNRU5UOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIEB7JENJUExpc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgJElELT57Q29udGVudH0gbmUgJEVsZW1lbnQtPntLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRFbGVtZW50LT57VmFsdWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVBhcmFtOwp9CgpzdWIgSW1wb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgd3JhcCB1c2VkIHNwZWxsaW5nIHRvIGlkcwogICAgZm9yIG15ICRVc2UgKHF3KFVzZUFzVmFsdWVTZXJpZXMgVXNlQXNSZXN0cmljdGlvbiBVc2VBc1h2YWx1ZSkpIHsKICAgICAgICBFTEVNRU5UOgogICAgICAgIGZvciBteSAkRWxlbWVudCAoIEB7ICRQYXJhbXskVXNlfSB9ICkgewoKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudDsKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIG15ICRFbGVtZW50TmFtZSA9ICRFbGVtZW50LT57RWxlbWVudH07CiAgICAgICAgICAgIG15ICRWYWx1ZXMgICAgICA9ICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwoKICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJ1N0YXRlSURzJyApIHsKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICBteSAkU3RhdGVJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICRJRC0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRTdGF0ZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJFN0YXRlSUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0OiBDYW4nIGZpbmQgc3RhdGUgJElELT57Q29udGVudH0hIgogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkSUQgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaW1wb3J0IHdyYXBwZXIgZm9yIENJUAogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KENhdGVnb3J5IEltcGFjdCBQcmlvcml0eSkpIHsKICAgICAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICRUeXBlIC4gJ0lEcycgKSB7CiAgICAgICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDSVBJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQICA9PiAkSUQtPntDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQ0lQSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJENJUElEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0OiBDYW4nIGZpbmQgJFR5cGUgJElELT57Q29udGVudH0hIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJRCA9IHVuZGVmOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNJbmNpZGVudHMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2VNYW5hZ2VtZW50Q2hhbmdlc0luY2lkZW50cy5wbSx2IDEuNyAyMDEwLzAyLzIyIDEwOjA5OjEwIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01DaGFuZ2VNYW5hZ2VtZW50Q2hhbmdlc0luY2lkZW50czsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1R5cGVPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6VHlwZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50Q2hhbmdlc0luY2lkZW50cyc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCBvZiB0aWNrZXQgdHlwZXMKICAgIG15ICVPYmplY3RzID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxpc3QoIFZhbGlkID0+IDEgKTsKICAgICRPYmplY3RzeyctMSd9ID0gJ0NoYW5nZXMnOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzQ4NzAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnT2JqZWN0cycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlT2JqZWN0cywKICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZXMgICA9PiBbIGtleXMgJU9iamVjdHMgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGltZXBlcmlvZCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpbWVQZXJpb2QnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnQ3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ0NyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgQ3JlYXRlVGltZU5ld2VyRGF0YSBhcyB3ZSB3YW50IHRvIGdldCAqQUxMKiBleGlzdGluZyBvYmplY3RzCiAgICBkZWxldGUgJFBhcmFte0NyZWF0ZVRpbWVOZXdlckRhdGV9OwoKICAgICMgZm9yIHRpY2tldHMgdGhlIHNlYXJjaCBvcHRpb24gaXMgIlRpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUiCiAgICAkUGFyYW17VGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZX0gPSAkUGFyYW17Q3JlYXRlVGltZU9sZGVyRGF0ZX07CgogICAgIyBpZiB0aGlzIGNlbGwgc2hvdWxkIGJlIGZpbGxlZCB3aXRoIG51bWJlciBvZiBjaGFuZ2VzCiAgICBpZiAoICRQYXJhbXtPYmplY3R9LT5bMF0gPT0gLTEgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgICAgICBMaW1pdCAgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIHRoaXMgY2VsbCBzaG91bGQgYmUgZmlsbGVkIHdpdGggbnVtYmVyIG9mIHRpY2tldHMKICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdDT1VOVCcsCiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICAgICAgVHlwZUlEcyAgICA9PiBbICRQYXJhbXtPYmplY3R9LT5bMF0gXSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgRXhwb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3Qgb2YgdGlja2V0IHR5cGVzCiAgICBteSAlT2JqZWN0cyA9ICRTZWxmLT57VHlwZU9iamVjdH0tPlR5cGVMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAkT2JqZWN0c3snLTEnfSA9ICdDaGFuZ2VzJzsKCiAgICAjIHdyYXAgaWRzIHRvIHVzZWQgc3BlbGxpbmcKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKCiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQ7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CgogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdPYmplY3QnICkgewoKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRPYmplY3RzeyAkSUQtPntDb250ZW50fSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJVBhcmFtOwp9CgpzdWIgSW1wb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3Qgb2YgdGlja2V0IHR5cGVzCiAgICBteSAlT2JqZWN0cyA9ICRTZWxmLT57VHlwZU9iamVjdH0tPlR5cGVMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAkT2JqZWN0c3snLTEnfSA9ICdDaGFuZ2VzJzsKCiAgICAjIHdyYXAgdXNlZCBzcGVsbGluZyB0byBpZHMKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKCiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQ7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CgogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdPYmplY3QnICkgewogICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkSUQ7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAlT2JqZWN0cyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJElELT57Q29udGVudH0gPSAkS2V5IGlmICRPYmplY3RzeyRLZXl9IGVxICRJRC0+e0NvbnRlbnR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudENoYW5nZXNQZXJDSUNsYXNzZXMucG0gLSBhbGwgYWR2aWNlIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZU1hbmFnZW1lbnRDaGFuZ2VzUGVyQ0lDbGFzc2VzLnBtLHYgMS4xMSAyMDEwLzAyLzIyIDEwOjA5OjEwIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01DaGFuZ2VNYW5hZ2VtZW50Q2hhbmdlc1BlckNJQ2xhc3NlczsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGVkIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50Q2hhbmdlc1BlckNJQ2xhc3Nlcyc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2lwIGxpc3RzCiAgICBteSAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICdDYXRlZ29yeScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgbXkgJUNhdGVnb3J5TGlzdCA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfSB9IEB7JENhdGVnb3JpZXN9OwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgKTsKCiAgICAjIGdldCBjdXJyZW50IHRpbWUgdG8gZml4IGJ1ZyM0ODcwCiAgICBteSAkVGltZVN0YW1wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgbXkgKCREYXRlKSA9IHNwbGl0IC9ccysvLCAkVGltZVN0YW1wOwogICAgbXkgJFRvZGF5ID0gc3ByaW50ZiAiJXMgMjM6NTk6NTkiLCAkRGF0ZTsKCiAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NvbmZpZ0l0ZW0gQ2xhc3NlcycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDAsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NJQ2xhc3NJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMCwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ2F0ZWdvcnlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJUNhdGVnb3J5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ29uZmlnSXRlbSBTdGF0dXMnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDSVN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiAkSW5jaVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGltZXBlcmlvZCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpbWVQZXJpb2QnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnQ3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ0NyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgb2JqZWN0IGlkcyBmb3IgY2hhbmdlIGFuZCBjb25maWcgaXRlbQogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3RJRCA9ICRTZWxmLT57TGlua09iamVjdH0tPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQ29uZmlnSXRlbU9iamVjdElEOwoKICAgIG15ICRDaGFuZ2VPYmplY3RJRCA9ICRTZWxmLT57TGlua09iamVjdH0tPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gaWYgISRDaGFuZ2VPYmplY3RJRDsKCiAgICAjIGdldCBjaGFuZ2UgaWQgYW5kIGNvbmZpZyBpdGVtIGlkCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGNoaS5pZCBBUyBjaGFuZ2VfaWQsIGNpLmlkIEFTIGNpX2lkICcKICAgICAgICAgICAgLiAnRlJPTSBjaGFuZ2VfaXRlbSBjaGksIGNoYW5nZV93b3Jrb3JkZXIgY2h3LCBsaW5rX3JlbGF0aW9uIGxyLCBjb25maWdpdGVtIGNpICcKICAgICAgICAgICAgLiAnV0hFUkUgY2hpLmlkID0gY2h3LmNoYW5nZV9pZCAnCiAgICAgICAgICAgIC4gJ0FORCBjaGkuY2F0ZWdvcnlfaWQgPSA/ICcKICAgICAgICAgICAgLiAnQU5EICggJwogICAgICAgICAgICAuICcoICcKICAgICAgICAgICAgLiAnY2h3LmlkID0gbHIudGFyZ2V0X2tleSAnCiAgICAgICAgICAgIC4gJ0FORCBsci50YXJnZXRfb2JqZWN0X2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBsci5zb3VyY2Vfb2JqZWN0X2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBsci5zb3VyY2Vfa2V5ID0gY2kuaWQgJwogICAgICAgICAgICAuICdBTkQgY2kuY2xhc3NfaWQgPSA/ICcKICAgICAgICAgICAgLiAnKSAnCiAgICAgICAgICAgIC4gJ09SICcKICAgICAgICAgICAgLiAnKCAnCiAgICAgICAgICAgIC4gJ2Nody5pZCA9IGxyLnNvdXJjZV9rZXkgJwogICAgICAgICAgICAuICdBTkQgbHIuc291cmNlX29iamVjdF9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgbHIudGFyZ2V0X29iamVjdF9pZCA9ID8gJwogICAgICAgICAgICAuICdBTkQgbHIudGFyZ2V0X2tleSA9IGNpLmlkICcKICAgICAgICAgICAgLiAnQU5EIGNpLmNsYXNzX2lkID0gPyAnCiAgICAgICAgICAgIC4gJykgJwogICAgICAgICAgICAuICcpJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCggJFBhcmFte0NhdGVnb3J5SURzfS0+WzBdICksCiAgICAgICAgICAgIFwkQ2hhbmdlT2JqZWN0SUQsCiAgICAgICAgICAgIFwkQ29uZmlnSXRlbU9iamVjdElELAogICAgICAgICAgICBcKCAkUGFyYW17Q0lDbGFzc0lEc30tPlswXSApLAogICAgICAgICAgICBcJENoYW5nZU9iamVjdElELAogICAgICAgICAgICBcJENvbmZpZ0l0ZW1PYmplY3RJRCwKICAgICAgICAgICAgXCggJFBhcmFte0NJQ2xhc3NJRHN9LT5bMF0gKSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGZldGNoIGNoYW5nZSBhbmQgY29uZmlnIGl0ZW0gaWRzCiAgICBteSBATWF0Y2hlczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATWF0Y2hlcywgXEBSb3c7CiAgICB9CgogICAgIyBjaGVjayBmb3IgZWFjaCBjaGFuZ2UgaWYgdGhlIGNvbmZpZyBpdGVtIGlzIGluIGFwcHJvcHJpYXRlIHN0YXR1cwogICAgIyBpZiBzbywgY291bnQgdGhlIGNoYW5nZQogICAgbXkgJUNoYW5nZXNBbHJlYWR5Q291bnRlZDsKICAgIE1BVENIOgogICAgZm9yIG15ICRNYXRjaCAoQE1hdGNoZXMpIHsKICAgICAgICBuZXh0IE1BVENIIGlmICRDaGFuZ2VzQWxyZWFkeUNvdW50ZWR7ICRNYXRjaC0+WzBdIH07CgogICAgICAgICMgZ2V0IGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbmZpZyBpdGVtCiAgICAgICAgbmV4dCBNQVRDSCBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIGluY2lfc3RhdGVfaWQgRlJPTSBjb25maWdpdGVtX3ZlcnNpb24gJwogICAgICAgICAgICAgICAgLiAnV0hFUkUgY29uZmlnaXRlbV9pZCA9ID8gJwogICAgICAgICAgICAgICAgLiAnQU5EIGNyZWF0ZV90aW1lID49ID8gQU5EIGNyZWF0ZV90aW1lIDw9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwoICRNYXRjaC0+WzFdICksCiAgICAgICAgICAgICAgICBcKCAkUGFyYW17Q3JlYXRlVGltZU5ld2VyRGF0ZX0gKSwKICAgICAgICAgICAgICAgIFwoICRQYXJhbXtDcmVhdGVUaW1lT2xkZXJEYXRlfSApLAogICAgICAgICAgICBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggY3VycmVudCBpbmNpZGVudCBzdGF0ZQogICAgICAgIG15ICRJbmNpZGVudFN0YXRlSUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEluY2lkZW50U3RhdGVJRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBuZXh0IE1BVENIIGlmICEkSW5jaWRlbnRTdGF0ZUlEOwoKICAgICAgICAjIGNoZWNrIGlmIHVzZXIgaGFzIHNlbGVjdGVkIHRoaXMgc3RhdGUKICAgICAgICBteSAoJEZvdW5kKSA9IGdyZXAgeyAkXyA9PSAkSW5jaWRlbnRTdGF0ZUlEIH0gQHsgJFBhcmFte0NJU3RhdGVJRHN9IH07CgogICAgICAgIG5leHQgTUFUQ0ggaWYgISRGb3VuZDsKCiAgICAgICAgJENoYW5nZXNBbHJlYWR5Q291bnRlZHsgJE1hdGNoLT5bMF0gfSsrOwogICAgfQoKICAgICMgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbmdlcwogICAgbXkgJENvdW50ID0ga2V5cyAlQ2hhbmdlc0FscmVhZHlDb3VudGVkOwogICAgcmV0dXJuICRDb3VudDsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgIyB3cmFwIGlkcyB0byB1c2VkIHNwZWxsaW5nCiAgICBmb3IgbXkgJFVzZSAocXcoVXNlQXNWYWx1ZVNlcmllcyBVc2VBc1Jlc3RyaWN0aW9uIFVzZUFzWHZhbHVlKSkgewogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHsgJFBhcmFteyRVc2V9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQgfHwgISRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdDSVN0YXRlSURzJyApIHsKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRJbmNpU3RhdGVMaXN0LT57ICRJRC0+e0NvbnRlbnR9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudE5hbWUgZXEgJ0NJQ2xhc3NJRHMnICkgewogICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJElEICggQHskVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkSUQ7CgogICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJENsYXNzTGlzdC0+eyAkSUQtPntDb250ZW50fSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnROYW1lIGVxICdDYXRlZ29yeUlEcycgKSB7CgogICAgICAgICAgICAgICAgbXkgJENJUExpc3QgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAnQ2F0ZWdvcnknLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBAeyRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgRUxFTUVOVDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyRDSVBMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICRJRC0+e0NvbnRlbnR9IG5lICRFbGVtZW50LT57S2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgJElELT57Q29udGVudH0gPSAkRWxlbWVudC0+e1ZhbHVlfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgIyB3cmFwIHVzZWQgc3BlbGxpbmcgdG8gaWRzCiAgICBmb3IgbXkgJFVzZSAocXcoVXNlQXNWYWx1ZVNlcmllcyBVc2VBc1Jlc3RyaWN0aW9uIFVzZUFzWHZhbHVlKSkgewogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICggQHsgJFBhcmFteyRVc2V9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAhJEVsZW1lbnQgfHwgISRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwogICAgICAgICAgICBteSAkRWxlbWVudE5hbWUgPSAkRWxlbWVudC0+e0VsZW1lbnR9OwogICAgICAgICAgICBteSAkVmFsdWVzICAgICAgPSAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfTsKCiAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICdDSVN0YXRlSURzJyApIHsKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICBLRVk6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JEluY2lTdGF0ZUxpc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRJRC0+e0NvbnRlbnR9IGVxICRJbmNpU3RhdGVMaXN0LT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEtFWTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50TmFtZSBlcSAnQ0lDbGFzc0lEcycgKSB7CiAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBAeyRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJElELT57Q29udGVudH0gZXEgJENsYXNzTGlzdC0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElELT57Q29udGVudH0gPSAkS2V5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGltcG9ydCB3cmFwcGVyIGZvciBDSVAKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhDYXRlZ29yeSkpIHsKICAgICAgICAgICAgICAgIGlmICggJEVsZW1lbnROYW1lIGVxICRUeXBlIC4gJ0lEcycgKSB7CiAgICAgICAgICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDSVBJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQICA9PiAkSUQtPntDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQ0lQSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJRC0+e0NvbnRlbnR9ID0gJENJUElEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0OiBDYW4nIGZpbmQgJFR5cGUgJElELT57Q29udGVudH0hIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJRCA9IHVuZGVmOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudEhpc3RvcnkucG0gLSBhbGwgYWR2aWNlIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNoYW5nZU1hbmFnZW1lbnRIaXN0b3J5LnBtLHYgMS41IDIwMTAvMDIvMjIgMTA6MDk6MTAgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTUNoYW5nZU1hbmFnZW1lbnRIaXN0b3J5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3Rvcnk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IFRpbWVPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50SGlzdG9yeSc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2hhbmdlIHN0YXRlIGxpc3QKICAgIG15ICRDaGFuZ2VTdGF0ZXMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIG15ICVDaGFuZ2VTdGF0ZUxpc3QgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0gfSBAeyRDaGFuZ2VTdGF0ZXN9OwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzQ4NzAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2hhbmdlIFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnTmV3VmFsdWVzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVDaGFuZ2VTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpbWVwZXJpb2QnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaW1lUGVyaW9kJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywgICAgIyAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ1RpbWUnLAogICAgICAgICAgICBUaW1lU3RvcCAgICAgICAgID0+ICRUb2RheSwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ0NoYW5nZVRpbWVOZXdlckRhdGUnLAogICAgICAgICAgICAgICAgVGltZVN0b3AgID0+ICdDaGFuZ2VUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQE9iamVjdEF0dHJpYnV0ZXM7Cn0KCnN1YiBHZXRTdGF0RWxlbWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2VhcmNoIGhpc3RvcnkKICAgIG15ICRJRHMgPSAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5U2VhcmNoKAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgIFR5cGUgICAgICA9PiAnQ2hhbmdlJywKICAgICAgICBBdHRyaWJ1dGUgPT4gJ0NoYW5nZVN0YXRlSUQnLAogICAgICAgIExpbWl0ICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIG15IEBDaGFuZ2VOdW1iZXJzOwogICAgaWYgKCAkSURzICYmIHJlZiAkSURzIGVxICdBUlJBWScgKSB7CgogICAgICAgIElEOgogICAgICAgIGZvciBteSAkSUQgKCBAeyRJRHN9ICkgewogICAgICAgICAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBJRCBpZiAhJENoYW5nZTsKCiAgICAgICAgICAgIHB1c2ggQENoYW5nZU51bWJlcnMsICRDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gam9pbiAiXG4iLCBAQ2hhbmdlTnVtYmVyczsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHdyYXAgaWRzIHRvIHVzZWQgc3BlbGxpbmcKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudCB8fCAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CiAgICAgICAgICAgIG15ICRFbGVtZW50TmFtZSA9ICRFbGVtZW50LT57RWxlbWVudH07CiAgICAgICAgICAgIG15ICRWYWx1ZXMgICAgICA9ICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwoKICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJ05ld1ZhbHVlcycgKSB7CiAgICAgICAgICAgICAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCggVXNlcklEID0+IDEgKTsKICAgICAgICAgICAgICAgIElEOgogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIEB7JFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRCBpZiAhJElEOwoKICAgICAgICAgICAgICAgICAgICBTVEFURToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFN0YXRlICggQHskU3RhdGVMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBTVEFURSBpZiAkSUQtPntDb250ZW50fSBuZSAkU3RhdGUtPntLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRTdGF0ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHdyYXAgdXNlZCBzcGVsbGluZyB0byBpZHMKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24gVXNlQXNYdmFsdWUpKSB7CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICEkRWxlbWVudCB8fCAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc307CiAgICAgICAgICAgIG15ICRFbGVtZW50TmFtZSA9ICRFbGVtZW50LT57RWxlbWVudH07CiAgICAgICAgICAgIG15ICRWYWx1ZXMgICAgICA9ICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9OwoKICAgICAgICAgICAgaWYgKCAkRWxlbWVudE5hbWUgZXEgJ05ld1ZhbHVlcycgKSB7CiAgICAgICAgICAgICAgICBJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBAeyRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRJRDsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXRlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAkSUQtPntDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkU3RhdGVJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAkSUQtPntDb250ZW50fSA9ICRTdGF0ZUlEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkltcG9ydDogQ2FuJyBmaW5kIHN0YXRlICRJRC0+e0NvbnRlbnR9ISIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJElEID0gdW5kZWY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNQ2hhbmdlTWFuYWdlbWVudFJmY1JlcXVlc3Rlci5wbSAtIGFsbCBhZHZpY2UgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNQ2hhbmdlTWFuYWdlbWVudFJmY1JlcXVlc3Rlci5wbSx2IDEuNSAyMDEwLzAyLzIyIDEwOjA5OjEwIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01DaGFuZ2VNYW5hZ2VtZW50UmZjUmVxdWVzdGVyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJ0lUU01DaGFuZ2VNYW5hZ2VtZW50UmZjUmVxdWVzdGVyJzsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmZDVHlwZXMgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJyk7CgogICAgIyBnZXQgYWxsIHJmY3MKICAgIG15IEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVHlwZXMgICAgICA9PiAkUmZDVHlwZXMsCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgKTsKCiAgICAjIGdldCBhbGwgcmVxdWVzdGVyCiAgICBteSAlUmVxdWVzdGVyOwoKICAgIFRJQ0tFVElEOgogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG5leHQgVElDS0VUSUQgaWYgISVUaWNrZXQ7CgogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJJRCA9ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9OwoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkUmVxdWVzdGVyeyJjdXN0b21lcl8kQ3VzdG9tZXJVc2VySUQifTsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXF1ZXN0ZXJ7ImN1c3RvbWVyXyRDdXN0b21lclVzZXJJRCJ9ID0gc3ByaW50ZiAiJXMgKCVzICVzKSIsCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2Vye1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcntVc2VyTGFzdG5hbWV9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJE93bmVySUQgPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkUmVxdWVzdGVyeyJhZ2VudF8kT3duZXJJRCJ9OwoKICAgICAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkT3duZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXF1ZXN0ZXJ7ImFnZW50XyRPd25lcklEIn0gPSBzcHJpbnRmICIlcyAoJXMgJXMpIiwKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgICRVc2Vye1VzZXJMYXN0bmFtZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzQ4NzAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnUmVxdWVzdGVyJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZXMgICA9PiBbIGtleXMgJVJlcXVlc3RlciBdLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdSZXF1ZXN0ZXInLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVJlcXVlc3RlciwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGltZXBlcmlvZCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDAsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpbWVQZXJpb2QnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGF0IHR5cGUgb2YgcmVxdWVzdGVyIHdlIGhhdmUKICAgICMgdGlja2V0IHNlYXJjaCBjcml0ZXJpYSBkaWZmZXIgZm9yIGFnZW50cyBhbmQgY3VzdG9tZXJzCiAgICBteSAoICRUeXBlLCAkSUQgKSA9IHNwbGl0IC9fLywgJFBhcmFte1JlcXVlc3Rlcn0tPlswXTsKICAgIG15ICRLZXkgPSAkVHlwZSBlcSAnYWdlbnQnID8gJ093bmVySURzJyA6ICdDdXN0b21lclVzZXJMb2dpbic7CiAgICAkUGFyYW17JEtleX0gPSBbJElEXTsKCiAgICAjIGdldCB0aWNrZXQgdHlwZXMgdGhhdCBhcmUgaGFuZGxlZCBhcyBSZkNzCiAgICBteSAkUmZDVHlwZXMgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJyk7CgogICAgIyBzZWFyY2ggdGlja2V0cwogICAgbXkgQFRpY2tldElEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVHlwZXMgICAgICA9PiAkUmZDVHlwZXMsCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICAjIGlmIHRoaXMgd2FudHMgdGhlIG51bWJlciBvZiBSZkNzIGZvciBhbiBhZ2VudCB3ZSBoYXZlIHRvIGNoZWNrCiAgICAjIHdoZXRoZXIgYSBjdXN0b21lciBpZCBpcyBpbiB0aGUgdGlja2V0LiBUaGUgb3duZXIgaXMgKk5PVCogdGhlCiAgICAjIHJlcXVlc3RlciB0aGVuLgogICAgaWYgKCAkVHlwZSBlcSAnYWdlbnQnICkgewogICAgICAgIG15ICRDb3VudCA9IDA7CgogICAgICAgIFRJQ0tFVElEOgogICAgICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRJRHMpIHsKICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAhJVRpY2tldDsKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfTsKCiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRDb3VudDsKICAgIH0KCiAgICByZXR1cm4gc2NhbGFyIEBUaWNrZXRJRHM7Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0FjbC9SZXN0cmljdFRpY2tldFR5cGVzLnBtIC0gYWNsIG1vZHVsZQojIC0gcmVzdHJpY3QgdGhlIHVzYWdlIG9mIHRoZSB0aWNrZXQgdHlwZXMgYXMgZGVmaW5lZCBpbgojIC0gc3lzY29uZmlnIG9wdGlvbiAnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJyB0byBjZXJ0YWluIGdyb3VwcyAtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBSZXN0cmljdFRpY2tldFR5cGVzLnBtLHYgMS42IDIwMTAvMDUvMjUgMTM6NDc6NTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QWNsOjpSZXN0cmljdFRpY2tldFR5cGVzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbmZpZyBBY2wpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBpZCBpcyBnaXZlbgogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtVc2VySUR9OwoKICAgICMgZ2V0IGFuZCBjaGVjayB0aGUgbGlzdCBvZiByZWxldmFudCB0aWNrZXQgdHlwZXMKICAgIG15ICRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMnKTsKCiAgICByZXR1cm4gMSBpZiAhJEFkZENoYW5nZUxpbmtUaWNrZXRUeXBlczsKICAgIHJldHVybiAxIGlmIHJlZiAkQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzIG5lICdBUlJBWSc7CiAgICByZXR1cm4gMSBpZiAhQHskQWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzfTsKCiAgICAjIGNyZWF0ZSBhIGxvb2t1cCBoYXNoIGZvciB0aGUgcmVsZXZhbnQgdGlja2V0IHR5cGVzCiAgICBteSAlSXNSZWxldmFudCA9IG1hcCB7ICRfID0+IDEgfSBAeyRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXN9OwoKICAgICMgaWYgdGlja2V0IGlkIHdhcyBnaXZlbgogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRpY2tldCBleGlzdHMKICAgICAgICByZXR1cm4gMSBpZiAhJVRpY2tldDsKCiAgICAgICAgIyBkb24ndCByZW1vdmUgcmVsZXZhbnQgdHlwZXMgZnJvbSB0eXBlIGxpc3QKICAgICAgICAjIGlmIHRoZSB0aWNrZXQgdHlwZSBpcyBhbHJlYWR5IG9uZSBvZiB0aGVzZSB0eXBlcwogICAgICAgIHJldHVybiAxIGlmICRJc1JlbGV2YW50eyAkVGlja2V0e1R5cGV9IH07CiAgICB9CgogICAgIyBnZXQgdXNlciBncm91cHMsIHdoZXJlIHRoZSB1c2VyIGhhcyB0aGUgcncgcHJpdmlsZWdlCiAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgYW5kIGNoZWNrIHRoZSBsaXN0IG9mIGdyb3VwcyB3aG8gYXJlIGFsbG93ZWQgdG8gdXNlIHRoZSBBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMKICAgIG15ICRSZXN0cmljdFRpY2tldFR5cGVzR3JvdXBzCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNoYW5nZTo6UmVzdHJpY3RUaWNrZXRUeXBlczo6R3JvdXBzJyk7CgogICAgcmV0dXJuIDEgaWYgISRSZXN0cmljdFRpY2tldFR5cGVzR3JvdXBzOwogICAgcmV0dXJuIDEgaWYgcmVmICRSZXN0cmljdFRpY2tldFR5cGVzR3JvdXBzIG5lICdBUlJBWSc7CiAgICByZXR1cm4gMSBpZiAhQHskUmVzdHJpY3RUaWNrZXRUeXBlc0dyb3Vwc307CgogICAgIyBjaGVjayBpZiB0aGUgdXNlciBpcyBpbiBvbmUgb2YgdGhlc2UgZ3JvdXBzCiAgICBmb3IgbXkgJEdyb3VwICggQHskUmVzdHJpY3RUaWNrZXRUeXBlc0dyb3Vwc30gKSB7CgogICAgICAgICMgZ2V0IHRoZSBncm91cCBpZAogICAgICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cCA9PiAkR3JvdXAsCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBub3QgcmVtb3ZlIHRoZSB0aWNrZXQgdHlwZSAnUmZDJyBpZiB1c2VyIGlzIGluIG9uZSBvZiB0aGUgZ3JvdXBzCiAgICAgICAgcmV0dXJuIDEgaWYgJEdyb3Vwc3skR3JvdXBJRH07CiAgICB9CgogICAgIyBnZW5lcmF0ZSBhY2wKICAgICRQYXJhbXtBY2x9LT57UmVzdHJpY3RUaWNrZXRUeXBlc30gPSB7CgogICAgICAgICMgcmVtb3ZlIHRpY2tldCB0eXBlcyBsaXN0ZWQgaW4gc3lzY29uZmlnIG9wdGlvbiAnSVRTTUNoYW5nZTo6QWRkQ2hhbmdlTGlua1RpY2tldFR5cGVzJwogICAgICAgICMgZnJvbSB0eXBlIGRyb3Bkb3duIGxpc3QgaW4gYWxsIGZyb250ZW5kIG1vZHVsZXMKICAgICAgICBQb3NzaWJsZU5vdCA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICRBZGRDaGFuZ2VMaW5rVGlja2V0VHlwZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH07CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIElUU01DaGFuZ2UudCAtIGNoYW5nZSB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUNoYW5nZS50LHYgMS4xODggMjAxMC8wNy8wMyAwMDo0MDoxOSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBMaXN0OjpVdGlsIHF3KG1heCk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNoYW5nZUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDYWNoZTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15ICRUZXN0Q291bnQgPSAxOwoKIyBjcmVhdGUgY29tbW9uIG9iamVjdHMKJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0dyb3VwT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGUtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0hpc3RvcnlPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpIaXN0b3J5LT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57Q2FjaGVPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkNhY2hlLT5uZXcoICV7JFNlbGZ9ICk7CgojIHRlc3QgaWYgY2hhbmdlIG9iamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKJFNlbGYtPlRydWUoCiAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0sCiAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNvbnN0cnVjdGlvbiBvZiBjaGFuZ2Ugb2JqZWN0JywKKTsKJFNlbGYtPklzKAogICAgcmVmICRTZWxmLT57Q2hhbmdlT2JqZWN0fSwKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZScsCiAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNsYXNzIG9mIGNoYW5nZSBvYmplY3QnLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNyZWF0ZSBuZWVkZWQgdXNlcnMgYW5kIGN1c3RvbWVyIHVzZXJzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgQFVzZXJJRHM7ICAgICAgICAgICAgICAgIyBhIGxpc3Qgb2YgZXhpc3RpbmcgYW5kIHZhbGlkIHVzZXIgaWRzCm15IEBJbnZhbGlkVXNlcklEczsgICAgICAgICMgYSBsaXN0IG9mIGV4aXN0aW5nIGJ1dCBpbnZhbGlkIHVzZXIgaWRzCm15IEBOb25FeGlzdGluZ1VzZXJJRHM7ICAgICMgYSBsaXN0IG9mIG5vbi1leGlzdGlvbiB1c2VyIGlkcwpteSBAQ3VzdG9tZXJVc2VySURzOyAgICAgICAjIGEgbGlzdCBvZiBleGlzdGluZyBhbmQgdmFsaWQgY3VzdG9tZXIgdXNlciBpZHMsIGEgbGlzdCBvZiBzdHJpbmdzCgojIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNyZWF0ZSBuZXcgdXNlcgpteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyk7CmlmICggIWRlZmluZWQgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgKSB7CiAgICAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9IDE7Cn0KJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAwLAopOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckFkZCgKICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdJVFNNQ2hhbmdlJyAuICRDb3VudGVyLAogICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1JVFNNQ2hhbmdlLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1JVFNNQ2hhbmdlLScgLiAkQ291bnRlciAuICdAbG9jYWxob3N0JywKICAgICAgICBWYWxpZElEICAgICAgID0+ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICk7CiAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwoKICAgICMgY3JlYXRlIG5ldyBjdXN0b21lcnMgZm9yIHRoZSB0ZXN0cwogICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJBZGQoCiAgICAgICAgU291cmNlICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJ0lUU01DaGFuZ2VDdXN0b21lcicgLiAkQ291bnRlciwKICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnVW5pdFRlc3RDdXN0b21lcicsCiAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gJ1VDVCcgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBVc2VyTG9naW4gICAgICA9PiAnVW5pdFRlc3QtSVRTTUNoYW5nZS1DdXN0b21lci0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgVXNlckVtYWlsICAgICAgPT4gJ1VuaXRUZXN0LUlUU01DaGFuZ2UtQ3VzdG9tZXItJwogICAgICAgICAgICAuICRDb3VudGVyCiAgICAgICAgICAgIC4gaW50KCByYW5kIDFfMDAwXzAwMCApCiAgICAgICAgICAgIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgIFZhbGlkSUQgPT4gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgcHVzaCBAQ3VzdG9tZXJVc2VySURzLCAkQ3VzdG9tZXJVc2VySUQ7Cn0KCiMgc29ydCB0aGUgdXNlciBhbmQgY3VzdG9tZXIgdXNlciBhcnJheXMKQFVzZXJJRHMgICAgICAgICA9IHNvcnQgQFVzZXJJRHM7CkBDdXN0b21lclVzZXJJRHMgPSBzb3J0IEBDdXN0b21lclVzZXJJRHM7CgojIGNyZWF0ZSBub24gZXhpc3RpbmcgdXNlciBJRHMKZm9yICggMSAuLiAyICkgewogICAgTFBDOgogICAgZm9yIG15ICRMb29wUHJvdGVjdGlvbkNvdW50ZXIgKCAxIC4uIDEwMCApIHsKCiAgICAgICAgIyBjcmVhdGUgYSByYW5kb20gdXNlciBpZAogICAgICAgIG15ICRUZW1wTm9uRXhpc3RpbmdVc2VySUQgPSBpbnQgcmFuZCAxXzAwMF8wMDA7CgogICAgICAgICMgY2hlY2sgaWYgcmFuZG9tIHVzZXIgaWQgZXhpc3RzIGFscmVhZHkKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRUZW1wTm9uRXhpc3RpbmdVc2VySUQsCiAgICAgICAgKTsKICAgICAgICBuZXh0IExQQyBpZiAlVXNlckRhdGE7CgogICAgICAgICMgd2UgZ290IGFuIHVudXNlZCB1c2VyIElECiAgICAgICAgcHVzaCBATm9uRXhpc3RpbmdVc2VySURzLCAkVGVtcE5vbkV4aXN0aW5nVXNlcklEOwogICAgICAgIGxhc3QgTFBDOwogICAgfQp9CgojIHNldCAzcmQgdXNlciBpbnZhbGlkCiRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJVcGRhdGUoCiAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMl0sCiAgICApLAogICAgVmFsaWRJRCA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICdpbnZhbGlkJyApLAogICAgQ2hhbmdlVXNlcklEID0+IDEsCik7CnB1c2ggQEludmFsaWRVc2VySURzLCBwb3AgQFVzZXJJRHM7CgojIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKKTsKCiMgdHVybiBvZmYgU2VuZE5vdGlmaWNhdGlvbnMsIGluIG9yZGVyIHRvIGF2b2lkIGEgbG90IG9mIHVzZWxlc3MgbWFpbHMKbXkgJFNlbmROb3RpZmljYXRpb25zT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmNhdGlvbnMnKTsKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSVRTTUNoYW5nZTo6U2VuZE5vdGlmaWNhdGlvbnMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IElUU01DaGFuZ2UgQVBJCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVmaW5lIHB1YmxpYyBpbnRlcmZhY2UgKGluIGFscGhhYmV0aWNhbCBvcmRlcikKbXkgQE9iamVjdE1ldGhvZHMgPSBxdygKICAgIENoYW5nZUFkZAogICAgQ2hhbmdlQXR0YWNobWVudEFkZAogICAgQ2hhbmdlQXR0YWNobWVudERlbGV0ZQogICAgQ2hhbmdlQXR0YWNobWVudEV4aXN0cwogICAgQ2hhbmdlQXR0YWNobWVudEdldAogICAgQ2hhbmdlQXR0YWNobWVudExpc3QKICAgIENoYW5nZUNBQkRlbGV0ZQogICAgQ2hhbmdlQ0FCR2V0CiAgICBDaGFuZ2VDQUJVcGRhdGUKICAgIENoYW5nZUNJUExvb2t1cAogICAgQ2hhbmdlRGVsZXRlCiAgICBDaGFuZ2VHZXQKICAgIENoYW5nZUdldENvbmZpZ3VyZWRGcmVlVGV4dEZpZWxkcwogICAgQ2hhbmdlTGlzdAogICAgQ2hhbmdlTG9va3VwCiAgICBDaGFuZ2VQb3NzaWJsZUNJUEdldAogICAgQ2hhbmdlUG9zc2libGVTdGF0ZXNHZXQKICAgIENoYW5nZVNlYXJjaAogICAgQ2hhbmdlU3RhdGVMb29rdXAKICAgIENoYW5nZVVwZGF0ZQogICAgUGVybWlzc2lvbgopOwoKIyBjaGVjayBpZiBzdWJzIGFyZSBhdmFpbGFibGUKZm9yIG15ICRPYmplY3RNZXRob2QgKEBPYmplY3RNZXRob2RzKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPmNhbigkT2JqZWN0TWV0aG9kKSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrICdjYW4gJE9iamVjdE1ldGhvZCciLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHNlYXJjaCBmb3IgZGVmYXVsdCBJVFNNQ2hhbmdlLXN0YXRlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSBkZWZhdWx0IElUU01DaGFuZ2Utc3RhdGVzCiMgY2FuJ3QgdXNlIHF3IGR1ZSB0byBzcGFjZXMgaW4gc3RhdGVzCm15IEBEZWZhdWx0Q2hhbmdlU3RhdGVzID0gKAogICAgJ3JlcXVlc3RlZCcsCiAgICAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAncmVqZWN0ZWQnLAogICAgJ2FwcHJvdmVkJywKICAgICdpbiBwcm9ncmVzcycsCiAgICAncGVuZGluZyBwaXInLAogICAgJ3N1Y2Nlc3NmdWwnLAogICAgJ2ZhaWxlZCcsCiAgICAnY2FuY2VsZWQnLAogICAgJ3JldHJhY3RlZCcsCik7CgojIGdldCBpdGVtIGxpc3Qgb2YgdGhlIGNoYW5nZSBzdGF0ZXMgd2l0aCBzd2FwcGVkIGtleXMgYW5kIHZhbHVlcwpteSAlQ2hhbmdlU3RhdGVJRDJOYW1lID0gJXsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgKSB8fCB7fQogICAgfTsKbXkgJUNoYW5nZVN0YXRlTmFtZTJJRCAgID0gcmV2ZXJzZSAlQ2hhbmdlU3RhdGVJRDJOYW1lOwpteSBAU29ydGVkQ2hhbmdlU3RhdGVJRHMgPSBzb3J0IGtleXMgJUNoYW5nZVN0YXRlSUQyTmFtZTsKCiMgY2hlY2sgaWYgc3RhdGVzIGFyZSBpbiBHZW5lcmFsQ2F0YWxvZwpmb3IgbXkgJERlZmF1bHRDaGFuZ2VTdGF0ZSAoQERlZmF1bHRDaGFuZ2VTdGF0ZXMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7JERlZmF1bHRDaGFuZ2VTdGF0ZX0sCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICIgLSBjaGVjayBzdGF0ZSAnJERlZmF1bHRDaGFuZ2VTdGF0ZSciLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3QgdGhlIHN0YXRlIGxvb2t1cCBtZXRob2QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBpbnZlc3RpZ2F0ZSB0aGUgZGVmYXVsdCBzdGF0ZXMKZm9yIG15ICRTdGF0ZSAoQERlZmF1bHRDaGFuZ2VTdGF0ZXMpIHsKCiAgICAjIGxvb2sgdXAgdGhlIHN0YXRlIG5hbWUKICAgIG15ICRMb29rZWRVcFN0YXRlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgICAgIENoYW5nZVN0YXRlID0+ICRTdGF0ZSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFN0YXRlSUQsCiAgICAgICAgJENoYW5nZVN0YXRlTmFtZTJJRHskU3RhdGV9LAogICAgICAgICJMb29rIHVwIHN0YXRlICckU3RhdGUnIiwKICAgICk7CgogICAgIyBkbyB0aGUgcmV2ZXJzZSBsb29rdXAKICAgIG15ICRMb29rZWRVcFN0YXRlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTdGF0ZUxvb2t1cCgKICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRMb29rZWRVcFN0YXRlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkTG9va2VkVXBTdGF0ZSwKICAgICAgICAkU3RhdGUsCiAgICAgICAgIkxvb2sgdXAgc3RhdGUgaWQgJyRMb29rZWRVcFN0YXRlSUQnIiwKICAgICk7Cn0KCiMgbm93IHNvbWUgcGFyYW0gY2hlY2tzIGZvciBDaGFuZ2VTdGF0ZUxvb2t1cApteSAkTG9va3VwT2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKCk7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnTm8gcGFyYW1zIHBhc3NlZCB0byBDaGFuZ2VTdGF0ZUxvb2t1cCgpJywKKTsKCiRMb29rdXBPayA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU3RhdGVMb29rdXAoCiAgICBDaGFuZ2VTdGF0ZSAgID0+ICdhcHByb3ZlZCcsCiAgICBDaGFuZ2VTdGF0ZUlEID0+IDIsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnRXhjbHVzaXZlIHBhcmFtcyBwYXNzZWQgdG8gQ2hhbmdlU3RhdGVMb29rdXAoKScsCik7CgokTG9va3VwT2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgU3RhdGUgPT4gJ2FwcHJvdmVkJywKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPaywKICAgICJJbmNvcnJlY3QgcGFyYW0gJ1N0YXRlJyBwYXNzZWQgdG8gQ2hhbmdlU3RhdGVMb29rdXAoKSIsCik7CgokTG9va3VwT2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVN0YXRlTG9va3VwKAogICAgU3RhdGVJRCA9PiAyLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgIkluY29ycmVjdCBwYXJhbSAnU3RhdGVJRCcgcGFzc2VkIHRvIENoYW5nZVN0YXRlTG9va3VwKCkiLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNoZWNrIGV4aXN0ZW5jZSBvZiB0aGUgZGVmYXVsdCBoaXN0b3J5IHR5cGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15IEBEZWZhdWx0SGlzdG9yeVR5cGVzID0gcXcoCiAgICBDaGFuZ2VBZGQKICAgIENoYW5nZVVwZGF0ZQogICAgQ2hhbmdlRGVsZXRlCiAgICBDaGFuZ2VDQUJVcGRhdGUKICAgIENoYW5nZUNBQkRlbGV0ZQogICAgQ2hhbmdlTGlua0FkZAogICAgQ2hhbmdlTGlua0RlbGV0ZQogICAgQ2hhbmdlQXR0YWNobWVudEFkZAogICAgQ2hhbmdlQXR0YWNobWVudERlbGV0ZQogICAgV29ya09yZGVyQWRkCiAgICBXb3JrT3JkZXJVcGRhdGUKICAgIFdvcmtPcmRlckRlbGV0ZQogICAgV29ya09yZGVyTGlua0FkZAogICAgV29ya09yZGVyTGlua0RlbGV0ZQogICAgV29ya09yZGVyQXR0YWNobWVudEFkZAogICAgV29ya09yZGVyQXR0YWNobWVudERlbGV0ZQogICAgQ2hhbmdlUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQKICAgIENoYW5nZVBsYW5uZWRFbmRUaW1lUmVhY2hlZAogICAgQ2hhbmdlQWN0dWFsU3RhcnRUaW1lUmVhY2hlZAogICAgQ2hhbmdlQWN0dWFsRW5kVGltZVJlYWNoZWQKICAgIFdvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkCiAgICBXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWQKICAgIFdvcmtPcmRlckFjdHVhbFN0YXJ0VGltZVJlYWNoZWQKICAgIFdvcmtPcmRlckFjdHVhbEVuZFRpbWVSZWFjaGVkCiAgICBDaGFuZ2VSZXF1ZXN0ZWRUaW1lUmVhY2hlZAogICAgQ29uZGl0aW9uQWRkCiAgICBDb25kaXRpb25VcGRhdGUKICAgIENvbmRpdGlvbkRlbGV0ZQogICAgQ29uZGl0aW9uRGVsZXRlQWxsCiAgICBFeHByZXNzaW9uQWRkCiAgICBFeHByZXNzaW9uVXBkYXRlCiAgICBFeHByZXNzaW9uRGVsZXRlCiAgICBFeHByZXNzaW9uRGVsZXRlQWxsCiAgICBBY3Rpb25BZGQKICAgIEFjdGlvblVwZGF0ZQogICAgQWN0aW9uRGVsZXRlCiAgICBBY3Rpb25EZWxldGVBbGwKICAgIEFjdGlvbkV4ZWN1dGUKICAgIENoYW5nZU5vdGlmaWNhdGlvblNlbnQKICAgIFdvcmtPcmRlck5vdGlmaWNhdGlvblNlbnQKKTsKCiMgaW52ZXN0aWdhdGUgdGhlIGRlZmF1bHQgaGlzdG9yeSB0eXBlcwpmb3IgbXkgJEhpc3RvcnlUeXBlIChARGVmYXVsdEhpc3RvcnlUeXBlcykgewoKICAgICMgbG9vayB1cCB0aGUgbmFtZQogICAgbXkgJExvb2tlZFVwSGlzdG9yeVR5cGVJRCA9ICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgIEhpc3RvcnlUeXBlID0+ICRIaXN0b3J5VHlwZSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJExvb2tlZFVwSGlzdG9yeVR5cGVJRCwKICAgICAgICAiTG9vayB1cCBoaXN0b3J5IHR5cGUgJyRIaXN0b3J5VHlwZSciLAogICAgKTsKCiAgICAjIGRvIHRoZSByZXZlcnNlIGxvb2t1cAogICAgbXkgJExvb2tlZFVwSGlzdG9yeVR5cGUgPSAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICBIaXN0b3J5VHlwZUlEID0+ICRMb29rZWRVcEhpc3RvcnlUeXBlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkTG9va2VkVXBIaXN0b3J5VHlwZSwKICAgICAgICAkSGlzdG9yeVR5cGUsCiAgICAgICAgIkxvb2sgdXAgaGlzdG9yeSB0eXBlIGlkICckTG9va2VkVXBIaXN0b3J5VHlwZUlEJyIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2hlY2sgZXhpc3RlbmNlIG9mIHRoZSBkZWZhdWx0IENJUAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSBAQ0lQVmFsdWVzID0gKCAnMSB2ZXJ5IGxvdycsICcyIGxvdycsICczIG5vcm1hbCcsICc0IGhpZ2gnLCAnNSB2ZXJ5IGhpZ2gnICk7CgojIGdldCBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzIHdpdGggc3dhcHBlZCBrZXlzIGFuZCB2YWx1ZXMKbXkgJUNoYW5nZUNhdGVnb3J5SUQyTmFtZSA9ICV7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNhdGVnb3J5JywKICAgICAgICApIHx8IHt9CiAgICB9OwpteSAlQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEICAgPSByZXZlcnNlICVDaGFuZ2VDYXRlZ29yeUlEMk5hbWU7Cm15IEBTb3J0ZWRDaGFuZ2VDYXRlZ29yeUlEcyA9IHNvcnQga2V5cyAlQ2hhbmdlQ2F0ZWdvcnlJRDJOYW1lOwoKIyBnZXQgbGlzdCBvZiB0aGUgaW1wYWN0cyB3aXRoIHN3YXBwZWQga2V5cyBhbmQgdmFsdWVzCm15ICVDaGFuZ2VJbXBhY3RJRDJOYW1lID0gJXsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6SW1wYWN0JywKICAgICAgICApIHx8IHt9CiAgICB9OwpteSAlQ2hhbmdlSW1wYWN0TmFtZTJJRCAgID0gcmV2ZXJzZSAlQ2hhbmdlSW1wYWN0SUQyTmFtZTsKbXkgQFNvcnRlZENoYW5nZUltcGFjdElEcyA9IHNvcnQga2V5cyAlQ2hhbmdlSW1wYWN0SUQyTmFtZTsKCiMgZ2V0IGxpc3Qgb2YgdGhlIHByaW9yaXRpZXMgd2l0aCBzd2FwcGVkIGtleXMgYW5kIHZhbHVlcwpteSAlQ2hhbmdlUHJpb3JpdHlJRDJOYW1lID0gJXsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6UHJpb3JpdHknLAogICAgICAgICkgfHwge30KICAgIH07Cm15ICVDaGFuZ2VQcmlvcml0eU5hbWUySUQgICA9IHJldmVyc2UgJUNoYW5nZVByaW9yaXR5SUQyTmFtZTsKbXkgQFNvcnRlZENoYW5nZVByaW9yaXR5SURzID0gc29ydCBrZXlzICVDaGFuZ2VQcmlvcml0eUlEMk5hbWU7CgojIGNoZWNrIGlmIENJUCB2YWx1ZXMgYXJlIGluIEdlbmVyYWxDYXRhbG9nCmZvciBteSAkQ0lQVmFsdWUgKEBDSVBWYWx1ZXMpIHsKCiAgICAjIHRlc3QgY2F0ZWdvcnkKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JENJUFZhbHVlfSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrIGNhdGVnb3J5ICckQ0lQVmFsdWUnIChnZW5lcmFsIGNhdGFsb2cpIgogICAgKTsKCiAgICBteSAkQ2F0ZWdvcnlJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgIFR5cGUgPT4gJ0NhdGVnb3J5JywKICAgICAgICBDSVAgID0+ICRDSVBWYWx1ZSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2F0ZWdvcnlJRCwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCAuICIgLSBjaGVjayBjYXRlZ29yeSAnJENJUFZhbHVlJyAoQ2hhbmdlQ0lQTG9va3VwKSIKICAgICk7CgogICAgIyB0ZXN0IGltcGFjdAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENoYW5nZUltcGFjdE5hbWUySUR7JENJUFZhbHVlfSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrIGltcGFjdCAnJENJUFZhbHVlJyAoZ2VuZXJhbCBjYXRhbG9nKSIKICAgICk7CgogICAgbXkgJEltcGFjdElEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VDSVBMb29rdXAoCiAgICAgICAgVHlwZSA9PiAnSW1wYWN0JywKICAgICAgICBDSVAgID0+ICRDSVBWYWx1ZSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkSW1wYWN0SUQsCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQgLiAiIC0gY2hlY2sgaW1wYWN0ICckQ0lQVmFsdWUnIChDaGFuZ2VDSVBMb29rdXApIgogICAgKTsKCiAgICAjIHRlc3QgcHJpb3JpdHkKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JENJUFZhbHVlfSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrIHByaW9yaXR5ICckQ0lQVmFsdWUnIChnZW5lcmFsIGNhdGFsb2cpIgogICAgKTsKCiAgICBteSAkUHJpb3JpdHlJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgICAgIFR5cGUgPT4gJ1ByaW9yaXR5JywKICAgICAgICBDSVAgID0+ICRDSVBWYWx1ZSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUHJpb3JpdHlJRCwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCAuICIgLSBjaGVjayBwcmlvcml0eSAnJENJUFZhbHVlJyAoQ2hhbmdlQ0lQTG9va3VwKSIKICAgICk7Cgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2hlY2sgZXhpc3RlbmNlIG9mIHRoZSBncm91cHMgdGhhdCBhcmUgdXNlZCBmb3IgUGVybWlzc2lvbgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIG9mIHRoZSBncm91cCBuYW1lIHRvIHRoZSBncm91cCBpZApteSAlR3JvdXBOYW1lMklEID0gcmV2ZXJzZSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICk7CgojIGNoZWNrIHdoZXRlciB0aGUgZ3JvdXBzIHdlcmUgZm91bmQKZm9yIG15ICRHcm91cCAocXcoIGl0c20tY2hhbmdlIGl0c20tY2hhbmdlLWJ1aWxkZXIgaXRzbS1jaGFuZ2UtbWFuYWdlciApKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkR3JvdXBOYW1lMklEeyRHcm91cH0sCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICIgLSBjaGVjayBncm91cCAnJEdyb3VwJyIKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBnZXQgdmFyaWFibGVzIGZvciB0ZXN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJERlZmF1bHRDYXRlZ29yeSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ2hhbmdlOjpDYXRlZ29yeTo6RGVmYXVsdCcpOwpteSAkRGVmYXVsdEltcGFjdCAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OkltcGFjdDo6RGVmYXVsdCcpOwpteSAkRGVmYXVsdFByaW9yaXR5ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgIENhdGVnb3J5SUQgPT4gJENoYW5nZUNhdGVnb3J5TmFtZTJJRHskRGVmYXVsdENhdGVnb3J5fSwKICAgIEltcGFjdElEICAgPT4gJENoYW5nZUltcGFjdE5hbWUySUR7JERlZmF1bHRJbXBhY3R9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIGNoYW5nZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIHN0b3JlIGN1cnJlbnQgVGVzdENvdW50IGZvciBiZXR0ZXIgdGVzdCBjYXNlIHJlY29nbml0aW9uCm15ICRUZXN0Q291bnRNaXNjID0gJFRlc3RDb3VudDsKCiMgQW4gdW5pcXVlIGluZGVudGlmaWVyLCBzbyB0aGF0IGRhdGEgZnJvbSBkaWZmZXJlbnQgdGVzdCBydW5zCiMgd29uJ3QgYmUgbWl4ZWQgdXAuIFRoZSBzdHJpbmcgaXMgZm9ybWF0ZWQgdG8gYSBjb25zdGFudCBsZW5ndGgsCiMgYXMgdGhlIGNvbnZlcnNpb24gdG8gcGxhaW4gdGV4dCB3aXRoIFRvQXNjaWkoKSBkZXBlbmRzIG9uIHRoZSBzdHJpbmcgbGVuZ3RoLgpteSAkVW5pcXVlU2lnbmF0dXJlID0gc3ByaW50ZiAnVW5pdFRlc3QtSVRTTUNoYW5nZS0lMDZkXyUwMTBkJywKICAgIGludCggcmFuZCAxXzAwMF8wMDAgKSwKICAgIHRpbWUoKTsKbXkgJE5vV2lsZGNhcmRzVGVzdFRpdGxlID0gc3ByaW50ZiAnVW5pdFRlc3QtSVRTTUNoYW5nZS0lJU5vV2lsZGNhcmRzJSVfJTA2ZF8lMDEwZCcsCiAgICBpbnQoIHJhbmQgMV8wMDBfMDAwICksCiAgICB0aW1lKCk7CgpteSBAQ2hhbmdlVGVzdHMgPSAoCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgVGVzdHMgb24gQ2hhbmdlQWRkCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwoKICAgICMgQ2hhbmdlIGRvZXNuJ3QgY29udGFpbiBhbGwgZGF0YSAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBubyBwYXJhbXMgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBleHBlY3QgdGhpcyB0ZXN0IHRvIGZhaWwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7fSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBDaGFuZ2UgY29udGFpbnMgb25seSByZXF1aXJlZCBkYXRhIC0gZGVmYXVsdCB1c2VyIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IG9ubHkgbmVlZGVkIHBhcmFtcyAoVXNlcklEID0gMSkgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblBsYWluICAgPT4gJycsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uUGxhaW4gPT4gJycsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEcyAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckNvdW50ICAgICA9PiAwLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSGlzdG9yeUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VBZGQgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMjUsIDI2IF0sCiAgICAgICAgTGFiZWwgPT4gJ0NoYW5nZUxvb2t1cFRlc3QnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBmb3IgdGVzdGluZyBDaGFuZ2VMb29rdXAoKS4KICAgIH0sCgogICAgIyBDaGFuZ2UgY29udGFpbnMgb25seSByZXF1aXJlZCBkYXRhIC0gZGVmYXVsdCB1c2VyIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IG9ubHkgbmVlZGVkIHBhcmFtcyAoVXNlcklEICE9IDEpIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnJywKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlcklEcyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckNvdW50ICA9PiAwLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDQsIDI1LCAyNiBdLAogICAgfSwKCiAgICAjIENoYW5nZSBjb250YWlucyBIVE1MIGRlc2NyaXB0aW9uIGFuZCBqdXN0aWZpY2F0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb25seSBuZWVkZWQgcGFyYW1zIChVc2VySUQgIT0gMSkgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICc8Yj5UaGlzIDx1PmlzPC91PiBib2xkPC9iPiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnPGI+VGhpcyA8dT5pczwvdT4gYm9sZDwvYj4gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgID0+ICc8Yj5UaGlzIDx1PmlzPC91PiBib2xkPC9iPiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25QbGFpbiAgID0+ICdUaGlzIGlzIGJvbGQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnPGI+VGhpcyA8dT5pczwvdT4gYm9sZDwvYj4gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb25QbGFpbiA9PiAnVGhpcyBpcyBib2xkIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJDb3VudCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA0LCAyNSwgMjYsIDQ4LCA0OSwgNTAgXSwKICAgIH0sCgogICAgIyBDaGFuZ2Ugd2l0aCBuYW1lZCBDaGFuZ2VTdGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBTdGF0ZW5hbWVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncmVxdWVzdGVkJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgPT4gJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25QbGFpbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlICAgICAgPT4gJ3JlcXVlc3RlZCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgID0+IFtdLAogICAgICAgICAgICAgICAgV29ya09yZGVyQ291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSGlzdG9yeUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VBZGQgICAgPT4gJycsCiAgICAgICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgWyAnJywgJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlIF0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICBbIHVuZGVmLCAkVXNlcklEc1swXSBdLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIFsgdW5kZWYsICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSBdLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDQsIDI1LCAyNiwgMzMsIDM3IF0sCiAgICB9LAoKICAgICMgQ2hhbmdlVXBkYXRlKCkgd2l0aCB2YWxpZCBuYW1lZCBDaGFuZ2VTdGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VVcGRhdGUoKSB3aXRoIHZhbGlkIG5hbWVkIENoYW5nZVN0YXRlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncmVxdWVzdGVkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ3BlbmRpbmcgYXBwcm92YWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgID0+ICcnLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCAgID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7J3BlbmRpbmcgYXBwcm92YWwnfSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlICAgICA9PiAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgPT4gW10sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJDb3VudCAgPT4gMCwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA0LCAyNSwgMjYsIDM4IF0sCiAgICB9LAoKICAgICMgQ2hhbmdlVXBkYXRlKCkgd2l0aCBpbnZhbGlkIG5hbWVkIENoYW5nZVN0YXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVVwZGF0ZSgpIHdpdGggaW52YWxpZCBuYW1lZCBDaGFuZ2VTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncmVxdWVzdGVkJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ2ZhaWxlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJycsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtyZXF1ZXN0ZWR9LAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgICAgID0+ICdyZXF1ZXN0ZWQnLAogICAgICAgICAgICAgICAgV29ya09yZGVySURzICAgID0+IFtdLAogICAgICAgICAgICAgICAgV29ya09yZGVyQ291bnQgID0+IDAsCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNCwgMjUsIDI2LCAzNyBdLAogICAgfSwKCiAgICAjIENoYW5nZVVwZGF0ZSgpIHdpdGggbm90IGFsbG93ZWQgbmV4dCBDaGFuZ2VTdGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VVcGRhdGUoKSB3aXRoIG5vdCBhbGxvd2VkIG5leHQgQ2hhbmdlU3RhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGUgPT4gJ3N1Y2Nlc3NmdWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAncGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFszOF0sCiAgICB9LAoKICAgICMgQ2hhbmdlVXBkYXRlKCkgd2l0aCBub3QgYWxsb3dlZCBuZXh0IENoYW5nZVN0YXRlIGJ1dCBCeXBhc3NTdGF0ZU1hY2hpbmUgcGFyYW1ldGVyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgJ0NoYW5nZVVwZGF0ZSgpIHdpdGggbm90IGFsbG93ZWQgbmV4dCBDaGFuZ2VTdGF0ZSBidXQgQnlwYXNzU3RhdGVNYWNoaW5lIHBhcmFtZXRlciAtICcKICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VTdGF0ZXMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlID0+ICdwZW5kaW5nIGFwcHJvdmFsJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQnlwYXNzU3RhdGVNYWNoaW5lID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSAgICAgICAgPT4gJ3N1Y2Nlc3NmdWwnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZSA9PiAnc3VjY2Vzc2Z1bCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBjaGFuZ2UgY29udGFpbnMgYWxsIGRhdGEgLSAoYWxsIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgYWxsIHBvc3NpYmxlIHBhcmFtcyBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdDaGFuZ2UgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZSAxIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnQ2hhbmdlIDEgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdDaGFuZ2UgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZSAxIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnQ2hhbmdlIDEgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyLCAzLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAyMywgMjQsIDI3IF0sCiAgICAgICAgTGFiZWwgPT4gJ1NlYXJjaFRlc3QnLCAgICAjIHRoaXMgdGVzdCB3aWxsIGJlIHVzZWQgZm9yIHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIGNoYW5nZSBjb250YWlucyB0aXRsZSwgZGVzY3JpcHRpb24sIGp1c3RpZmljYXRpb24sIGNoYW5nZW1hbmFnZXJpZCBhbmQgY2hhbmdlYnVpbGRlcmlkCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgYWxsIHBvc3NpYmxlIHBhcmFtcyBmb3IgQ2hhbmdlQWRkIChTZWNvbmQgdHJ5KS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnQ2hhbmdlIDIgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdDaGFuZ2UgMiAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJ0NoYW5nZSAyIC0gSnVzdGlmaWNhdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ0NoYW5nZSAyIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnQ2hhbmdlIDIgLSBEZXNjcmlwdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgID0+ICdDaGFuZ2UgMiAtIEp1c3RpZmljYXRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbICRVc2VySURzWzFdIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgICAgPT4gWyAkQ3VzdG9tZXJVc2VySURzWzFdIF0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMV0KICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyMywgMjQgXSwKICAgIH0sCgogICAgIyBjaGFuZ2UgY29udGFpbnMgYWxsIGRhdGEgLSB3cm9uZyBDQUIgLSAod3JvbmcgQ0FCIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgaW52YWxpZCBDQUIgbWVtYmVycyBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdDaGFuZ2UgMyAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0NoYW5nZSAzIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnQ2hhbmdlIDMgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgICAgICBGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIGNoYW5nZSBjb250YWlucyByZXF1aXJlZCBkYXRhIC0gZHVwbGljYXRlIENBQiBlbnRyaWVzIC0gKGR1cGxpY2F0ZSBDQUIgZW50cmllcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBkdXBsaWNhdGUgQ0FCIG1lbWJlcnMgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBtYXggbG9uZyBwYXJhbXMgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgIyBUaGUgbWF4IHBsYWluIHN0cmluZyBpcyBvbmx5IDM3OTksIGJlY2F1c2UgVG9Bc2NpaSgpIGFkZHMgYSBuZXdsaW5lCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCBzdHJpbmcgbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJyB4IDM3OTksCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJyB4IDM3OTksCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgPT4gJ0QnIHggMzc5OSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uUGxhaW4gICA9PiAnRCcgeCAzNzk5IC4gIlxuIiwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICA9PiAnSicgeCAzNzk5LAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvblBsYWluID0+ICdKJyB4IDM3OTkgLiAiXG4iLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgV29ya09yZGVySURzICAgICAgID0+IFtdLAogICAgICAgICAgICAgICAgV29ya09yZGVyQ291bnQgICAgID0+IDAsCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMTEsIDEyLCAxMyBdLAogICAgfSwKCiAgICAjIHRlc3Qgb24gbWF4KzEgbG9uZyBwYXJhbXMgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJyB4IDI1MSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnIHggMzgwMCwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1heCsyIGxvbmcgcGFyYW1zICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzIgc3RyaW5nIGxlbmd0aCBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcgeCAyNTIsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJyB4IDM4MDEsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJyB4IDM4MDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBtYXgrMSBsb25nIHBhcmFtcyAtIHRpdGxlICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzEgc3RyaW5nIC0gdGl0bGUgLSBsZW5ndGggZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ1QnIHggMjUxLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnRCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1heCsxIGxvbmcgcGFyYW1zIC0gZGVzY3JpcHRpb24gKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCsxIHN0cmluZyAtIGRlc2NyaXB0aW9uIC0gbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnIHggMzgwMCwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gbWF4KzEgbG9uZyBwYXJhbXMgLSBqdXN0aWZpY2F0aW9uIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgLSBqdXN0aWZpY2F0aW9uIC0gbGVuZ3RoIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnSicgeCAzODAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gdW5kZWYgcGFyYW1zIC0gdGl0bGUgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB1bmRlZiAtIHRpdGxlJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnRCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIHVuZGVmIHBhcmFtcyAtIGRlc2NyaXB0aW9uIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB1bmRlZiAtIGRlc2NyaXB0aW9uJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdKJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIHVuZGVmIHBhcmFtcyAtIGp1c3RpZmljYXRpb24gKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHVuZGVmIC0ganVzdGlmaWNhdGlvbicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gdW5kZWYsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiAnMCcgc3RyaW5ncyAtIGRlZmF1bHQgdXNlciAgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlRlc3QgZm9yICcwJyBzdHJpbmcgaGFuZGxpbmcgZm9yIENoYW5nZUFkZC4iLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJzAnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnMCcsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnMCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICcwJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJzAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDE4LCAxOSwgMjAsIDIxIF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB0aXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAiICBcdCBcbiAgVGl0bGUgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICJUaXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDQ1IF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICJUaXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSAuICIgIFx0IFxuICAiLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gIlRpdGxlIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDQ2IF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICIgIFx0IFxuICBUaXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlCiAgICAgICAgICAgICAgICAgICAgLiAiICBcdCBcbiAgIiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gIlRpdGxlIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDQ3IF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIG9ubHkgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB0aXRsZSB3aXRoIG9ubHkgd2hpdGVzcGFjZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAiICBcdCBcbiAgIiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICcnLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbXSwKICAgIH0sCgogICAgIyBhIGNoYW5nZSBmb3IgdGhlICdVc2luZ1dpbGRjYXJkcyA9PiAwJyB0ZXN0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgY2hhbmdlIGZvciB0aGUgJ1VzaW5nV2lsZGNhcmRzID0+IDAnIHRlc3QuIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICROb1dpbGRjYXJkc1Rlc3RUaXRsZSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJE5vV2lsZGNhcmRzVGVzdFRpdGxlLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAkTm9XaWxkY2FyZHNUZXN0VGl0bGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJE5vV2lsZGNhcmRzVGVzdFRpdGxlLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkTm9XaWxkY2FyZHNUZXN0VGl0bGUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICROb1dpbGRjYXJkc1Rlc3RUaXRsZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gbWl4ZWQgdmFsaWQgYW5kIGludmFsaWQgQ0FCQWdlbnRzICAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiBtaXhlZCB2YWxpZCBhbmQgaW52YWxpZCBDQUJBZ2VudHMgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICROb25FeGlzdGluZ1VzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJE5vbkV4aXN0aW5nVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiBtaXhlZCB2YWxpZCBhbmQgaW52YWxpZCBDQUJDdXN0b21lcnMgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IG9uIG1peGVkIHZhbGlkIGFuZCBpbnZhbGlkIENBQkN1c3RvbWVycyBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgICAgICdUaGlzSXNBbkludmFsaWRDdXN0b21lclVzZXJJZCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3Qgb24gaW52YWxpZCBJRHMgZm9yIENoYW5nZU1hbmFnZXJJRCBhbmQgQ2hhbmdlQnVpbGRlcklECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3Qgb24gaW52YWxpZCBJRHMgZm9yIENoYW5nZU1hbmFnZXJJRCBhbmQgQ2hhbmdlQnVpbGRlcklEIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+ICROb25FeGlzdGluZ1VzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJE5vbkV4aXN0aW5nVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIGludmFsaWQgSURzIGZvciBDaGFuZ2VNYW5hZ2VySUQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiBpbnZhbGlkIElEIGZvciBDaGFuZ2VNYW5hZ2VySUQgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJE5vbkV4aXN0aW5nVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIGludmFsaWQgSURzIGZvciBDaGFuZ2VCdWlsZGVySUQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiBpbnZhbGlkIElEIGZvciBDaGFuZ2VCdWlsZGVySUQgZm9yIENoYW5nZUFkZC4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJE5vbkV4aXN0aW5nVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIGludmFsaWQgUmVxdWVzdGVkVGltZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IG9uIGludmFsaWQgUmVxdWVzdGVkVGltZSBmb3IgQ2hhbmdlQWRkLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICdhbnl0aGluZyBpbnZhbGlkJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIHZhbGlkIFJlcXVlc3RlZFRpbWUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiB2YWxpZCBSZXF1ZXN0ZWRUaW1lIGZvciBDaGFuZ2VBZGQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICcyMDA5LTEwLTI5IDEzOjMzOjMzJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcXVlc3RlZFRpbWUgPT4gJzIwMDktMTAtMjkgMTM6MzM6MzMnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnUmVxdWVzdGVkVGltZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDQyLCA0MyBdLAogICAgfSwKCiAgICAjIFRlc3QgZGVmYXVsdCBDSVAgdmFsdWVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZGVmYXVsdCBDSVAgdmFsdWVzJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IGRlZmF1bHQgQ0lQIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCBkZWZhdWx0IENJUCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnkgICAgICAgID0+ICREZWZhdWx0Q2F0ZWdvcnksCiAgICAgICAgICAgICAgICBDYXRlZ29yeUlEICAgICAgPT4gJENoYW5nZUNhdGVnb3J5TmFtZTJJRHskRGVmYXVsdENhdGVnb3J5fSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgICAgICA9PiAkRGVmYXVsdEltcGFjdCwKICAgICAgICAgICAgICAgIEltcGFjdElEICAgICAgICA9PiAkQ2hhbmdlSW1wYWN0TmFtZTJJRHskRGVmYXVsdEltcGFjdH0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgICAgPT4gJERlZmF1bHRQcmlvcml0eSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICA9PiAkQ2hhbmdlUHJpb3JpdHlJRDJOYW1leyREZWZhdWx0UHJpb3JpdHl9LAoKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzZdLAogICAgICAgIExhYmVsICAgICAgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIFRlc3QgY2F0ZWdvcnkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjYXRlZ29yeSAiMSB2ZXJ5IGxvdyInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgQ0lQIChDYXRlZ29yeSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENhdGVnb3J5ICAgID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdUZXN0IENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICAgICAgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgICAgID0+ICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JzEgdmVyeSBsb3cnfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA1MSwgNTQsIDU3LCA2MCwgNjMsIDY0IF0sCiAgICAgICAgTGFiZWwgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIFRlc3QgaW52YWxpZCBjYXRlZ29yeQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGludmFsaWQgY2F0ZWdvcnkgIjE4IHN1cGVyIGhpZ2giJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgQ0lQIChDYXRlZ29yeSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENhdGVnb3J5ICAgID0+ICcxOCBzdXBlciBoaWdoJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gW10sCiAgICB9LAoKICAgICMgVGVzdCBpbXBhY3QKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBpbXBhY3QgIjEgdmVyeSBsb3ciJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCAoSW1wYWN0KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgQ0lQIChJbXBhY3QpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBJbXBhY3QgICAgICAgICAgPT4gJzEgdmVyeSBsb3cnLAogICAgICAgICAgICAgICAgSW1wYWN0SUQgICAgICAgID0+ICRDaGFuZ2VJbXBhY3ROYW1lMklEeycxIHZlcnkgbG93J30sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgNTIsIDU1LCA1OCwgNjEgXSwKICAgICAgICBMYWJlbCA9PiAnT3JkZXJCeUNJUFRlc3RzJywgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMgVGVzdCBpbnZhbGlkIGltcGFjdAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGludmFsaWQgaW1wYWN0ICIxOCBzdXBlciBoaWdoIicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCAoSW1wYWN0KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJzE4IHN1cGVyIGhpZ2gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbXSwKICAgIH0sCgogICAgIyBUZXN0IHByaW9yaXR5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgcHJpb3JpdHkgIjEgdmVyeSBsb3ciJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCAoUHJpb3JpdHkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICA9PiAnMSB2ZXJ5IGxvdycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCBDSVAgKFByaW9yaXR5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICAgID0+ICcxIHZlcnkgbG93JywKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgICA9PiAkQ2hhbmdlUHJpb3JpdHlOYW1lMklEeycxIHZlcnkgbG93J30sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgNTMsIDU2LCA1OSwgNjIgXSwKICAgICAgICBMYWJlbCA9PiAnT3JkZXJCeUNJUFRlc3RzJywgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMgVGVzdCBpbnZhbGlkIHByaW9yaXR5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgaW52YWxpZCBwcmlvcml0eSAiMTggc3VwZXIgaGlnaCInLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBDSVAgKFByaW9yaXR5KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgPT4gJzE4IHN1cGVyIGhpZ2gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbXSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgVGVzdHMgb24gQ2hhbmdlVXBkYXRlCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwoKICAgICMgVXBkYXRlIGNoYW5nZSB3aXRob3V0IHJlcXVpcmVkIHBhcmFtcyAocmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBubyBwYXJhbXMgZm9yIENoYW5nZVVwZGF0ZSgpLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBleHBlY3QgdGhpcyB0ZXN0IHRvIGZhaWwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7fSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1heCBsb25nIHBhcmFtcyAgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCBzdHJpbmcgbGVuZ3RoIGZvciBDaGFuZ2VVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJyB4IDI1MCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnIHggMzc5OSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onIHggMzc5OSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgID0+ICdUJyB4IDI1MCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnRCcgeCAzNzk5LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25QbGFpbiAgID0+ICdEJyB4IDM3OTkgLiAiXG4iLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgICAgID0+ICdKJyB4IDM3OTksCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uUGxhaW4gPT4gJ0onIHggMzc5OSAuICJcbiIsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJJRHMgICAgICAgPT4gW10sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJDb3VudCAgICAgPT4gMCwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyAgICAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDExLCAxNCwgMTUsIDE2LCAxNyBdLAogICAgfSwKCiAgICAjIHRlc3Qgb24gbWF4KzEgbG9uZyBwYXJhbXMgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIGZvciBDaGFuZ2VVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ1QnIHggMjUxLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnRCcgeCAzODAwLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnSicgeCAzODAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICcnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIG1heCsxIGxvbmcgcGFyYW1zIC0gdGl0bGUgIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIC0gdGl0bGUgLSBmb3IgQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJyB4IDI1MSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnSicsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICcnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwgICAgIyB0ZXN0IG9uIG1heCsxIGxvbmcgcGFyYW1zIC0gZGVzY3JpcHRpb24gIChyZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIC0gZGVzY3JpcHRpb24gLSBmb3IgQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdUJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0QnIHggMzgwMCwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICcnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sICAgICMgdGVzdCBvbiBtYXgrMSBsb25nIHBhcmFtcyAgLSBqdXN0aWZpY2F0aW9uIC0gKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCsxIHN0cmluZyBsZW5ndGggLSBqdXN0aWZpY2F0aW9uIC0gZm9yIENoYW5nZVVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnVCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdEJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0onIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJycsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCBvbiAnMCcgc3RyaW5ncyAtIGRlZmF1bHQgdXNlciAgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlRlc3QgZm9yICcwJyBzdHJpbmcgaGFuZGxpbmcgZm9yIENoYW5nZVVwZGF0ZS4iLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnMCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICcwJywKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJzAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICcwJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJzAnLAogICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIHZhbGlkIFJlcXVlc3RlZFRpbWUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBvbiB2YWxpZCBSZXF1ZXN0ZWRUaW1lIGZvciBDaGFuZ2VVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICcyMDA5LTEwLTI5IDEzOjMzOjMzJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFJlcXVlc3RlZFRpbWUgPT4gJzIwMDktMTEtMDYgMDg6MTU6MjInLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICcyMDA5LTExLTA2IDA4OjE1OjIyJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzQzXSwKICAgIH0sCgogICAgIyB0ZXN0IG9uIGludmFsaWQgUmVxdWVzdGVkVGltZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IG9uIGludmFsaWQgUmVxdWVzdGVkVGltZSBmb3IgQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICcyMDA5LTEwLTI5IDEzOjMzOjMzJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFJlcXVlc3RlZFRpbWUgPT4gJ2FueXRoaW5nJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lID0+ICcyMDA5LTEwLTI5IDEzOjMzOjMzJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ1JlcXVlc3RlZFRpbWUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA0MiwgNDMgXSwKICAgIH0sCgogICAgIyBUZXN0IGNhdGVnb3J5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2F0ZWdvcnkgdXBkYXRlICI1IHZlcnkgaGlnaCInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgQ0lQIChDYXRlZ29yeSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENhdGVnb3J5ICAgID0+ICcyIGxvdycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT4gJzUgdmVyeSBoaWdoJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdUZXN0IENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICAgICAgPT4gJzUgdmVyeSBoaWdoJywKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeyc1IHZlcnkgaGlnaCd9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgNTQsIDYwIF0sCiAgICAgICAgTGFiZWwgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIFRlc3QgaW52YWxpZCBjYXRlZ29yeQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGludmFsaWQgY2F0ZWdvcnkgdXBkYXRlICIxOCBzdXBlciBoaWdoIicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IGludmFsaWQgdXBkYXRlIENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgIENhdGVnb3J5ID0+ICcxOCBzdXBlciBoaWdoJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdUZXN0IGludmFsaWQgdXBkYXRlIENJUCAoQ2F0ZWdvcnkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDYXRlZ29yeSAgICAgICAgPT4gJzIgbG93JywKICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICAgICA9PiAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeycyIGxvdyd9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDU0LCA2MCwgNjMsIDY0IF0sCiAgICAgICAgTGFiZWwgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjIFRlc3QgaW1wYWN0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgaW1wYWN0IHVwZGF0ZSAiNSB2ZXJ5IGhpZ2giJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IHVwZGF0ZSBDSVAgKEltcGFjdCkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICcyIGxvdycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgIEltcGFjdCA9PiAnNSB2ZXJ5IGhpZ2gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgdXBkYXRlIENJUCAoSW1wYWN0KSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgICAgID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCAgICAgICAgPT4gJENoYW5nZUltcGFjdE5hbWUySUR7JzUgdmVyeSBoaWdoJ30sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA1NSwgNjEgXSwKICAgICAgICBMYWJlbCA9PiAnT3JkZXJCeUNJUFRlc3RzJywgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMgVGVzdCBpbnZhbGlkIGltcGFjdAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGludmFsaWQgaW1wYWN0IHVwZGF0ZSAiMTggc3VwZXIgaGlnaCInLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCB1cGRhdGUgaW52YWxpZCBDSVAgKEltcGFjdCkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICcyIGxvdycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgIEltcGFjdCA9PiAnMTggc3VwZXIgaGlnaCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCB1cGRhdGUgaW52YWxpZCBDSVAgKEltcGFjdCkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIEltcGFjdCAgICAgICAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgSW1wYWN0SUQgICAgICAgID0+ICRDaGFuZ2VJbXBhY3ROYW1lMklEeycyIGxvdyd9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDYsIDU1LCA2MSBdLAogICAgICAgIExhYmVsID0+ICdPcmRlckJ5Q0lQVGVzdHMnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBpbiBvcmRlciBieSBzZWFyY2ggdGVzdHMKICAgIH0sCgogICAgIyBUZXN0IHByaW9yaXR5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgcHJpb3JpdHkgdXBkYXRlICI1IHZlcnkgaGlnaCInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgdXBkYXRlIENJUCAoUHJpb3JpdHkpIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGVzdCB1cGRhdGUgQ0lQIChQcmlvcml0eSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICA9PiAnNSB2ZXJ5IGhpZ2gnLAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgID0+ICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzUgdmVyeSBoaWdoJ30sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA1NiwgNjIgXSwKICAgICAgICBMYWJlbCA9PiAnT3JkZXJCeUNJUFRlc3RzJywgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMgVGVzdCBpbnZhbGlkIHByaW9yaXR5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgaW52YWxpZCBwcmlvcml0eSB1cGRhdGUgIjE4IHN1cGVyIGhpZ2giJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgaW52YWxpZCB1cGRhdGUgQ0lQIChQcmlvcml0eSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgID0+ICcyIGxvdycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJzE4IHN1cGVyIGhpZ2gnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgaW52YWxpZCB1cGRhdGUgQ0lQIChQcmlvcml0eSkgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgICA9PiAnMiBsb3cnLAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgID0+ICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzIgbG93J30sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgNTYsIDYyIF0sCiAgICAgICAgTGFiZWwgPT4gJ09yZGVyQnlDSVBUZXN0cycsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgVGVzdHMgZm9yIENoYW5nZSBGcmVlVGV4dCBmaWVsZHMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwoKICAgICMgdGVzdCBzb21lIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgQ2hhbmdlQWRkIGFuZCBDaGFuZ2VVcGRhdGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBDaGFuZ2VBZGQgYW5kIENoYW5nZVVwZGF0ZSB3aXRoIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ1Rlc3QgYWRkIGNoYW5nZSB3aXRoIGZyZWV0ZXh0IGZpZWxkcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZUtleTEgID0+ICdBQUEnLAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHQxID0+ICdCQkInLAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZUtleTIgID0+ICdDQ0MnLAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHQyID0+ICdEREQnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlS2V5MyAgPT4gJ0VFRScsCiAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlVGV4dDMgPT4gJ0ZGRicsCiAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlS2V5NCAgPT4gJ0dHRycsCiAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlVGV4dDQgPT4gJ0hISCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MSAgPT4gJ1ctQUFBJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MSA9PiAnVy1CQkInLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIgID0+ICdXLUNDQycsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDIgPT4gJ1ctREREJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdUZXN0IGFkZCBjaGFuZ2Ugd2l0aCBmcmVldGV4dCBmaWVsZHMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkxICA9PiAnQUFBJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0MSA9PiAnQkJCJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkyICA9PiAnQ0NDJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0MiA9PiAnREREJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkzICA9PiAnRUVFJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0MyA9PiAnRkZGJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXk0ICA9PiAnR0dHJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0NCA9PiAnSEhIJywKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA2OSwgNzAsIDcxLCA3MiBdLAogICAgfSwKCiAgICAjIHRlc3QgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyB3aXRoIG1heGltdW0gbGVuZ3RoCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgQ2hhbmdlQWRkIGZyZWV0ZXh0IGZpZWxkcyB3aXRoIDI1MCBjaGFyYWN0ZXJzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCBhZGQgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyB3aXRoIDI1MCBjaGFyYWN0ZXJzIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXk1MCAgPT4gJ0EnIHggMjUwLAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHQ1MCA9PiAnQicgeCAyNTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXk1MCAgPT4gJ0EnIHggMjUwLAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHQ1MCA9PiAnQicgeCAyNTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgIH0sCgogICAgIyB0ZXN0IGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgbGFyZ2VyIHRoYW4gbWF4aW11bSBsZW5ndGgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBDaGFuZ2VBZGQgZnJlZXRleHQgZmllbGRzIHdpdGggMjUxIGNoYXJhY3RlcnMuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgYWRkIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMgd2l0aCAyNTEgY2hhcmFjdGVycyAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlS2V5NTAgID0+ICdBJyB4IDI1MSwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0NTAgPT4gJ0InIHggMjUxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRlc3QgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGxlbmd0aAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IENoYW5nZVVwZGF0ZSBmcmVldGV4dCBmaWVsZHMgd2l0aCAyNTEgY2hhcmFjdGVycy4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCB1cGRhdGUgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyB3aXRoIDI1MSBjaGFyYWN0ZXJzIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXk1MCAgPT4gJ0EnIHggMjUwLAogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHQ1MCA9PiAnQicgeCAyNTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlVGV4dDUwID0+ICdDJyB4IDI1MSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlRnJlZUtleTUwICA9PiAnQScgeCAyNTAsCiAgICAgICAgICAgICAgICBDaGFuZ2VGcmVlVGV4dDUwID0+ICdCJyB4IDI1MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzZdLAogICAgfSwKCiAgICAjIHRlc3QgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcyB3aXRoIHplcm8gYW5kIGVtcHR5IHN0cmluZ3MKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBDaGFuZ2VVcGRhdGUgd2l0aCB6ZXJvIGFuZCBlbXB0eSBzdHJpbmcuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IHVwZGF0ZSBjaGFuZ2UgZnJlZXRleHQgZmllbGRzIHdpdGggemVybyBhbmQgZW1wdHkgc3RyaW5nIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkxICA9PiAnQUFBJywKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0MSA9PiAnQkJCJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkyMCAgPT4gMCwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0MjAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVLZXkyMCAgPT4gMCwKICAgICAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0MjAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgNjkgXSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgVGVzdHMgb24gQ2hhbmdlQ0FCKgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQkdldAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdUZXN0IGNoZWNrcyBlbXB0eSBBUlJBWS1yZWYgb24gQ2hhbmdlQ0FCR2V0IHdpdGggbm8gZ2l2ZW4gQ0FCIGZvciBDaGFuZ2VDQUJHZXQuJywKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VDQUJHZXQgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzICAgID0+IFtdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFtdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDQsIDEyLCAxMyBdLAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIHJlbW92YWwgb2YgZHVwbGljYXRlIENBQiBtZW1iZXJzIGZvciBDaGFuZ2VDQUJVcGRhdGUnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NBQlVwZGF0ZSBhbmQgQ0FCR2V0IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBIaXN0b3J5R2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUFkZCAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIENoYW5nZUNBQlVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgWyB1bmRlZiwgam9pbiAnJSUnLCAkQ3VzdG9tZXJVc2VySURzWzBdLCAkQ3VzdG9tZXJVc2VySURzWzFdIF0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIENoYW5nZUNBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgIFsgdW5kZWYsIGpvaW4gJyUlJywgJFVzZXJJRHNbMF0sICRVc2VySURzWzFdIF0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA2LCA4LCA5LCAxMCwgMjIsIDI4LCAyOSwgMzMsIDM0LCAzNSBdLAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIGludmFsaWQgQ0FCQWdlbnRzIHBhcmFtIGZvciBDaGFuZ2VDQUJVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZUNBQlVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Bhc3NpbmcgYW4gaW50ZWdlciBhcyBDQUJBZ2VudHMgdG8gQ2hhbmdlQ0FCVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ05laXRoZXIgQ0FCQWdlbnRzIG5vciBDQUJDdXN0b21lcnMgaXMgcGFzc2VkLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIGRlYWt0aXZhdGVkIENBQkFnZW50cyBwYXJhbSBmb3IgQ2hhbmdlQ0FCVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkSW52YWxpZFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIGludmFsaWQgQ0FCQ3VzdG9tZXJzIHBhcmFtIGZvciBDaGFuZ2VDQUJVcGRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZUNBQlVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlRmFpbCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUNBQkdldCA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgICAgPT4gW10sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gW10sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUZXN0IGZvciBDaGFuZ2VDQUJVcGRhdGUgYW5kIENoYW5nZUNBQkdldAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdBIHZhbGlkIENBQkN1c3RvbWVyIGlzIHBhc3NlZCB0byBDaGFuZ2VDQUJVcGRhdGUsIG5vIENBQkFnZW50cy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUZXN0IGZvciBDaGFuZ2VDQUJVcGRhdGUgYW5kIENoYW5nZUNBQkdldAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdBIHZhbGlkIENBQkFnZW50IGlzIHBhc3NlZCB0byBDaGFuZ2VDQUJVcGRhdGUsIG5vIENBQkN1c3RvbWVycy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUNBQkdldCA9PiB7CiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQlVwZGF0ZSBhbmQgQ2hhbmdlQ0FCR2V0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY2hlY2tzIHZhbGlkIENoYW5nZUFkZCBhbmQgQ2hhbmdlQ0FCVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJBZ2VudHMgPT4gWwogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VDQUJHZXQgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBUZXN0IGZvciBDaGFuZ2VDQUJEZWxldGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjaGVja3MgQ2hhbmdlQ0FCRGVsZXRlIHdpdGggdmFsaWQgcGFyYW1zLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCRGVsZXRlID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFRlc3QgZm9yIENoYW5nZUNBQkRlbGV0ZSAtIGluIHRoZSBleGVjdXRpaW9uIG9mIHRoZSwgbm8gQ2hhbmdlSUQgd2lsbCBiZSBnaXZlbgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGNoZWNrcyBDaGFuZ2VDQUJEZWxldGUgd2l0aCBpbnZhbGlkIHBhcmFtcy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NBQkRlbGV0ZSAoaW52YWxpZCBwYXJhbXMpIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENBQkFnZW50cyAgID0+IFsKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkVXNlcklEc1sxXQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySURzWzFdLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCRGVsZXRlICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VDQUJEZWxldGVGYWlsID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJFVzZXJJRHNbMV0KICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgNiwgOCwgOSwgMTAgXSwKICAgIH0sCgogICAgIyBhZGQgY2hhbmdlIGFuZCB1cGRhdGUgY2hhbmdlc3RhdGVpZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IHNldHRpbmcgbmV3IENoYW5nZVN0YXRlSUQgaW4gQ2hhbmdlVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVqZWN0ZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVqZWN0ZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDI5LCAzNSBdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgQ2hhbmdlcyBmb3IgJ09yZGVyQnknIHNlYXJjaCB0ZXN0cwogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCgogICAgIwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGFuZ2UgZm9yICdPcmRlckJ5JyB0ZXN0cyAoMSkuIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdPcmRlckJ5Q2hhbmdlIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtzdWNjZXNzZnVsfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQWRkQ2hhbmdlVGltZSA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDA5LTEwLTAxIDAxOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVOYW1lMklEe3N1Y2Nlc3NmdWx9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgTGFiZWwgPT4gJ09yZGVyQnlTZWFyY2hUZXN0JywgICAgIyB0aGlzIGNoYW5nZSB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgYnkgc2VhcmNoIHRlc3RzCiAgICB9LAoKICAgICMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hhbmdlIGZvciAnT3JkZXJCeScgdGVzdHMgKDIpLiIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEICAgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtyZWplY3RlZH0sCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQWRkQ2hhbmdlVGltZSA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDA5LTEwLTMwIDAxOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlVXBkYXRlQ2hhbmdlVGltZSA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lID0+ICcyMDA5LTEwLTMwIDAxOjAwOjE1JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlU3RhdGVJRCA9PiAkQ2hhbmdlU3RhdGVOYW1lMklEe3JlamVjdGVkfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIExhYmVsID0+ICdPcmRlckJ5U2VhcmNoVGVzdCcsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIG9yZGVyIGJ5IHNlYXJjaCB0ZXN0cwogICAgfSwKCiAgICAjCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoYW5nZSBmb3IgJ09yZGVyQnknIHRlc3RzICgzKS4iLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEID0+ICRDaGFuZ2VTdGF0ZU5hbWUySUR7ZmFpbGVkfSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ09yZGVyQnlDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZUFkZENoYW5nZVRpbWUgPT4gewogICAgICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAwOS0wMS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVVwZGF0ZUNoYW5nZVRpbWUgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAwOS0wMS0zMCAyMzo1OTo1OScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVN0YXRlSUQgPT4gJENoYW5nZVN0YXRlTmFtZTJJRHtmYWlsZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbNl0sCiAgICAgICAgTGFiZWwgICAgICA9PiAnT3JkZXJCeVNlYXJjaFRlc3QnLCAgICAjIHRoaXMgY2hhbmdlIHdpbGwgYmUgdXNlZCBpbiBvcmRlciBieSBzZWFyY2ggdGVzdHMKICAgIH0sCgogICAgIyBDaGFuZ2UgZm9yIFBlcm1pc3Npb24gdGVzdHMuCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoYW5nZSBmb3IgJ1Blcm1pc3Npb24nIHRlc3RzLiIsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnUGVybWlzc2lvbiAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdQZXJtaXNzaW9uIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlQ0FCR2V0ID0+IHsKICAgICAgICAgICAgICAgIENBQkFnZW50cyA9PiBbCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgICAgICBMYWJlbCAgICAgID0+ICdQZXJtaXNzaW9uVGVzdCcsICAgICMgdGhpcyBjaGFuZ2Ugd2lsbCBiZSB1c2VkIGluIHBlcm1pc3Npb24gdGVzdHMKICAgIH0sCgogICAgIyBDaGFuZ2UgZm9yIENoYW5nZVBvc3NpYmxlU3RhdGVzR2V0IHRlc3RzLgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGFuZ2UgZm9yICdDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCcgdGVzdHMuIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs2XSwKICAgICAgICBMYWJlbCAgICAgID0+ICdQb3NzaWJsZVN0YXRlc1Rlc3QnLCAgICAjIGNoYW5nZSBmb3IgdGVzdGluZyBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpCiAgICB9LAoKICAgICMgQ2hhbmdlIGZvciBhdHRhY2htZW50IHRlc3RzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZSBmb3IgYXR0YWNobWVudCB0ZXN0cycsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQXR0YWNobWVudHMgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQXR0YWNobWVudHMgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbNl0sCiAgICAgICAgTGFiZWwgICAgICA9PiAnQXR0YWNobWVudCcsCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGV4ZWN1dGUgdGhlIGdlbmVyYWwgY2hhbmdlIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVUZXN0ZWRDaGFuZ2VJRDsgICAgICAgICAgICMgY2hhbmdlIGlkcyBvZiBjcmVhdGVkIGNoYW5nZXMKbXkgJUNoYW5nZUlERm9yU2VhcmNoVGVzdDsgICAgIyBjaGFuZ2UgaWRzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGZvdW5kIGJ5IGEgc2VhcmNoIHRlc3QKbXkgJUxhYmVsMkNoYW5nZUlEczsgICAgICAgICAgIyBjaGFuZ2UgaWRzIHRoYXQgYXJlIHVzZWQgZm9yIHNwZWNpYWwgdGVzdHMKClRFU1Q6CmZvciBteSAkVGVzdCAoQENoYW5nZVRlc3RzKSB7CgogICAgIyBjaGVjayBTb3VyY2VEYXRhIGF0dHJpYnV0ZQogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VEYXRhfSB8fCByZWYgJFRlc3QtPntTb3VyY2VEYXRhfSBuZSAnSEFTSCcgKSB7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBObyBTb3VyY2VEYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QgKHRlc3QgY2FzZTogIgogICAgICAgICAgICAgICAgLiAoICRUZXN0Q291bnQgLSAkVGVzdENvdW50TWlzYyApIC4gIikuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBwcmludCB0ZXN0IGNhc2UgZGVzY3JpcHRpb24KICAgIGlmICggJFRlc3QtPntEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRUZXN0LT57RGVzY3JpcHRpb259ICh0ZXN0IGNhc2U6ICIKICAgICAgICAgICAgICAgIC4gKCAkVGVzdENvdW50IC0gJFRlc3RDb3VudE1pc2MgKSAuICIpLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGV4dHJhY3QgdGVzdCBkYXRhCiAgICBteSAkU291cmNlRGF0YSAgICA9ICRUZXN0LT57U291cmNlRGF0YX07CiAgICBteSAkUmVmZXJlbmNlRGF0YSA9ICRUZXN0LT57UmVmZXJlbmNlRGF0YX07CgogICAgIyB0aGUgY2hhbmdlIGlkIHdpbGwgYmUgdXNlZCBmb3Igc2V2ZXJhbCBjYWxscwogICAgbXkgJENoYW5nZUlEOwoKICAgICMgYWRkIGEgbmV3IENoYW5nZQogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUFkZH0gKSB7CgogICAgICAgICMgYWRkIHRoZSBjaGFuZ2UKICAgICAgICAkQ2hhbmdlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9IH0KICAgICAgICApOwoKICAgICAgICAjIHJlbWVtYmVyIGN1cnJlbnQgQ2hhbmdlSUQKICAgICAgICBpZiAoJENoYW5nZUlEKSB7CiAgICAgICAgICAgICRUZXN0ZWRDaGFuZ2VJRHskQ2hhbmdlSUR9ID0gMTsKCiAgICAgICAgICAgICMgc2F2ZSBjaGFuZ2VpZCBmb3IgdXNlIGluIHNlYXJjaCB0ZXN0cwogICAgICAgICAgICBpZiAoIGV4aXN0cyAkVGVzdC0+e1NlYXJjaFRlc3R9ICkgewogICAgICAgICAgICAgICAgbXkgQFNlYXJjaFRlc3RzID0gQHsgJFRlc3QtPntTZWFyY2hUZXN0fSB9OwoKICAgICAgICAgICAgICAgIGZvciBteSAkU2VhcmNoVGVzdE5yIChAU2VhcmNoVGVzdHMpIHsKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlSURGb3JTZWFyY2hUZXN0eyRTZWFyY2hUZXN0TnJ9LT57JENoYW5nZUlEfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSBjaGFuZ2VpZCBmb3Igc3BlY2lhbCB0ZXN0cwogICAgICAgICAgICBpZiAoIGV4aXN0cyAkVGVzdC0+e0xhYmVsfSApIHsKICAgICAgICAgICAgICAgICRMYWJlbDJDaGFuZ2VJRHN7ICRUZXN0LT57TGFiZWx9IH0gfHw9IFtdOwogICAgICAgICAgICAgICAgcHVzaCBAeyAkTGFiZWwyQ2hhbmdlSURzeyAkVGVzdC0+e0xhYmVsfSB9IH0sICRDaGFuZ2VJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGFuZ2UgQ3JlYXRlVGltZQogICAgICAgIGlmICggJENoYW5nZUlEICYmICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkQ2hhbmdlVGltZX0gKSB7CiAgICAgICAgICAgIFNldFRpbWVzKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBDcmVhdGVUaW1lID0+ICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkQ2hhbmdlVGltZX0tPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgVXNlcklEIGlzIHRoZSBvbmx5IHJlcXVpcmVkIHBhcmFtZXRlcgogICAgICAgIGlmICggISRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZUFkZCgpIC0gRG9uJ3QgYWRkIGNoYW5nZSB3aXRob3V0IGdpdmVuIFVzZXJJRC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUFkZH0tPntVc2VySUR9ICkgewogICAgICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VBZGQoKSAtIEFkZCBjaGFuZ2Ugc2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlQWRkKCkgLSBBZGQgY2hhbmdlLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAgICAjIGVuZCBpZiAnQ2hhbmdlQWRkJwoKICAgIGlmICggZXhpc3RzICRTb3VyY2VEYXRhLT57Q2hhbmdlVXBkYXRlfSApIHsKCiAgICAgICAgIyB1cGRhdGUgdGhlIGNoYW5nZQogICAgICAgIG15ICRDaGFuZ2VVcGRhdGVTdWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VVcGRhdGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VVcGRhdGV9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGFuZ2UgQ2hhbmdlVGltZQogICAgICAgIGlmICggJENoYW5nZUlEICYmICRTb3VyY2VEYXRhLT57Q2hhbmdlVXBkYXRlQ2hhbmdlVGltZX0gKSB7CiAgICAgICAgICAgIFNldFRpbWVzKAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBDaGFuZ2VUaW1lID0+ICRTb3VyY2VEYXRhLT57Q2hhbmdlVXBkYXRlQ2hhbmdlVGltZX0tPntDaGFuZ2VUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFRlc3QtPntGYWlsc30KICAgICAgICAgICAgfHwgJFRlc3QtPntVcGRhdGVGYWlsc30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJENoYW5nZVVwZGF0ZVN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VVcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VVcGRhdGVTdWNjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlVXBkYXRlKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgQ2hhbmdlVXBkYXRlCgogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUNBQlVwZGF0ZX0gJiYgJENoYW5nZUlEICkgewogICAgICAgIG15ICRDQUJVcGRhdGVTdWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VDQUJVcGRhdGUoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q2hhbmdlQ0FCVXBkYXRlfSB9LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUNBQlVwZGF0ZUZhaWx9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkQ0FCVXBkYXRlU3VjY2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUNBQlVwZGF0ZSIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDQUJVcGRhdGVTdWNjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQ0FCVXBkYXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9ICAgICMgZW5kIGlmICdDaGFuZ2VDQUJVcGRhdGUnCgogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUNBQkRlbGV0ZX0gJiYgJENoYW5nZUlEICkgewogICAgICAgIG15ICVDQUJEZWxldGVQYXJhbXMgPSAoCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGZhaWwgdGVzdHMKICAgICAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlQ0FCRGVsZXRlRmFpbH0gKSB7CgogICAgICAgICAgICAjIHRlc3Qgdm9pZCBjb250ZXh0CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0FCRGVsZXRlKCkgfHwgMCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUNBQkRlbGV0ZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBARGVsZXRlVGVzdHMgPSAoCiAgICAgICAgICAgICAgICB7IFVzZXJJRCAgID0+IDEgfSwKICAgICAgICAgICAgICAgIHsgQ2hhbmdlSUQgPT4gJENoYW5nZUlEIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkRmFpbFRlc3QgKEBEZWxldGVUZXN0cykgewogICAgICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0FCRGVsZXRlKCAleyRGYWlsVGVzdH0gKSB8fCAwLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUNBQkRlbGV0ZSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBEZWxldGUgd2l0aCBhbGwgcGFyYW1zCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VDQUJEZWxldGUoJUNBQkRlbGV0ZVBhcmFtcyksCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGFuZ2VDQUJEZWxldGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgJ0NoYW5nZUNBQkRlbGV0ZScKCiAgICAjIGFkZCBhIHdvcmtvcmRlcgogICAgaWYgKCAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gKSB7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfSB9LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gV29ya09yZGVyQWRkIiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGEgY2hhbmdlIGFuZCBjb21wYXJlIHRoZSByZXRyaWV2ZWQgZGF0YSB3aXRoIHRoZSByZWZlcmVuY2UKICAgIGlmICggZXhpc3RzICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlR2V0fSApIHsKCiAgICAgICAgbXkgJENoYW5nZUdldFJlZmVyZW5jZURhdGEgPSAkUmVmZXJlbmNlRGF0YS0+e0NoYW5nZUdldH07CgogICAgICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZUdldCBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZwogICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkQ2hhbmdlRGF0YSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIEdldCBjaGFuZ2UgcmV0dXJucyB1bmRlZi4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBleGNwZWN0ZWQgdG8gZmFpbAogICAgICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRDaGFuZ2VEYXRhLAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gU2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgYWx3YXlzIGV4aXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJENoYW5nZUF0dHJpYnV0ZXMgKHF3KENoYW5nZUlEIENoYW5nZU51bWJlciBDaGFuZ2VCdWlsZGVySUQgQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDaGFuZ2VEYXRhLT57JENoYW5nZUF0dHJpYnV0ZXN9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gaGFzICRDaGFuZ2VBdHRyaWJ1dGVzLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFJlcXVlc3RlZEF0dHJpYnV0ZSAoIGtleXMgJXsgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9IH0gKSB7CgogICAgICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAgICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkKICAgICAgICAgICAgbXkgJENoYW5nZUF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkQ2hhbmdlRGF0YS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CgogICAgICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZQogICAgICAgICAgICAgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9LT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRDaGFuZ2VBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgJ0NoYW5nZUdldCcKCiAgICBpZiAoICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlQ0FCR2V0fSApIHsKICAgICAgICBteSAkQ0FCRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0FCR2V0KAogICAgICAgICAgICAleyAkUmVmZXJlbmNlRGF0YS0+e0NoYW5nZUNBQkdldH0gfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkUmVxdWVzdGVkQXR0cmlidXRlICgga2V5cyAleyAkUmVmZXJlbmNlRGF0YS0+e0NoYW5nZUNBQkdldH0gfSApIHsKCiAgICAgICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKQogICAgICAgICAgICBteSAkQ2hhbmdlQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRDQUJEYXRhLT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgICAgICAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlCiAgICAgICAgICAgICAgICA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkUmVmZXJlbmNlRGF0YS0+e0NoYW5nZUNBQkdldH0tPnskUmVxdWVzdGVkQXR0cmlidXRlfSApOwoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENoYW5nZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICRSZWZlcmVuY2VBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGFuZ2VDQUJHZXQgKCAkUmVxdWVzdGVkQXR0cmlidXRlICkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgJ0NoYW5nZUNBQkdldCcKCiAgICAjIHRlc3QgaGlzdG9yeSBlbnRyaWVzCiAgICBpZiAoICRSZWZlcmVuY2VEYXRhLT57SGlzdG9yeUdldH0gKSB7CgogICAgICAgICMgZ2V0IHN1YnRyZWUKICAgICAgICBteSAkQ2hlY2tEYXRhID0gJFJlZmVyZW5jZURhdGEtPntIaXN0b3J5R2V0fTsKCiAgICAgICAgIyBnZXQgYWxsIGhpc3RvcnkgZW50cmllcwogICAgICAgIG15ICRIaXN0b3J5RW50cmllcyA9ICRTZWxmLT57SGlzdG9yeU9iamVjdH0tPkNoYW5nZUhpc3RvcnlHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlSGlzdG9yeVR5cGUyQ2hlY2tJbmRleDsKCiAgICAgICAgIyBjaGVjayBoaXN0b3J5IGVudHJpZXMKICAgICAgICBISVNUT1JZRU5UUlk6CiAgICAgICAgZm9yIG15ICRIaXN0b3J5RW50cnkgKCBAeyRIaXN0b3J5RW50cmllc30gKSB7CiAgICAgICAgICAgIG15ICRIaXN0b3J5VHlwZSA9ICRIaXN0b3J5RW50cnktPntIaXN0b3J5VHlwZX07CiAgICAgICAgICAgIG15ICREYXRhRm9yVHlwZSA9ICRDaGVja0RhdGEtPnskSGlzdG9yeVR5cGV9OwoKICAgICAgICAgICAgaWYgKCAkSGlzdG9yeVR5cGUgZXEgJ0NoYW5nZUFkZCcgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnROZXd9LAogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGVjayBDaGFuZ2VBZGQgaGlzdG9yeSBlbnRyeSAiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRIaXN0b3J5VHlwZSBlcSAnQ2hhbmdlVXBkYXRlJyB8fCAkSGlzdG9yeVR5cGUgZXEgJ0NoYW5nZUNBQlVwZGF0ZScgKSB7CgogICAgICAgICAgICAgICAgbXkgJEluZGV4ICAgICA9ICRIaXN0b3J5VHlwZTJDaGVja0luZGV4eyRIaXN0b3J5VHlwZX0rKzsKICAgICAgICAgICAgICAgIG15ICRGaWVsZG5hbWUgPSAkSGlzdG9yeUVudHJ5LT57RmllbGRuYW1lfTsKCiAgICAgICAgICAgICAgICBuZXh0IEhJU1RPUllFTlRSWSBpZiAhJERhdGFGb3JUeXBlLT57JEZpZWxkbmFtZX07CgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5RW50cnktPntDb250ZW50T2xkfSwKICAgICAgICAgICAgICAgICAgICAkRGF0YUZvclR5cGUtPnskRmllbGRuYW1lfS0+WyRJbmRleF0tPlswXSwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGVjayBDaGFuZ2VVcGRhdGUgLT4gQ29udGVudE9sZCAiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlFbnRyeS0+e0NvbnRlbnROZXd9LAogICAgICAgICAgICAgICAgICAgICREYXRhRm9yVHlwZS0+eyRGaWVsZG5hbWV9LT5bJEluZGV4XS0+WzFdLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoZWNrIENoYW5nZVVwZGF0ZSAtPiBDb250ZW50TmV3IGZvciAkRmllbGRuYW1lIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgZ2V0IGV4ZWN1dGVkIGVhY2ggbG9vcCwgZXZlbiBvbiBuZXh0CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3QgZm9yIENoYW5nZUxvb2t1cAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAoJENoYW5nZUxvb2t1cFRlc3RDaGFuZ2VJRCkgPSBAeyAkTGFiZWwyQ2hhbmdlSURze0NoYW5nZUxvb2t1cFRlc3R9IHx8IFtdIH07CgppZiAoJENoYW5nZUxvb2t1cFRlc3RDaGFuZ2VJRCkgewogICAgbXkgJENoYW5nZURhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlTG9va3VwVGVzdENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlTG9va3VwKAogICAgICAgIENoYW5nZU51bWJlciA9PiAkQ2hhbmdlRGF0YS0+e0NoYW5nZU51bWJlcn0sCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgJENoYW5nZURhdGEtPntDaGFuZ2VJRH0sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICc6IENoYW5nZUxvb2t1cCB3aXRoIENoYW5nZU51bWJlciAnCiAgICAgICAgICAgIC4gJENoYW5nZURhdGEtPntDaGFuZ2VOdW1iZXJ9IC4gJyBzdWNjZXNzZnVsLicsCiAgICApOwoKICAgIG15ICRDaGFuZ2VOdW1iZXIgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUxvb2t1cCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlTG9va3VwVGVzdENoYW5nZUlELAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENoYW5nZU51bWJlciwKICAgICAgICAkQ2hhbmdlRGF0YS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IENoYW5nZUxvb2t1cCB3aXRoIENoYW5nZUlEICRDaGFuZ2VMb29rdXBUZXN0Q2hhbmdlSUQgc3VjY2Vzc2Z1bC4iLAogICAgKTsKCiAgICAjIG5vdyBzb21lIHBhcmFtIGNoZWNrcyBmb3IgQ2hhbmdlTG9va3VwKCkKICAgIG15ICRMb29rdXBPayA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlTG9va3VwKCBVc2VySUQgPT4gMSApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkTG9va3VwT2ssCiAgICAgICAgJ09ubHkgYW4gdW51c2VkIHBhcmFtIHBhc3NlZCB0byBDaGFuZ2VMb29rdXAoKScsCiAgICApOwoKICAgICRMb29rdXBPayA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlTG9va3VwKCk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRMb29rdXBPaywKICAgICAgICAnTm8gcGFyYW0gcGFzc2VkIHRvIENoYW5nZUxvb2t1cCgpJywKICAgICk7CgogICAgJExvb2t1cE9rID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VMb29rdXAoCiAgICAgICAgQ2hhbmdlSUQgICAgID0+ICRDaGFuZ2VMb29rdXBUZXN0Q2hhbmdlSUQsCiAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICRDaGFuZ2VEYXRhLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRMb29rdXBPaywKICAgICAgICAnRXhjbHVzaXZlIHBhcmFtcyBwYXNzZWQgdG8gQ2hhbmdlTG9va3VwKCknLAogICAgKTsKfQoKIyB0ZXN0IGlmIENoYW5nZUxpc3QgcmV0dXJucyBhdCBsZWFzdCBhcyBtYW55IGNoYW5nZXMgYXMgd2UgY3JlYXRlZAojIHdlIGNhbm5vdCB0ZXN0IGZvciBhIHNwZWNpZmljIG51bWJlciBhcyB0aGVzZSB0ZXN0cyBjYW4gYmUgcnVuIGluIGV4aXN0aW5nIGVudmlyb25tZW50cwojIHdoZXJlIG90aGVyIGNoYW5nZXMgYWxyZWFkeSBleGlzdApteSAkQ2hhbmdlTGlzdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlTGlzdCggVXNlcklEID0+IDEgKSB8fCBbXTsKbXkgJUNoYW5nZUxpc3RNYXAgPSBtYXAgeyAkXyA9PiAxIH0gQHskQ2hhbmdlTGlzdH07CgojIGNoZWNrIHdoZXRoZXIgdGhlIGNyZWF0ZWQgY2hhbmdlcyB3ZXJlIGZvdW5kIGJ5IENoYW5nZUxpc3QoKQpmb3IgbXkgJEtleVRlc3RlZENoYW5nZUlEICgga2V5cyAlVGVzdGVkQ2hhbmdlSUQgKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlTGlzdE1hcHskS2V5VGVzdGVkQ2hhbmdlSUR9LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VMaXN0KCkgLSBDaGFuZ2VJRCAkS2V5VGVzdGVkQ2hhbmdlSUQgaW4gbGlzdC4iLAogICAgKTsKfQoKIyBjb3VudCBhbGwgdGVzdHMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYW5kIHBsYW5uZWQgZm9yIGZhaWwKbXkgJEZhaWxzID0gc2NhbGFyIGdyZXAgeyAkXy0+e0ZhaWxzfSB9IEBDaGFuZ2VUZXN0czsKbXkgJE5yQ3JlYXRlQ2hhbmdlcyA9ICggc2NhbGFyIEBDaGFuZ2VUZXN0cyApIC0gJEZhaWxzOwoKIyB0ZXN0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIga2V5cyAlVGVzdGVkQ2hhbmdlSUQgfHwgMCwKICAgICROckNyZWF0ZUNoYW5nZXMsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogYW1vdW50IG9mIGNoYW5nZSBvYmplY3RzIGFuZCB0ZXN0IGNhc2VzLicsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgY2hhbmdlIHNlYXJjaCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwoKbXkgQENoYW5nZVNlYXJjaFRlc3RzID0gKAoKICAgICMgTnIgMSAtIGEgc2ltcGxlIGNoZWNrIGlmIHRoZSBzZWFyY2ggZnVuY3Rpb25zIHRha2VzIGNhcmUgb2YgIkxpbWl0IgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdMaW1pdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBMaW1pdCA9PiAzLCAgICAjIGV4cGVjdCBvbmx5IDMgcmVzdWx0cwogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLCAgICAjIGZsYWcgZm9yIGNoZWNrIHJlc3VsdCBhbW91bnQKICAgICAgICAgICAgQ291bnQgICAgID0+IDMsICAgICMgY2hlY2sgb24gMyByZXN1bHRzCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyIC0gc2VhcmNoIGZvciBhbGwgY2hhbmdlcyBjcmVhdGVkIGJ5IG91ciBmaXJzdCB1c2VyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVRpdGxlLCBKdXN0aWZpY2F0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ0NoYW5nZSAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnQ2hhbmdlIDEgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMyAtIHRlc3QgY3JlYXRldGltZW5ld2VyZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lIC0gKCA2MCAqIDYwICksCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNCAtIHRlc3QgY3JlYXRldGltZW9sZGVyZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lICsgKCA2MCAqIDYwICksCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNSAtIHRlc3QgQ2hhbmdlTWFuYWdlcklECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU1hbmFnZXJJRCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VNYW5hZ2VySURzID0+IFsgJFVzZXJJRHNbMF0gXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA2IC0gdGVzdCBDaGFuZ2VCdWlsZGVySUQgYW5kIENoYW5nZVRpdGxlIHdpdGggd2lsZGNhcmQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlQnVpbGRlcklEJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUJ1aWxkZXJJRHMgPT4gWyAkVXNlcklEc1swXSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA3IC0gdGVzdCBDaGFuZ2VNYW5hZ2VySUQgYW5kIENoYW5nZUJ1aWxkZXJJRAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VCdWlsZGVySUQsIENoYW5nZU1hbmFnZXJJRCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VCdWlsZGVySURzID0+IFsgJFVzZXJJRHNbMF0gXSwKICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEcyA9PiBbICRJbnZhbGlkVXNlcklEc1swXSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgIENvdW50ICAgICA9PiAwLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgOCAtIHRlc3QgQ0FCQWdlbnQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ0FCQWdlbnQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ0FCQWdlbnRzICAgPT4gWyAkVXNlcklEc1swXSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgOSAtIHRlc3QgQ0FCQ3VzdG9tZXIKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ0FCQ3VzdG9tZXInLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ0FCQ3VzdG9tZXJzID0+IFsgJEN1c3RvbWVyVXNlcklEc1swXSBdLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDEwIC0gdGVzdCBDQUJBZ2VudCBhbmQgQ0FCQ3VzdG9tZXIKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ0FCQWdlbnQsIENBQkN1c3RvbWVyJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENBQkFnZW50cyAgICA9PiBbICRVc2VySURzWzBdIF0sCiAgICAgICAgICAgIENBQkN1c3RvbWVycyA9PiBbICRDdXN0b21lclVzZXJJRHNbMV0gXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxMSAtIHRlc3QgSnVzdGlmaWNhdGlvbgogICAgIyBUb0FzY2lpKCkgYWRkcyBhbiBleHRyYSBuZXdsaW5lCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0p1c3RpZmljYXRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAnSicgeCAzNzk5IC4gIlxuIiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxMiAtIHRlc3QgY2hhbmdldGltZW5ld2VyZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VUaW1lTmV3ZXJEYXRlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpbWVOZXdlckRhdGUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lIC0gKCA2MCAqIDYwICksCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTMgLSB0ZXN0IGNoYW5nZXRpbWVvbGRlcmRhdGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSArICggNjAgKiA2MCApLAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDE0IC0gQ2hhbmdlVGl0bGUgd2l0aCB3aWxkY2FyZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VUaXRsZSB3aXRoIHdpbGRjYXJkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICggJ1QnIHggMjUwICkgLiAnJScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTUgLSBEZXNjcmlwdGlvbiB3aXRoIHdpbGRjYXJkCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0Rlc2NyaXB0aW9uIHdpdGggd2lsZGNhcmQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gKCAnRCcgeCAyNTAgKSAuICclJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxNiAtIEp1c3RpZmljYXRpb24gd2l0aCB3aWxkY2FyZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdKdXN0aWZpY2F0aW9uIHdpdGggd2lsZGNhcmQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAoICdKJyB4IDI1MCApIC4gJyUnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDE3IC0gQ2hhbmdlVGl0bGUsIERlc2NyaXB0aW9uLCBKdXN0aWZpY2F0aW9uIHdpdGggd2lsZGNhcmQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlVGl0bGUsIERlc2NyaXB0aW9uLCBKdXN0aWZpY2F0aW9uIHdpdGggd2lsZGNhcmQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAoICdUJyB4IDI1MCApIC4gJyUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICggJ0QnIHggMjUwICkgLiAnJScsCiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gKCAnSicgeCAyNTAgKSAuICclJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxOCAtIENoYW5nZVRpdGxlIHdpdGggJzAnCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoYW5nZVRpdGxlIHdpdGggJzAnIiwKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxOSAtIERlc2NyaXB0aW9uIHdpdGggJzAnCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkRlc2NyaXB0aW9uIHdpdGggJzAnIiwKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyMCAtIEp1c3RpZmljYXRpb24gd2l0aCAnMCcKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiSnVzdGlmaWNhdGlvbiB3aXRoICcwJyIsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyMSAtIENoYW5nZVRpdGxlLCBEZXNjcmlwdGlvbiwgSnVzdGlmaWNhdGlvbiB3aXRoICcwJwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGFuZ2VUaXRsZSwgRGVzY3JpcHRpb24sIEp1c3RpZmljYXRpb24gd2l0aCAnMCciLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAnMCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJzAnLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyMiAtIENoYW5nZVN0YXRlSUQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVJRCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTdGF0ZUlEcyA9PiBbICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSBdLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDIzIC0gQ2hhbmdlQnVpbGRlcklECiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZUJ1aWxkZXJJRCAodHdvIGJ1aWxkZXJzKScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VCdWlsZGVySURzID0+IFsgJFVzZXJJRHNbMF0sICRVc2VySURzWzFdIF0sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjQgLSBDaGFuZ2VNYW5hZ2VySUQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTWFuYWdlcklEICh0d28gbWFuYWdlciknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlTWFuYWdlcklEcyA9PiBbICRVc2VySURzWzBdLCAkVXNlcklEc1sxXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDI1IC0gQ3JlYXRlQnkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ3JlYXRlQnkgKHR3byBjcmVhdG9ycyknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gWyAxLCAkVXNlcklEc1swXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDI2IC0gQ2hhbmdlQnkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlQnkgKHR3byBjcmVhdG9ycyknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gWyAxLCAkVXNlcklEc1swXSBdLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDI3IC0gdGVzdCBjaGFuZ2V0aW1lbmV3ZXJkYXRlIGFuZCBjaGFuZ2V0aW1lb2xkZXJkYXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVRpbWVOZXdlckRhdGUsIENoYW5nZVRpbWVPbGRlckRhdGUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGltZU5ld2VyRGF0ZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUgLSAoIDYwICogNjAgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQ2hhbmdlVGltZU9sZGVyRGF0ZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUgKyAoIDYwICogNjAgKSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyOCAtIENoYW5nZVN0YXRlSUQgKHNhbWUgSUQgdGhyZWUgdGltZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlSUQgKHNhbWUgSUQgdGhyZWUgdGltZXMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyOSAtIENoYW5nZVN0YXRlSUQgKHRocmVlIGRpZmZlcmVudCBJRHMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlSUQgKHRocmVlIGRpZmZlcmVudCBJRHMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlSURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7cmVxdWVzdGVkfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VTdGF0ZU5hbWUySUR7YXBwcm92ZWR9LAogICAgICAgICAgICAgICAgJENoYW5nZVN0YXRlTmFtZTJJRHtyZWplY3RlZH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMzAgLSBVc2luZ1dpbGRjYXJkcyA9PiAwLCBDaGFuZ2VUaXRsZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdVc2luZ1dpbGRjYXJkcyA9PiAwLCBDaGFuZ2VUaXRsZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICA9PiAnVW5pdFRlc3QtSVRTTUNoYW5nZS0lTm9XaWxkY2FyZHMlJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgQ291bnQgICAgID0+IDAsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzMSAtIFVzaW5nV2lsZGNhcmRzID0+IDAsIERlc2NyaXB0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1VzaW5nV2lsZGNhcmRzID0+IDAsIERlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgID0+ICdVbml0VGVzdC1JVFNNQ2hhbmdlLSVOb1dpbGRjYXJkcyUnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICBDb3VudCAgICAgPT4gMCwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDMyIC0gVXNpbmdXaWxkY2FyZHMgPT4gMCwgRGVzY3JpcHRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVXNpbmdXaWxkY2FyZHMgPT4gMCwgRGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJE5vV2lsZGNhcmRzVGVzdFRpdGxlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDMzIC0gQ2hhbmdlU3RhdGUgKG5hbWVzLCBub3QgSURzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VTdGF0ZSAobmFtZXMsIG5vdCBJRHMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlcyA9PiBbJ3JlcXVlc3RlZCddLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDM0IC0gQ2hhbmdlU3RhdGUgKHNhbWUgbmFtZSB0aHJlZSB0aW1lcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGUgKHNhbWUgbmFtZSB0aHJlZSB0aW1lcyknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU3RhdGVzID0+IFtxdyhyZXF1ZXN0ZWQgcmVxdWVzdGVkIHJlcXVlc3RlZCldLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDM1IC0gQ2hhbmdlU3RhdGUgKHRocmVlIGRpZmZlcmVudCBuYW1lcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGUgKHRocmVlIGRpZmZlcmVudCBuYW1lcyknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU3RhdGVzID0+IFtxdyhyZXF1ZXN0ZWQgYXBwcm92ZWQgcmVqZWN0ZWQpXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzNiAtIENoYW5nZVN0YXRlIChub24tZXhpc3RlbnQgc3RhdGUpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZVN0YXRlIChub24tZXhpc3RlbnQgc3RhdGUpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlcyA9PiBbcXcocmVxdWVzdGVkIGFwcHJvdmVkIHJlamVjdGVkIG5vbi1leGlzdGVudCldLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciAzNyAtIENoYW5nZVN0YXRlcyAobmFtZXMgbm90IGlkcykKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGVzIChuYW1lcyBub3QgaWRzKSAtIGZhaWxlZCArIHJlcXVlc3RlZCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBEZXNjcmlwdGlvbiAgPT4gJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgPT4gW3F3KHJlcXVlc3RlZCBmYWlsZWQpXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDM4IC0gQ2hhbmdlU3RhdGVzIChuYW1lcyBub3QgaWRzKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VTdGF0ZXMgKG5hbWVzIG5vdCBpZHMpIC0gcGVuZGluZyBhcHByb3ZhbCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBEZXNjcmlwdGlvbiAgPT4gJ0NoYW5nZVN0YXRlcyAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBDaGFuZ2VTdGF0ZXMgPT4gWydwZW5kaW5nIGFwcHJvdmFsJ10sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzOSAtIENoYW5nZVN0YXRlIChub24tZXhpc3RlbnQgc3RhdGUgb25seSkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlU3RhdGUgKG5vbi1leGlzdGVudCBzdGF0ZSknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU3RhdGVzID0+IFsnbm9uLWV4aXN0ZW50J10sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDQwIC0gU2VhcmNoIGZvciBhbiBpbnZhbGlkIGNoYW5nZSBzdGF0ZSBpZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFuIGludmFsaWQgY2hhbmdlIHN0YXRlIGlkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVN0YXRlSURzID0+IFstMTFdLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICA9PiAnQ2hhbmdlU3RhdGVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDQxIC0gU2VhcmNoIGZvciBhbiBpbnZhbGlkIGNoYW5nZSBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgYW4gaW52YWxpZCBSZXF1ZXN0ZWRUaW1lJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFJlcXVlc3RlZFRpbWVPbGRlckRhdGUgPT4gJ2FueXRoaW5nJywKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgNDIgLSBTZWFyY2ggZm9yIGFuIHZhbGlkIGNoYW5nZSBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgYW4gdmFsaWQgUmVxdWVzdGVkVGltZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lT2xkZXJEYXRlID0+ICcyMDA5LTEwLTI5IDEzOjMzOjMzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICA9PiAnUmVxdWVzdGVkVGltZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNDMgLSBTZWFyY2ggZm9yIGFuIHZhbGlkIGNoYW5nZSBSZXF1ZXN0ZWRUaW1lTmV3ZXJEYXRlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgYW4gdmFsaWQgUmVxdWVzdGVkVGltZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBSZXF1ZXN0ZWRUaW1lTmV3ZXJEYXRlID0+ICcyMDA5LTEwLTI5IDEzOjMzOjMzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICA9PiAnUmVxdWVzdGVkVGltZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNDQgLSBTZWFyY2ggZm9yIGFuIGludmFsaWQgY2hhbmdlIFJlcXVlc3RlZFRpbWVOZXdlckRhdGUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBhbiBpbnZhbGlkIFJlcXVlc3RlZFRpbWUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgUmVxdWVzdGVkVGltZU5ld2VyRGF0ZSA9PiAnYW55dGhpbmcnLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciA0NSAtIFNlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgID0+ICJUaXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNDYgLSBTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBub3JtYWxpemVkIHRpdGxlLCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlICAgID0+ICJUaXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDQ3IC0gU2VhcmNoIGZvciBub3JtYWxpemVkIHRpdGxlLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICA9PiAiVGl0bGUgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0gIiAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA0OCAtIFNlYXJjaCBmb3IgcGxhaW4gZGVzY3JpcHRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBwbGFpbiBkZXNjcmlwdGlvbicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICA9PiAnVGhpcyBpcyBib2xkIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA0OSAtIFNlYXJjaCBmb3IgcGxhaW4ganVzdGlmaWNhdGlvbgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIHBsYWluIGRlc2NyaXB0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIEp1c3RpZmljYXRpb24gID0+ICdUaGlzIGlzIGJvbGQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDUwIC0gU2VhcmNoIGZvciBwbGFpbiBqdXN0aWZpY2F0aW9uCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgcGxhaW4gZGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJ1RoaXMgaXMgYm9sZCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBKdXN0aWZpY2F0aW9uICA9PiAnVGhpcyBpcyBib2xkIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA1MSAtIFNlYXJjaCBmb3IgY2F0ZWdvcnkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjYXRlZ29yeScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDYXRlZ29yaWVzICA9PiBbJzEgdmVyeSBsb3cnXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNTIgLSBTZWFyY2ggZm9yIGltcGFjdAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGltcGFjdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBJbXBhY3RzICAgICA9PiBbJzEgdmVyeSBsb3cnXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QgQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNTMgLSBTZWFyY2ggZm9yIHByaW9yaXR5CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgcHJpb3JpdHknLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgUHJpb3JpdGllcyAgPT4gWycxIHZlcnkgbG93J10sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDU0IC0gU2VhcmNoIGZvciBjYXRlZ29yaWVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgY2F0ZWdvcmllcycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDYXRlZ29yaWVzID0+IFsgJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCAnNSB2ZXJ5IGhpZ2gnIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDU1IC0gU2VhcmNoIGZvciBpbXBhY3RzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgaW1wYWN0cycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBJbXBhY3RzID0+IFsgJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCAnNSB2ZXJ5IGhpZ2gnIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDU2IC0gU2VhcmNoIGZvciBwcmlvcml0aWVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgcHJpb3JpdGllcycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBQcmlvcml0aWVzID0+IFsgJzEgdmVyeSBsb3cnLCAnMiBsb3cnLCAnNSB2ZXJ5IGhpZ2gnIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDU3IC0gU2VhcmNoIGZvciBjYXRlZ29yeSBpZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNhdGVnb3J5IGlkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENhdGVnb3J5SURzID0+IFsgJENoYW5nZUNhdGVnb3J5TmFtZTJJRHsnMSB2ZXJ5IGxvdyd9IF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDU4IC0gU2VhcmNoIGZvciBpbXBhY3QgaWQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbXBhY3QgaWQnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgSW1wYWN0SURzICAgPT4gWyAkQ2hhbmdlSW1wYWN0TmFtZTJJRHsnMSB2ZXJ5IGxvdyd9IF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDU5IC0gU2VhcmNoIGZvciBwcmlvcml0eSBpZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIHByaW9yaXR5IGlkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFByaW9yaXR5SURzID0+IFsgJENoYW5nZVByaW9yaXR5TmFtZTJJRHsnMSB2ZXJ5IGxvdyd9IF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0IENJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDYwIC0gU2VhcmNoIGZvciBjYXRlZ29yeSBpZHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjYXRlZ29yeSBpZHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gWwogICAgICAgICAgICAgICAgJENoYW5nZUNhdGVnb3J5TmFtZTJJRHsnMSB2ZXJ5IGxvdyd9LAogICAgICAgICAgICAgICAgJENoYW5nZUNhdGVnb3J5TmFtZTJJRHsnMiBsb3cnfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VDYXRlZ29yeU5hbWUySUR7JzUgdmVyeSBoaWdoJ30sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDYxIC0gU2VhcmNoIGZvciBpbXBhY3RzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgaW1wYWN0cycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBJbXBhY3RJRHMgPT4gWwogICAgICAgICAgICAgICAgJENoYW5nZUltcGFjdE5hbWUySUR7JzEgdmVyeSBsb3cnfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VJbXBhY3ROYW1lMklEeycyIGxvdyd9LAogICAgICAgICAgICAgICAgJENoYW5nZUltcGFjdE5hbWUySUR7JzUgdmVyeSBoaWdoJ30sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDYyIC0gU2VhcmNoIGZvciBwcmlvcml0eSBpZHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBwcmlvcml0eSBpZHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgUHJpb3JpdHlJRHMgPT4gWwogICAgICAgICAgICAgICAgJENoYW5nZVByaW9yaXR5TmFtZTJJRHsnMSB2ZXJ5IGxvdyd9LAogICAgICAgICAgICAgICAgJENoYW5nZVByaW9yaXR5TmFtZTJJRHsnMiBsb3cnfSwKICAgICAgICAgICAgICAgICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzUgdmVyeSBoaWdoJ30sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDYzIC0gU2VhcmNoIGZvciBDSVBzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgYWxsIENJUCBjb2x1bW5zJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENhdGVnb3JpZXMgPT4gWyAnMSB2ZXJ5IGxvdycsICcyIGxvdycgXSwKICAgICAgICAgICAgSW1wYWN0cyAgICA9PiBbJzMgbm9ybWFsJ10sCiAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gWyczIG5vcm1hbCddLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA2NCAtIFNlYXJjaCBmb3IgQ0lQIGlkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFsbCBDSVAgaWQgY29sdW1ucycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDYXRlZ29yeUlEcyA9PiBbCiAgICAgICAgICAgICAgICAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeycxIHZlcnkgbG93J30sCiAgICAgICAgICAgICAgICAkQ2hhbmdlQ2F0ZWdvcnlOYW1lMklEeycyIGxvdyd9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBJbXBhY3RJRHMgPT4gWwogICAgICAgICAgICAgICAgJENoYW5nZUltcGFjdE5hbWUySUR7JzMgbm9ybWFsJ30sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFByaW9yaXR5SURzID0+IFsKICAgICAgICAgICAgICAgICRDaGFuZ2VQcmlvcml0eU5hbWUySUR7JzMgbm9ybWFsJ30sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDY1IC0gU2VhcmNoIGZvciBpbnZhbGlkIENJUHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbnZhbGlkIENJUHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2F0ZWdvcmllcyAgPT4gWydGb29CYXInXSwKICAgICAgICAgICAgSW1wYWN0cyAgICAgPT4gWydGb29CYXInXSwKICAgICAgICAgICAgUHJpb3JpdGllcyAgPT4gWydGb29CYXInXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QlQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciA2NiAtIFNlYXJjaCBmb3IgaW52YWxpZCBDYXRlZ29yaWVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgaW52YWxpZCBDYXRlZ29yaWVzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENhdGVnb3JpZXMgID0+IFsnRm9vQmFyJ10sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdUZXN0JUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgNjcgLSBTZWFyY2ggZm9yIGludmFsaWQgQ0lQcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGludmFsaWQgSW1wYWN0cycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBJbXBhY3RzICAgICA9PiBbJ0Zvb0JhciddLAogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnVGVzdCVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDY4IC0gU2VhcmNoIGZvciBpbnZhbGlkIFByaW9yaXRpZXMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBpbnZhbGlkIENJUHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgUHJpb3JpdGllcyAgPT4gWydGb29CYXInXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ1Rlc3QlQ0lQJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciA2OSAtIFNlYXJjaCBmb3IgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlRnJlZUtleTEgID0+ICdBQUEnLAogICAgICAgICAgICBDaGFuZ2VGcmVlVGV4dDEgPT4gJ0JCQicsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNzAgLSBTZWFyY2ggZm9yIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjaGFuZ2UgZnJlZXRleHQgZmllbGRzJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUZyZWVLZXkxICA9PiAnQUFBJywKICAgICAgICAgICAgQ2hhbmdlRnJlZVRleHQxID0+ICdCQkInLAogICAgICAgICAgICBDaGFuZ2VGcmVlS2V5MyAgPT4gJ0VFRScsCiAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0NCA9PiAnSEhIJywKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA3MSAtIFNlYXJjaCBmb3IgY2hhbmdlIGZyZWV0ZXh0IGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSBmcmVldGV4dCBmaWVsZHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgID0+ICdUZXN0IGFkZCBjaGFuZ2Ugd2l0aCBmcmVldGV4dCBmaWVsZHMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgQ2hhbmdlRnJlZUtleTEgID0+ICdBQUEnLAogICAgICAgICAgICBDaGFuZ2VGcmVlVGV4dDEgPT4gJ0JCQicsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNzIgLSBTZWFyY2ggZm9yIGNoYW5nZSBhbmQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSBhbmQgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcycsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VGcmVlS2V5MSAgICAgPT4gJ0FBQScsCiAgICAgICAgICAgIENoYW5nZUZyZWVUZXh0MSAgICA9PiAnQkJCJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTEgID0+ICdXLUFBQScsCiAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MSA9PiAnVy1CQkInLAogICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MiAgPT4gJ1ctQ0NDJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKKTsKCiMgZ2V0IGEgc2FtcGxlIGNoYW5nZSB3ZSBjcmVhdGVkIGFib3ZlIGZvciBzb21lICdzcGVjaWFsJyB0ZXN0IGNhc2VzCm15ICgkU2VhcmNoVGVzdENoYW5nZUlEKSA9IEB7ICRMYWJlbDJDaGFuZ2VJRHN7U2VhcmNoVGVzdH0gfTsKbXkgJE5yT2ZHZW5lcmFsU2VhcmNoVGVzdHMgPSBzY2FsYXIgQENoYW5nZVNlYXJjaFRlc3RzOwoKaWYgKCRTZWFyY2hUZXN0Q2hhbmdlSUQpIHsKICAgIG15ICRTZWFyY2hUZXN0Q2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJFNlYXJjaFRlc3RDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBDaGFuZ2VTZWFyY2hUZXN0cywgKAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlcicsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgICAgICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e1BsYW5uZWRTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgICAgICAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntQbGFubmVkU3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgICAgIENvdW50ICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTnVtYmVyLCBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgICAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZEVuZFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyICAgICAgICAgICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUsIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyICAgICAgICAgICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e1BsYW5uZWRFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgICAgIENvdW50ICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTnVtYmVyLCBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSwgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUnCiAgICAgICAgICAgICAgICAuICcsIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUsIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgICAgICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgICA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e1BsYW5uZWRFbmRUaW1lfSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntQbGFubmVkRW5kVGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57UGxhbm5lZFN0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciB3aXRoIHdpbGRjYXJkJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyID0+IHN1YnN0ciggJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LCAwLCAxMCApIC4gJyUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgQ2hhbmdlVGl0bGUgd2l0aCB3aWxkY2FyZCcsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiBzdWJzdHIoICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwgMCwgMTAgKSAuICclJywKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICA9PiBzdWJzdHIoICRTZWFyY2hUZXN0Q2hhbmdlLT57VGl0bGV9LCAgICAgICAgMCwgMSApIC4gJyUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgdHdvIGNyZWF0b3JzJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ID0+IFsgJFNlYXJjaFRlc3RDaGFuZ2UtPntDcmVhdGVCeX0sICRTZWFyY2hUZXN0Q2hhbmdlLT57Q3JlYXRlQnl9ICsgMSBdLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIgKHdpdGggd2lsZGNhcmQpLCB0d28gY3JlYXRvcnMnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gc3Vic3RyKCAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sIDAsIDEwICkgLiAnJScsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiBbICRTZWFyY2hUZXN0Q2hhbmdlLT57Q3JlYXRlQnl9LCAkU2VhcmNoVGVzdENoYW5nZS0+e0NyZWF0ZUJ5fSArIDEgXSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VUaXRsZSwgQ2hhbmdlTnVtYmVyLCB0d28gY3JlYXRvcnMnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgPT4gWyAkU2VhcmNoVGVzdENoYW5nZS0+e0NyZWF0ZUJ5fSwgJFNlYXJjaFRlc3RDaGFuZ2UtPntDcmVhdGVCeX0gKyAxIF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiBzdWJzdHIoICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlVGl0bGV9LCAwLCAxICkgLiAnJScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgICAgICBDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgICAgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0FjdHVhbEVuZFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLAogICAgICAgICAgICAgICAgQ291bnQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VOdW1iZXIgICAgICAgICAgID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57Q2hhbmdlTnVtYmVyfSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntBY3R1YWxFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUsIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57QWN0dWFsRW5kVGltZX0sCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57QWN0dWFsRW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlTnVtYmVyLCBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUnLAogICAgICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgPT4gJFNlYXJjaFRlc3RDaGFuZ2UtPntBY3R1YWxTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZU51bWJlciwgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57QWN0dWFsU3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2VOdW1iZXIsIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSwgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICRTZWFyY2hUZXN0Q2hhbmdlLT57QWN0dWFsU3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAkU2VhcmNoVGVzdENoYW5nZS0+e0FjdHVhbFN0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICROck9mQWxsU2VhcmNoVGVzdHMgPSBzY2FsYXIgQENoYW5nZVNlYXJjaFRlc3RzOwoKICAgIGZvciBteSAkVGVzdE51bWJlciAoICggJE5yT2ZHZW5lcmFsU2VhcmNoVGVzdHMgKyAxICkgLi4gJE5yT2ZBbGxTZWFyY2hUZXN0cyApIHsKICAgICAgICAkQ2hhbmdlSURGb3JTZWFyY2hUZXN0eyRUZXN0TnVtYmVyfS0+eyAkU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZUlEfSB9ID0gMTsKICAgIH0KfQoKbXkgJFNlYXJjaFRlc3RDb3VudCA9IDE7CgpTRUFSQ0hURVNUOgpmb3IgbXkgJFRlc3QgKEBDaGFuZ2VTZWFyY2hUZXN0cykgewoKICAgICMgY2hlY2sgU2VhcmNoRGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U2VhcmNoRGF0YX0gfHwgcmVmKCAkVGVzdC0+e1NlYXJjaERhdGF9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTZWFyY2hEYXRhIGZvdW5kIGZvciB0aGlzIHRlc3QuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFNFQVJDSFRFU1Q7CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiQ2hhbmdlU2VhcmNoKCkgd2l0aCBwYXJhbXM6ICRUZXN0LT57RGVzY3JpcHRpb259IChTZWFyY2hUZXN0Q2FzZTogJFNlYXJjaFRlc3RDb3VudCkiLAogICAgKTsKCiAgICAjIGdldCBhIHJlZiB0byBhbiBhcnJheSBvZiBmb3VuZCBpZHMKICAgIG15ICRDaGFuZ2VJRHMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAleyAkVGVzdC0+e1NlYXJjaERhdGF9IH0sCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGEgY291bnQgb2YgZm91bmQgaWRzCiAgICBteSAkQ291bnRDaGFuZ2VJRHMgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICAleyAkVGVzdC0+e1NlYXJjaERhdGF9IH0sCiAgICAgICAgUmVzdWx0ID0+ICdDT1VOVCcsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTZWFyY2hGYWlsc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkKCRDaGFuZ2VJRHMpLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSBpcyBleHBlY3RlZCB0byBmYWlsIChSZXN1bHQgPT4gJ0FSUkFZJykiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkKCRDb3VudENoYW5nZUlEcyksCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZVNlYXJjaCgpIGlzIGV4cGVjdGVkIHRvIGZhaWwgKFJlc3VsdCA9PiAnQ09VTlQnKSIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBkZWZpbmVkKCRDaGFuZ2VJRHMpICYmIHJlZiAkQ2hhbmdlSURzIGVxICdBUlJBWScsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIGFycmF5IHJlZmVyZW5jZSBmb3IgQ2hhbmdlSURzLiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCgkQ291bnRDaGFuZ2VJRHMpICYmIHJlZiAkQ291bnRDaGFuZ2VJRHMgZXEgJycsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIHNjYWxhciBmb3IgQ291bnRDaGFuZ2VJRHMuIiwKICAgICAgICApOwogICAgfQoKICAgICRDaGFuZ2VJRHMgfHw9IFtdOwogICAgJENvdW50Q2hhbmdlSURzIHx8PSAwOwoKICAgIGlmICggJFRlc3QtPntSZXN1bHREYXRhfS0+e1Rlc3RDb3VudH0gKSB7CgogICAgICAgICMgZ2V0IG51bWJlciBvZiBjaGFuZ2UgaWRzIENoYW5nZVNlYXJjaCBzaG91bGQgcmV0dXJuCiAgICAgICAgbXkgJEV4cGVjdGVkQ291bnQgPSBzY2FsYXIga2V5cyAleyAkQ2hhbmdlSURGb3JTZWFyY2hUZXN0eyRTZWFyY2hUZXN0Q291bnR9IH07CgogICAgICAgICMgZ2V0IGRlZmluZWQgZXhwZWN0ZWQgcmVzdWx0IGNvdW50IChkZWZpbmVkIGluIHNlYXJjaCB0ZXN0IGNhc2UhKQogICAgICAgIGlmICggZXhpc3RzICRUZXN0LT57UmVzdWx0RGF0YX0tPntDb3VudH0gKSB7CiAgICAgICAgICAgICRFeHBlY3RlZENvdW50ID0gJFRlc3QtPntSZXN1bHREYXRhfS0+e0NvdW50fQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgbnVtYmVyIG9mIElEcyBpbiB0aGUgcmV0dXJuZWQgYXJyYXlyZWYKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRDaGFuZ2VJRHN9LAogICAgICAgICAgICAkRXhwZWN0ZWRDb3VudCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gTnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMgKFJlc3VsdCA9PiAnQVJSQVknKS4iLAogICAgICAgICk7CgogICAgICAgICMgV2hlbiBhICdMaW1pdCcgaGFzIGJlZW4gcGFzc2VkLCB0aGVuIHRoZSByZXR1cm5lZCBjb3VudCBub3QgbmVjZXNzYXJpbHkgbWF0Y2hlcwogICAgICAgICMgdGhlIG51bWJlciBvZiBJRHMgaW4gdGhlIHJldHVybmVkIGFycmF5LiBJbiB0aGF0IGNhc2UgdGVzdGluZyBpcyBmdXRpbGUuCiAgICAgICAgaWYgKCAhJFRlc3QtPntTZWFyY2hEYXRhfS0+e0xpbWl0fSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENvdW50Q2hhbmdlSURzLAogICAgICAgICAgICAgICAgJEV4cGVjdGVkQ291bnQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBOdW1iZXIgb2YgZm91bmQgY2hhbmdlcyAoUmVzdWx0ID0+ICdDT1VOVCcpLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFRlc3QtPntSZXN1bHREYXRhfS0+e1Rlc3RFeGlzdGVuY2V9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIGFsbCBpZHMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgc2VhcmNodGVzdCBhcmUgcmV0dXJuZWQKICAgICAgICBteSBAQ2hhbmdlSURzID0ga2V5cyAleyAkQ2hhbmdlSURGb3JTZWFyY2hUZXN0eyRTZWFyY2hUZXN0Q291bnR9IH07CiAgICAgICAgbXkgJVJldHVybmVkQ2hhbmdlSUQgPSBtYXAgeyAkXyA9PiAxIH0gQHskQ2hhbmdlSURzfTsKICAgICAgICBmb3IgbXkgJENoYW5nZUlEIChAQ2hhbmdlSURzKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFJldHVybmVkQ2hhbmdlSUR7JENoYW5nZUlEfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUlEICRDaGFuZ2VJRCBmb3VuZCBpbiByZXR1cm5lZCBsaXN0LiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKICAgICRTZWFyY2hUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBjaGFuZ2Ugc2VhcmNoIHRlc3RzIGZvciAnT3JkZXJCeScgc2VhcmNoZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGhyZWUgY2hhbmdlIGlkcy4gVGhlbiBnZXQgdGhlIGRhdGEuIFRoYXQgaXMgbmVlZGVkIGZvciBzb3J0aW5nCm15IEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZUlEcyA9IEB7ICRMYWJlbDJDaGFuZ2VJRHN7T3JkZXJCeVNlYXJjaFRlc3R9IH07Cm15IEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZXM7Cgpmb3IgbXkgJENoYW5nZUlERm9yT3JkZXJCeVRlc3RzIChAT3JkZXJCeVNlYXJjaFRlc3RDaGFuZ2VJRHMpIHsKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlERm9yT3JkZXJCeVRlc3RzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY29udmVydCB0aW1lIHN0cmluZyB0byBudW1iZXJzIC0gdGhhdCdzIGJldHRlciBmb3IgdGhlIGNvbXBhcmlzb25zCiAgICBmb3IgbXkgJFRpbWVDb2x1bW4gKHF3KENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkpIHsKICAgICAgICAkQ2hhbmdlRGF0YS0+eyRUaW1lQ29sdW1ufSA9fiBzeyBcRCB9e314bXNnOwogICAgfQoKICAgIHB1c2ggQE9yZGVyQnlTZWFyY2hUZXN0Q2hhbmdlcywgJENoYW5nZURhdGE7Cn0KCm15IEBPcmRlckJ5Q29sdW1ucyA9IHF3KAogICAgQ2hhbmdlSUQKICAgIENoYW5nZU51bWJlcgogICAgQ2hhbmdlVGl0bGUKICAgIENoYW5nZVN0YXRlSUQKICAgIENoYW5nZU1hbmFnZXJJRAogICAgQ2hhbmdlQnVpbGRlcklECiAgICBDcmVhdGVCeQogICAgQ2hhbmdlQnkKICAgIENyZWF0ZVRpbWUKICAgIENoYW5nZVRpbWUKICAgIFBsYW5uZWRTdGFydFRpbWUKICAgIFBsYW5uZWRFbmRUaW1lCiAgICBBY3R1YWxTdGFydFRpbWUKICAgIEFjdHVhbEVuZFRpbWUKKTsKCmZvciBteSAkT3JkZXJCeUNvbHVtbiAoQE9yZGVyQnlDb2x1bW5zKSB7CgogICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICBteSBAU29ydGVkQ2hhbmdlczsKICAgIGlmICggJE9yZGVyQnlDb2x1bW4gPX4gbXsgXEEgKCBDaGFuZ2VUaXRsZSB8IC4rIFRpbWUgKSBceiB9eG1zICkgewogICAgICAgIEBTb3J0ZWRDaGFuZ2VzID0gc29ydCB7CiAgICAgICAgICAgICRhLT57JE9yZGVyQnlDb2x1bW59IGNtcCAkYi0+eyRPcmRlckJ5Q29sdW1ufQogICAgICAgICAgICAgICAgfHwgJGItPntDaGFuZ2VJRH0gPD0+ICRhLT57Q2hhbmdlSUR9CiAgICAgICAgfSBAT3JkZXJCeVNlYXJjaFRlc3RDaGFuZ2VzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFNvcnRlZENoYW5nZXMgPSBzb3J0IHsKICAgICAgICAgICAgJGEtPnskT3JkZXJCeUNvbHVtbn0gPD0+ICRiLT57JE9yZGVyQnlDb2x1bW59CiAgICAgICAgICAgICAgICB8fCAkYi0+e0NoYW5nZUlEfSA8PT4gJGEtPntDaGFuZ2VJRH0KICAgICAgICB9IEBPcmRlckJ5U2VhcmNoVGVzdENoYW5nZXM7CiAgICB9CiAgICBteSBAU29ydGVkSURzID0gbWFwIHsgJF8tPntDaGFuZ2VJRH0gfSBAU29ydGVkQ2hhbmdlczsKCiAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgIG15ICRSZWZlcmVuY2VMaXN0ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAU29ydGVkSURzICk7CgogICAgbXkgJFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJ09yZGVyQnlDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyRPcmRlckJ5Q29sdW1uXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsnVXAnXSwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkKICAgIG15ICRTZWFyY2hMaXN0ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdCk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChVcCkuIgogICAgKTsKCiAgICBteSBAU29ydGVkQ2hhbmdlc0Rvd247CiAgICBpZiAoICRPcmRlckJ5Q29sdW1uID1+IG17IFxBICggQ2hhbmdlVGl0bGUgfCAuKyBUaW1lICkgXHogfXhtcyApIHsKICAgICAgICBAU29ydGVkQ2hhbmdlc0Rvd24KICAgICAgICAgICAgPSBzb3J0IHsKICAgICAgICAgICAgJGItPnskT3JkZXJCeUNvbHVtbn0gY21wICRhLT57JE9yZGVyQnlDb2x1bW59CiAgICAgICAgICAgICAgICB8fCAkYi0+e0NoYW5nZUlEfSA8PT4gJGEtPntDaGFuZ2VJRH0KICAgICAgICAgICAgfSBAT3JkZXJCeVNlYXJjaFRlc3RDaGFuZ2VzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFNvcnRlZENoYW5nZXNEb3duCiAgICAgICAgICAgID0gc29ydCB7CiAgICAgICAgICAgICRiLT57JE9yZGVyQnlDb2x1bW59IDw9PiAkYS0+eyRPcmRlckJ5Q29sdW1ufQogICAgICAgICAgICAgICAgfHwgJGItPntDaGFuZ2VJRH0gPD0+ICRhLT57Q2hhbmdlSUR9CiAgICAgICAgICAgIH0gQE9yZGVyQnlTZWFyY2hUZXN0Q2hhbmdlczsKICAgIH0KICAgIG15IEBTb3J0ZWRJRHNEb3duID0gbWFwIHsgJF8tPntDaGFuZ2VJRH0gfSBAU29ydGVkQ2hhbmdlc0Rvd247CgogICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICBteSAkUmVmZXJlbmNlTGlzdERvd24gPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHNEb3duICk7CgogICAgbXkgJFNlYXJjaFJlc3VsdERvd24gPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgPT4gWyRPcmRlckJ5Q29sdW1uXSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZUdldCgpCiAgICBteSAkU2VhcmNoTGlzdERvd24gPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0RG93bik7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0RG93biwKICAgICAgICAkUmVmZXJlbmNlTGlzdERvd24sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICI6IENoYW5nZVNlYXJjaCgpIE9yZGVyQnkgJE9yZGVyQnlDb2x1bW4gKERvd24pLiIKICAgICk7CgogICAgIyBjaGVjayBpZiBJVFNNQ2hhbmdlLnBtIGhhbmRsZXMgbm9uLWV4aXN0ZW50IE9yZGVyQnlEaXJlY3Rpb24gY3JpdGVyaWEgY29ycmVjdAogICAgbXkgJFNlYXJjaFJlc3VsdFNpZGV3YXlzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJE9yZGVyQnlDb2x1bW5dLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydTaWRld2F5cyddLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hSZXN1bHRTaWRld2F5cywKICAgICAgICB1bmRlZiwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogQ2hhbmdlU2VhcmNoKCkgT3JkZXJCeSAkT3JkZXJCeUNvbHVtbiAoU2lkZXdheXMpLiIKICAgICk7Cn0KCiMgY3JlYXRlIGFuIGV4dHJhIGJsb2NrLCBpbiBvcmRlciB0byBsaW1pdCBzY29wZSBvZiBsZXhpY2Fscwp7CgogICAgIyBjaGVjayBmb3IgJ09yZGVyQnknIHdpdGggbm9uLWV4aXN0ZW50IGNvbHVtbgogICAgbXkgJFNlYXJjaFJlc3VsdEZvb0JhckNvbHVtbiA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlID0+ICdPcmRlckJ5Q2hhbmdlIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICA9PiBbJ0Zvb0JhciddLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkU2VhcmNoUmVzdWx0Rm9vQmFyQ29sdW1uLAogICAgICAgIHVuZGVmLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5IEZvb0JhciAoRG93bikuIgogICAgKTsKCiAgICAjIGNoZWNrIGZvciAnT3JkZXJCeScgd2l0aCBub24tZXhpc3RlbnQgY29sdW1uCiAgICBteSAkU2VhcmNoUmVzdWx0Rm9vQmFyQ29sdW1uRGlyZWN0aW9uID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJ0Zvb0JhciddLAogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWydGb29CYXInXSwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkU2VhcmNoUmVzdWx0Rm9vQmFyQ29sdW1uRGlyZWN0aW9uLAogICAgICAgIHVuZGVmLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5IEZvb0JhciAoRm9vQmFyKS4iCiAgICApOwoKICAgICMgY2hlY2sgZm9yICdPcmRlckJ5JyB3aXRoIG5vbi1leGlzdGVudCBjb2x1bW4KICAgIG15ICRTZWFyY2hSZXN1bHRGb29CYXJEb3VibGVDb2x1bW4gPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVNlYXJjaCgKICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnT3JkZXJCeUNoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgPT4gWyAnQ2hhbmdlSUQnLCAnQ2hhbmdlSUQnIF0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hSZXN1bHRGb29CYXJEb3VibGVDb2x1bW4sCiAgICAgICAgdW5kZWYsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICI6IENoYW5nZVNlYXJjaCgpIERvdWJsZWQgT3JkZXJCeSBGb29CYXIuIgogICAgKTsKfQoKIyBjaGFuZ2UgdGhlIGNyZWF0ZSB0aW1lIGZvciB0aGUgc2Vjb25kIHRlc3QgY2FzZSB3ZSBkZWZpbmVkIGFib3ZlIGZvciB0aGUgb3JkZXJieSB0ZXN0cwojIHdlIGRvIHRoaXMgdG8gaGF2ZSB0d28gY2hhbmdlcyB3aXRoIHRoZSBzYW1lIGNyZWF0ZSB0aW1lLiB0aGlzIGlzIG5lZWRlZCB0byB0ZXN0CiMgdGhlICdvcmRlcmJ5JyB3aXRoIHR3byBjb2x1bW5zClNldFRpbWVzKAogICAgQ2hhbmdlSUQgICA9PiAoIHNvcnQgQE9yZGVyQnlTZWFyY2hUZXN0Q2hhbmdlSURzIClbMV0sCiAgICBDcmVhdGVUaW1lID0+ICcyMDA5LTEwLTAxIDAxOjAwOjAwJywKKTsKCm15IEBDaGFuZ2VzRm9yU2Vjb25kT3JkZXJCeVRlc3RzOwpmb3IgbXkgJENoYW5nZUlERm9yU2Vjb25kT3JkZXJCeVRlc3RzIChAT3JkZXJCeVNlYXJjaFRlc3RDaGFuZ2VJRHMpIHsKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlERm9yU2Vjb25kT3JkZXJCeVRlc3RzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY29udmVydCB0aW1lIHN0cmluZyB0byBudW1iZXJzIC0gdGhhdCdzIGJldHRlciBmb3IgdGhlIGNvbXBhcmlzb25zCiAgICBmb3IgbXkgJFRpbWVDb2x1bW4gKHF3KENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkpIHsKICAgICAgICAkQ2hhbmdlRGF0YS0+eyRUaW1lQ29sdW1ufSA9fiBzeyBcRCB9e314bXNnOwogICAgfQoKICAgIHB1c2ggQENoYW5nZXNGb3JTZWNvbmRPcmRlckJ5VGVzdHMsICRDaGFuZ2VEYXRhOwp9CgojIGNyZWF0ZSBhbiBleHRyYSBibG9jayBhcyB3ZSB1c2UgImxvY2FsIgp7CiAgICBteSBAU29ydGVkQ2hhbmdlcyA9IHNvcnQgewogICAgICAgICRhLT57Q3JlYXRlVGltZX0gPD0+ICRiLT57Q3JlYXRlVGltZX0gICAgICAgIyBjcmVhdGV0aW1lIGlzIHNvcnRlZCBhc2NlbmRpbmcKICAgICAgICAgICAgfHwgJGEtPntDaGFuZ2VJRH0gPD0+ICRiLT57Q2hhbmdlSUR9ICAgICMgY2hhbmdlaWQgaXMgc29ydGVkIGFzY2VuZGluZwogICAgfSBAQ2hhbmdlc0ZvclNlY29uZE9yZGVyQnlUZXN0czsKICAgIG15IEBTb3J0ZWRJRHMgPSBtYXAgeyAkXy0+e0NoYW5nZUlEfSB9IEBTb3J0ZWRDaGFuZ2VzOwoKICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICA9IDE7CgogICAgbXkgJFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJ09yZGVyQnlDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyAnQ3JlYXRlVGltZScsICdDaGFuZ2VJRCcgXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ1VwJywgJ1VwJyBdLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKQogICAgbXkgJFNlYXJjaExpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0KTsKCiAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgIG15ICRSZWZlcmVuY2VMaXN0ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAU29ydGVkSURzICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5IENyZWF0ZVRpbWUgKERvd24pIGFuZCBDaGFuZ2VJRCAoVXApLiIKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBhZHZhbmNlZCBzZWFyY2ggYnkgdGVzdHMgZm9yIHRpbWVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJFRTVENoYW5nZVRpdGxlID0gJ1RpbWVTZWFyY2hUZXN0IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZTsKbXkgQFRTVENoYW5nZUlEczsKbXkgQFRpbWVTZWFyY2hUZXN0cyA9ICgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDEtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAxLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDEtMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAxLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDItMjcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMi0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTAyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcxOTA5LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzE5MDktMDQtMDcgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMTkwOS0wMi0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICcxOTA5LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBwbGFubmVkIHN0YXJ0IHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDAsIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMDEtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICAjIHRlc3QgZm9yIHBsYW5uZWQgZW5kIHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAxLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlIGFuZCBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMi0yNyAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMiwgMywgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDUtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMjUgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlIGFuZCBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBhY3R1YWwgc3RhcnQgdGltZQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgYW5kIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlIGFuZCBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMiwgMywgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0xMiAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMCwgMSwgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyB0ZXN0IGZvciBhY3R1YWwgZW5kIHRpbWUKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgYW5kIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgICAgICAgICAgICA9PiAkVFNUQ2hhbmdlVGl0bGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDAsIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgICAgID0+ICRUU1RDaGFuZ2VUaXRsZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgICAgICAgICAgPT4gJFRTVENoYW5nZVRpdGxlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKKTsKCm15ICRUU1RDb3VudGVyID0gMTsKbXkgQFRTVFdvcmtPcmRlcklEczsKVFNURVNUOgpmb3IgbXkgJFRlc3QgKEBUaW1lU2VhcmNoVGVzdHMpIHsKICAgIG15ICRTb3VyY2VEYXRhICAgID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKICAgIG15ICRSZWZlcmVuY2VEYXRhID0gJFRlc3QtPntSZWZlcmVuY2VEYXRhfTsKCiAgICBteSAkQ2hhbmdlSUQ7CiAgICBteSAkV29ya09yZGVySUQ7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkVGVzdC0+e0Rlc2NyaXB0aW9ufSAoVFNUZXN0IGNhc2U6ICRUU1RDb3VudGVyKSIsCiAgICApOwoKICAgIGlmICggJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9ICkgewogICAgICAgICRDaGFuZ2VJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQWRkKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NoYW5nZUFkZH0gfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGFuZ2VBZGQiLAogICAgICAgICk7CgogICAgICAgIGlmICgkQ2hhbmdlSUQpIHsKICAgICAgICAgICAgJFRlc3RlZENoYW5nZUlEeyRDaGFuZ2VJRH0gPSAxOwogICAgICAgICAgICBwdXNoIEBUU1RDaGFuZ2VJRHMsICRDaGFuZ2VJRDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gKSB7CiAgICAgICAgJFdvcmtPcmRlcklEID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfSB9LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gV29ya09yZGVyQWRkIiwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBUU1RXb3JrT3JkZXJJRHMsICRXb3JrT3JkZXJJRDsKICAgIH0KCiAgICBteSAkU2VhcmNoUmVzdWx0OwogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gKSB7CiAgICAgICAgJFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdCAmJiByZWYgJFNlYXJjaFJlc3VsdCBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIExpc3QgaXMgYW4gYXJyYXkgcmVmZXJlbmNlLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUU1RFU1QgaWYgISRTZWFyY2hSZXN1bHQ7CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGZvdW5kZWQgY2hhbmdlCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskU2VhcmNoUmVzdWx0fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZURhdGF9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMiLAogICAgICAgICk7CgogICAgICAgICMgbWFwIGFycmF5IGluZGV4IHRvIENoYW5nZUlECiAgICAgICAgbXkgQFJlc3VsdENoYW5nZUlEczsKICAgICAgICBmb3IgbXkgJFJlc3VsdENoYW5nZUlEICggQHskUmVmZXJlbmNlRGF0YX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFJlc3VsdENoYW5nZUlEcywgJFRTVENoYW5nZUlEc1skUmVzdWx0Q2hhbmdlSURdOwogICAgICAgIH0KCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZVNlYXJjaCgpCiAgICAgICAgbXkgJFNlYXJjaFJlc3VsdER1bXAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggc29ydCBAeyRTZWFyY2hSZXN1bHR9ICk7CgogICAgICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgICAgIG15ICRSZWZlcmVuY2VEdW1wCiAgICAgICAgICAgID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIHNvcnQgQFJlc3VsdENoYW5nZUlEcyApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWFyY2hSZXN1bHREdW1wLAogICAgICAgICAgICAkUmVmZXJlbmNlRHVtcCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlU2VhcmNoKCk6ICIKICAgICAgICAgICAgICAgIC4gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRTb3VyY2VEYXRhLT57Q2hhbmdlU2VhcmNofSApCiAgICAgICAgICAgICAgICAuICRTZWFyY2hSZXN1bHREdW1wLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwogICAgJFRTVENvdW50ZXIrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojICdPcmRlckJ5JyB0ZXN0cyBmb3IgQ0lQIGNvbHVtbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGhyZWUgY2hhbmdlIGlkcy4gVGhlbiBnZXQgdGhlIGRhdGEuIFRoYXQgaXMgbmVlZGVkIGZvciBzb3J0aW5nCm15IEBPcmRlckJ5Q0lQQ2hhbmdlSURzID0gQHsgJExhYmVsMkNoYW5nZUlEc3tPcmRlckJ5Q0lQVGVzdHN9IH07Cm15IEBPcmRlckJ5Q0lQQ2hhbmdlczsKCmZvciBteSAkQ2hhbmdlSURGb3JPcmRlckJ5Q0lQVGVzdHMgKEBPcmRlckJ5Q0lQQ2hhbmdlSURzKSB7CiAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvck9yZGVyQnlDSVBUZXN0cywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICBwdXNoIEBPcmRlckJ5Q0lQQ2hhbmdlcywgJENoYW5nZURhdGE7Cn0KCm15IEBPcmRlckJ5Q0lQQ29sdW1ucyA9IHF3KAogICAgQ2F0ZWdvcnlJRAogICAgSW1wYWN0SUQKICAgIFByaW9yaXR5SUQKKTsKCmZvciBteSAkQ0lQQ29sdW1uIChAT3JkZXJCeUNJUENvbHVtbnMpIHsKCiAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgIG15IEBTb3J0ZWRDaGFuZ2VzCiAgICAgICAgPSBzb3J0IHsKICAgICAgICAkYS0+eyRDSVBDb2x1bW59IDw9PiAkYi0+eyRDSVBDb2x1bW59CiAgICAgICAgICAgIHx8ICRiLT57Q2hhbmdlSUR9IDw9PiAkYS0+e0NoYW5nZUlEfQogICAgICAgIH0gQE9yZGVyQnlDSVBDaGFuZ2VzOwoKICAgIG15IEBTb3J0ZWRJRHMgPSBtYXAgeyAkXy0+e0NoYW5nZUlEfSB9IEBTb3J0ZWRDaGFuZ2VzOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHMgKTsKCiAgICBteSAkU2VhcmNoUmVzdWx0ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgQ2hhbmdlVGl0bGUgICAgICA9PiAnJUNJUCUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFskQ0lQQ29sdW1uXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsnVXAnXSwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkKICAgIG15ICRTZWFyY2hMaXN0ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdCk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5ICRDSVBDb2x1bW4gKFVwKS4iCiAgICApOwoKICAgIG15IEBTb3J0ZWRDaGFuZ2VzRG93bgogICAgICAgID0gc29ydCB7CiAgICAgICAgJGItPnskQ0lQQ29sdW1ufSA8PT4gJGEtPnskQ0lQQ29sdW1ufQogICAgICAgICAgICB8fCAkYi0+e0NoYW5nZUlEfSA8PT4gJGEtPntDaGFuZ2VJRH0KICAgICAgICB9IEBPcmRlckJ5Q0lQQ2hhbmdlczsKCiAgICBteSBAU29ydGVkSURzRG93biA9IG1hcCB7ICRfLT57Q2hhbmdlSUR9IH0gQFNvcnRlZENoYW5nZXNEb3duOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3REb3duID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAU29ydGVkSURzRG93biApOwoKICAgIG15ICRTZWFyY2hSZXN1bHREb3duID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VTZWFyY2goCiAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJyVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgPT4gWyRDSVBDb2x1bW5dLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkKICAgIG15ICRTZWFyY2hMaXN0RG93biA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHREb3duKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlYXJjaExpc3REb3duLAogICAgICAgICRSZWZlcmVuY2VMaXN0RG93biwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogQ2hhbmdlU2VhcmNoKCkgT3JkZXJCeSAkQ0lQQ29sdW1uIChEb3duKS4iCiAgICApOwoKICAgICMgY2hlY2sgaWYgSVRTTUNoYW5nZS5wbSBoYW5kbGVzIG5vbi1leGlzdGVudCBPcmRlckJ5RGlyZWN0aW9uIGNyaXRlcmlhIGNvcnJlY3QKICAgIG15ICRTZWFyY2hSZXN1bHRTaWRld2F5cyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJyVDSVAlJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgT3JkZXJCeSAgICAgICAgICA9PiBbJENJUENvbHVtbl0sCiAgICAgICAgT3JkZXJCeURpcmVjdGlvbiA9PiBbJ1NpZGV3YXlzJ10sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFNlYXJjaFJlc3VsdFNpZGV3YXlzLAogICAgICAgIHVuZGVmLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VTZWFyY2goKSBPcmRlckJ5ICRDSVBDb2x1bW4gKFNpZGV3YXlzKS4iCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgYWR2YW5jZWQgc2VhcmNoIGJ5IHRlc3RzIGZvciB3b3Jrb3JkZXIgc3RyaW5ncyBhbmQgYWdlbnQgaWQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwpteSBAV09TdHJpbmdBbmRBZ2VudFNlYXJjaFRlc3RzID0gKAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgYW5kIHdpdGggc2V0IHN0cmluZyBmaWVsZHMuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1N0cmluZyBUZXN0IDEgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgICA9PiAnU3RyaW5nIFRlc3QgMSAtIEluc3RydWN0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICAgID0+ICdTdHJpbmcgVGVzdCAxIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdTdHJpbmcgVGVzdCAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWzBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9uLWV4aXN0aW5nIFdvcmtPcmRlclRpdGxlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ05PTkVYSVNURU5UIFN0cmluZyBUZXN0IDEgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFdvcmtPcmRlciBJbnN0cnVjdGlvbicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckluc3RydWN0aW9uID0+ICdTdHJpbmcgVGVzdCAxIC0gSW5zdHJ1Y3Rpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWzBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9uLWV4aXN0aW5nIFdvcmtPcmRlciBJbnN0cnVjdGlvbicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckluc3RydWN0aW9uID0+ICdOT05FWElTVEVOVCBTdHJpbmcgVGVzdCAxIC0gSW5zdHJ1Y3Rpb24gLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFdvcmtPcmRlciBSZXBvcnQnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyUmVwb3J0ID0+ICdTdHJpbmcgVGVzdCAxIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFswXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vbi1leGlzdGluZyBXb3JrT3JkZXIgUmVwb3J0JywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclJlcG9ydCA9PiAnTk9ORVhJU1RFTlQgU3RyaW5nIFRlc3QgMSAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGV4aXN0aW5nIFdvcmtPcmRlckFnZW50SUQnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiBbICRVc2VySURzWzFdIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFswXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGV4aXN0aW5nIGFuZCBub24tZXhpc3RpbmcgV29ya09yZGVyQWdlbnRJRCcsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiBbIEBVc2VySURzWyAwLCAxIF0gXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWzBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9uLWV4aXN0aW5nIFdvcmtPcmRlckFnZW50SUQnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJBZ2VudElEcyA9PiBbICRVc2VySURzWzBdIF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKKTsKCm15ICRXT1NUQ291bnRlciA9IDE7Cm15IEBXT1NUQ2hhbmdlSURzOyAgICAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgdGVzdCBjaGFuZ2UgaWRzCm15IEBXT1NUV29ya09yZGVySURzOyAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgdGVzdCB3b3Jrb3JkZXIgaWRzCldPU1RFU1Q6CmZvciBteSAkVGVzdCAoQFdPU3RyaW5nQW5kQWdlbnRTZWFyY2hUZXN0cykgewogICAgbXkgJFNvdXJjZURhdGEgICAgPSAkVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9OwoKICAgIG15ICRDaGFuZ2VJRDsKICAgIG15ICRXb3JrT3JkZXJJRDsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRUZXN0LT57RGVzY3JpcHRpb259IChXT1NUZXN0IGNhc2U6ICRXT1NUQ291bnRlcikiLAogICAgKTsKCiAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSApIHsKICAgICAgICAkQ2hhbmdlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQWRkIiwKICAgICAgICApOwoKICAgICAgICBpZiAoJENoYW5nZUlEKSB7CiAgICAgICAgICAgICRUZXN0ZWRDaGFuZ2VJRHskQ2hhbmdlSUR9ID0gMTsKICAgICAgICAgICAgcHVzaCBAV09TVENoYW5nZUlEcywgJENoYW5nZUlEOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfSApIHsKICAgICAgICAkV29ya09yZGVySUQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9IH0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBXb3JrT3JkZXJBZGQiLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFdPU1RXb3JrT3JkZXJJRHMsICRXb3JrT3JkZXJJRDsKICAgIH0KCiAgICBteSAkU2VhcmNoUmVzdWx0OwogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gKSB7CiAgICAgICAgJFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdCAmJiByZWYgJFNlYXJjaFJlc3VsdCBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIExpc3QgaXMgYW4gYXJyYXkgcmVmZXJlbmNlLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBXT1NURVNUIGlmICEkU2VhcmNoUmVzdWx0OwoKICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBmb3VuZCBjaGFuZ2VzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskU2VhcmNoUmVzdWx0fSwKICAgICAgICAgICAgc2NhbGFyIEB7JFJlZmVyZW5jZURhdGF9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIGNvcnJlY3QgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMiLAogICAgICAgICk7CgogICAgICAgICMgbWFwIGFycmF5IGluZGV4IHRvIENoYW5nZUlECiAgICAgICAgbXkgQFJlc3VsdENoYW5nZUlEczsKICAgICAgICBmb3IgbXkgJFJlc3VsdENoYW5nZUlEICggQHskUmVmZXJlbmNlRGF0YX0gKSB7CiAgICAgICAgICAgIHB1c2ggQFJlc3VsdENoYW5nZUlEcywgJFdPU1RDaGFuZ2VJRHNbJFJlc3VsdENoYW5nZUlEXTsKICAgICAgICB9CgogICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VTZWFyY2goKQogICAgICAgIG15ICRTZWFyY2hSZXN1bHREdW1wID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoIHNvcnQgQHskU2VhcmNoUmVzdWx0fSApOwoKICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICBteSAkUmVmZXJlbmNlRHVtcAogICAgICAgICAgICA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCBzb3J0IEBSZXN1bHRDaGFuZ2VJRHMgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VhcmNoUmVzdWx0RHVtcCwKICAgICAgICAgICAgJFJlZmVyZW5jZUR1bXAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZVNlYXJjaCgpOiAiCiAgICAgICAgICAgICAgICAuIERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gKQogICAgICAgICAgICAgICAgLiAkU2VhcmNoUmVzdWx0RHVtcCwKICAgICAgICApOwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKICAgICRXT1NUQ291bnRlcisrOwp9CgojIGVhY2ggb2YgdGhlIGNoYW5nZXMgc2hvdWxkIGhhdmUgb25lIHdvcmtvcmRlcgpmb3IgbXkgJENoYW5nZUlEIChAV09TVENoYW5nZUlEcykgewogICAgbXkgJENoYW5nZURhdGEgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENoYW5nZURhdGEtPntXb3JrT3JkZXJDb3VudH0sCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGFuZ2VHZXQoKTogb25lIHdvcmtvcmRlciB3YXMgYWRkZWQiCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgYWR2YW5jZWQgc2VhcmNoIGJ5IHRlc3RzIGZvciB3b3Jrb3JkZXIgc3RyaW5ncyBhbmQgYWdlbnQgaWQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGdldCBpdGVtIGxpc3Qgb2YgdGhlIHdvcmtvcmRlciBzdGF0ZXMgd2l0aCBzd2FwcGVkIGtleXMgYW5kIHZhbHVlcwpteSAlV29ya09yZGVyU3RhdGVJRDJOYW1lID0gJXsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgKSB8fCB7fQogICAgfTsKbXkgJVdvcmtPcmRlclN0YXRlTmFtZTJJRCA9IHJldmVyc2UgJVdvcmtPcmRlclN0YXRlSUQyTmFtZTsKCm15IEBXT1N0YXRlVGVzdHMgPSAoCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdJbnNlcnQgY2hhbmdlIHdpdGggb25lIHdvcmtvcmRlciBhbmQgd2l0aCBXb3JrT3JkZXJTdGF0ZSBzZXQuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyU3RhdGVJRCBpbiBDaGFuZ2VTZWFyY2ggLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe3JlYWR5fSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyU3RhdGVJRCBpbiBDaGFuZ2VTZWFyY2ggLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gWyAkV29ya09yZGVyU3RhdGVOYW1lMklEe3JlYWR5fSBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbMV0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5zZXJ0IGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgYW5kIHdpdGggV29ya09yZGVyU3RhdGUgc2V0LicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclN0YXRlSUQgaW4gQ2hhbmdlU2VhcmNoIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjYW5jZWxlZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIENoYW5nZVNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclN0YXRlSUQgaW4gQ2hhbmdlU2VhcmNoIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSURzID0+IFsgJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjYW5jZWxlZH0gXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWzJdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0luc2VydCBjaGFuZ2Ugd2l0aCBvbmUgd29ya29yZGVyIGFuZCB3aXRoIFdvcmtPcmRlclN0YXRlIHNldC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJTdGF0ZUlEIGluIENoYW5nZVNlYXJjaCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7Y2xvc2VkfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQ2hhbmdlU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICdXb3JrT3JkZXJTdGF0ZUlEIGluIENoYW5nZVNlYXJjaCAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgPT4gWyAncmVhZHknLCAnY2xvc2VkJyBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDEsIDMgXSwKICAgIH0sCik7CgpteSAkV09TdGF0ZVRlc3RDb3VudGVyID0gMTsKbXkgQFdPU3RhdGVUZXN0Q2hhbmdlSURzOyAgICAgICAjIHNlYXJjaCBpbiB3b3Jrb3JkZXIgdGVzdCBjaGFuZ2UgaWRzCm15IEBXT1N0YXRlVGVzdFdvcmtPcmRlcklEczsgICAgIyBzZWFyY2ggaW4gd29ya29yZGVyIHRlc3Qgd29ya29yZGVyIGlkcwpteSAlV29ya09yZGVyU3RhdGVUZXN0TWFwOwoKV09TVEFURVRFU1Q6CmZvciBteSAkV29ya09yZGVyU3RhdGVUZXN0IChAV09TdGF0ZVRlc3RzKSB7CiAgICBteSAkU291cmNlRGF0YSA9ICRXb3JrT3JkZXJTdGF0ZVRlc3QtPntTb3VyY2VEYXRhfTsKICAgIG15ICRSZWZlcmVuY2VEYXRhID0gJFdvcmtPcmRlclN0YXRlVGVzdC0+e1JlZmVyZW5jZURhdGF9IHx8IFtdOwoKICAgIG15ICRDaGFuZ2VJRDsKICAgIG15ICRXb3JrT3JkZXJJRDsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRXb3JrT3JkZXJTdGF0ZVRlc3QtPntEZXNjcmlwdGlvbn0gKFdPU3RhdGVUZXN0IGNhc2U6ICRXT1N0YXRlVGVzdENvdW50ZXIpIiwKICAgICk7CgogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZUFkZH0gKSB7CiAgICAgICAgJENoYW5nZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoYW5nZUFkZCIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRDaGFuZ2VJRCkgewogICAgICAgICAgICAkVGVzdGVkQ2hhbmdlSUR7JENoYW5nZUlEfSA9IDE7CiAgICAgICAgICAgIHB1c2ggQFdPU3RhdGVUZXN0Q2hhbmdlSURzLCAkQ2hhbmdlSUQ7CiAgICAgICAgICAgICRXb3JrT3JkZXJTdGF0ZVRlc3RNYXB7JFdPU3RhdGVUZXN0Q291bnRlcn0gPSAkQ2hhbmdlSUQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9ICkgewogICAgICAgICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQWRkKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gfSwKICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlckFkZCIsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAV09TdGF0ZVRlc3RXb3JrT3JkZXJJRHMsICRXb3JrT3JkZXJJRDsKICAgIH0KCiAgICBteSAkU2VhcmNoUmVzdWx0OwogICAgaWYgKCAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gKSB7CiAgICAgICAgJFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e0NoYW5nZVNlYXJjaH0gfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdCAmJiByZWYgJFNlYXJjaFJlc3VsdCBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtIExpc3QgaXMgYW4gYXJyYXkgcmVmZXJlbmNlLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBXT1NUQVRFVEVTVCBpZiAhJFNlYXJjaFJlc3VsdDsKCiAgICAgICAgIyBjaGVjayBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEB7JFNlYXJjaFJlc3VsdH0sCiAgICAgICAgICAgIHNjYWxhciBAeyRSZWZlcmVuY2VEYXRhfSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlU2VhcmNoKCkgLSBjb3JyZWN0IG51bWJlciBvZiBmb3VuZCBjaGFuZ2VzIiwKICAgICAgICApOwoKICAgICAgICAjIHNhdmUgcmV0dXJuZWQgaWRzIGluIGhhc2ggZm9yIGVhc2llciBjaGVja3MKICAgICAgICBteSAlUmVzdWx0SURzID0gbWFwIHsgJF8gPT4gMSB9IEB7JFNlYXJjaFJlc3VsdH07CgogICAgICAgICMgY2hlY2sgcmV0dXJuZWQgQ2hhbmdlSURzCiAgICAgICAgZm9yIG15ICRUZXN0TnIgKCBAeyRSZWZlcmVuY2VEYXRhfSApIHsKICAgICAgICAgICAgbXkgJENoYW5nZUlEID0gJFdvcmtPcmRlclN0YXRlVGVzdE1hcHskVGVzdE5yfTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUmVzdWx0SURzeyRDaGFuZ2VJRH0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2goKSAtICRDaGFuZ2VJRCAoZnJvbSB0ZXN0ICRUZXN0TnIpIGluIHJlc3VsdCBzZXQgZm91bmQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgJFRlc3RDb3VudCsrOwogICAgJFdPU3RhdGVUZXN0Q291bnRlcisrOwp9CgojIGVhY2ggb2YgdGhlIGNoYW5nZXMgc2hvdWxkIGhhdmUgb25lIHdvcmtvcmRlcgpmb3IgbXkgJENoYW5nZUlEIChAV09TdGF0ZVRlc3RDaGFuZ2VJRHMpIHsKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgICRDaGFuZ2VEYXRhLT57V29ya09yZGVyQ291bnR9LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlR2V0KCk6IG9uZSB3b3Jrb3JkZXIgd2FzIGFkZGVkIgogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3RpbmcgdGhlIG1ldGhvZCBQZXJtaXNzaW9uKCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgKCRQZXJtaXNzaW9uVGVzdENoYW5nZUlEKSA9IEB7ICRMYWJlbDJDaGFuZ2VJRHN7UGVybWlzc2lvblRlc3R9IH07Cm15IEBQZXJtaXNzaW9uVGVzdHMgPSAoCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDEKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnSW5pdGlhbGx5IG5vIHByaXYgaW4gYW55IGdyb3VwJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDAsIHJ3ID0+IDAgfSwKICAgICAgICAgICAgICAgIDEgPT4geyBybyA9PiAwLCBydyA9PiAwIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDIKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncm8gaW4gaXRzbS1jaGFuZ2UnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgR3JvdXBNZW1iZXJBZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UnfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4geyBybyA9PiAxLCBydyA9PiAwLCB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsgcm8gPT4gMSwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIDEgPT4geyBybyA9PiAwLCBydyA9PiAwLCB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiAzCiAgICB7CgogICAgICAgICMgVGhlIHR5cGUgJ3J3JyBpbXBsaWVzIGFsbCBvdGhlciB0eXBlcy4gU2VlIEtlcm5lbDo6U3lzdGVtOjpHcm91cF9HZXRUeXBlU3RyaW5nKCkKICAgICAgICAjIFRoZXJlZm9yZSBVc2VyMSBlZmZlY3RpdmVseSBoYXMgJ3JvJyBpbiAnaXRzbS1jaGFuZ2UnIGFuZAogICAgICAgICMgdGhlIENoYW5nZUFnZW50Q2hlY2sgUGVybWlzc2lvbiBtb2R1bGUgZ2l2ZXMgJ3JvJyBhY2Nlc3MuCiAgICAgICAgIyBOb3RlIHRoYXQgdGhlIENoYW5nZUFnZW50Q2hlY2sgUGVybWlzc2lvbiBtb2R1bGUgbmV2ZXIgZ2l2ZXMgJ3J3JyBhY2Nlc3MuCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3J3IGluIGl0c20tY2hhbmdlIG9ubHkgZ3JhbnRzIHJvJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMSwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDEsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gNAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdybyBpbiBpdHNtLWNoYW5nZS1tYW5hZ2VyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMSwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDEsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gNQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdydyBpbiBpdHNtLWNoYW5nZS1tYW5hZ2VyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMSwgcncgPT4gMSwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDEsIHJ3ID0+IDEsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gNgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdybyBpbiBpdHNtLWNoYW5nZS1idWlsZGVyLCBVc2VyIDAgaXMgdGhlIGJ1aWxkZXInLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgR3JvdXBNZW1iZXJBZGQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UnfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4geyBybyA9PiAwLCBydyA9PiAwLCB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLW1hbmFnZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4geyBybyA9PiAwLCBydyA9PiAwLCB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlLWJ1aWxkZXInfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4geyBybyA9PiAxLCBydyA9PiAwLCB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsgcm8gPT4gMSwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIDEgPT4geyBybyA9PiAwLCBydyA9PiAwLCB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiA3CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3J3IGluIGl0c20tY2hhbmdlLWJ1aWxkZXIsIEFnZW50IGlzIHRoZSBidWlsZGVyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMSwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDEsIHJ3ID0+IDEsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gOAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdybyBpbiBpdHNtLWNoYW5nZS1idWlsZGVyLCB1c2VyIDEgaXMgbm90IHRoZSBidWlsZGVyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMSwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gOQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdydyBpbiBpdHNtLWNoYW5nZS1idWlsZGVyLCB1c2VyIDEgaXMgbm90IHRoZSBidWlsZGVyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCik7CgpteSAkUGVybWlzc2lvblRlc3RDb3VudGVyID0gMTsKZm9yIG15ICRUZXN0IChAUGVybWlzc2lvblRlc3RzKSB7CiAgICBteSAkU291cmNlRGF0YSAgICA9ICRUZXN0LT57U291cmNlRGF0YX07CiAgICBteSAkUmVmZXJlbmNlRGF0YSA9ICRUZXN0LT57UmVmZXJlbmNlRGF0YX07CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkVGVzdC0+e0Rlc2NyaXB0aW9ufSAoUGVybWlzc2lvbiBUZXN0IGNhc2U6ICRQZXJtaXNzaW9uVGVzdENvdW50ZXIpIiwKICAgICk7CgogICAgIyBleGVjdXRlIHRoZSBzb3VyY2UgbW9kaWZpY2F0aW9ucwogICAgJFNvdXJjZURhdGEtPntHcm91cE1lbWJlckFkZH0gfHw9IFtdOwogICAgZm9yIG15ICRQYXJhbXMgKCBAeyAkU291cmNlRGF0YS0+e0dyb3VwTWVtYmVyQWRkfSB9ICkgewoKICAgICAgICAjIG1vZGlmeSB0aGUgZ3JvdXAgbWVtYmVyc2hpcAogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyQWRkKAogICAgICAgICAgICAleyRQYXJhbXN9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKCAkU3VjY2VzcywgIlBlcm1pc3Npb24gdGVzdCAkUGVybWlzc2lvblRlc3RDb3VudGVyOiBHcm91cE1lbWJlckFkZCgpIiwgKTsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSByZXN1bHQKICAgIGlmICggJFJlZmVyZW5jZURhdGEtPntQZXJtaXNzaW9uc30gKSB7CiAgICAgICAgZm9yIG15ICRVc2VySW5kZXggKCBzb3J0IGtleXMgJXsgJFJlZmVyZW5jZURhdGEtPntQZXJtaXNzaW9uc30gfSApIHsKICAgICAgICAgICAgbXkgJFByaXZzID0gJFJlZmVyZW5jZURhdGEtPntQZXJtaXNzaW9uc30tPnskVXNlckluZGV4fTsKICAgICAgICAgICAgZm9yIG15ICRUeXBlICgga2V5cyAleyRQcml2c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPntEZWJ1Z30gPSAxMDsKICAgICAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFBlcm1pc3Npb25UZXN0Q2hhbmdlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbJFVzZXJJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgQ2FjaGVkICAgPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQcml2cy0+eyRUeXBlfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gdGVzdCAkUGVybWlzc2lvblRlc3RDb3VudGVyOiBVc2VyICRVc2VySW5kZXgsIHdpdGggVXNlclVEICRVc2VySURzWyRVc2VySW5kZXhdLCBoYXMgJFR5cGUgYWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAiUGVybWlzc2lvbiB0ZXN0ICRQZXJtaXNzaW9uVGVzdENvdW50ZXI6IFVzZXIgJFVzZXJJbmRleCwgd2l0aCBVc2VySUQgJFVzZXJJRHNbJFVzZXJJbmRleF0sIGhhcyBubyAkVHlwZSBhY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewogICAgJFBlcm1pc3Npb25UZXN0Q291bnRlcisrOwogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdGluZyB0aGUgbWV0aG9kIENoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgKCRQb3NzaWJsZVN0YXRlc1Rlc3RDaGFuZ2VJRCkgPSBAeyAkTGFiZWwyQ2hhbmdlSURze1Bvc3NpYmxlU3RhdGVzVGVzdH0gfTsKCiMgV2hlbiBubyBDaGFuZ2VJRCBpcyBnaXZlbiBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIHJldHVybnMgYSBsaXN0IG9mIGFsbCBzdGF0ZXMuCm15ICRQb3NzaWJsZVN0YXRlcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCgogICAgIyAgICBDaGFuZ2VJRCA9PiAkUG9zc2libGVTdGF0ZXNUZXN0Q2hhbmdlSUQsCiAgICBVc2VySUQgPT4gMSwKKSB8fCB7fTsKCiMgZG8gdGhlIGNoZWNrcwpteSBAUG9zc2libGVTdGF0ZUlEc1JlZmVyZW5jZSA9IEBTb3J0ZWRDaGFuZ2VTdGF0ZUlEczsKZm9yIG15ICRQb3NzaWJsZVN0YXRlSUQgKEBQb3NzaWJsZVN0YXRlSURzUmVmZXJlbmNlKSB7CiAgICBteSAoICRGaXJzdEhhc2hSZWYsICRTZWNvbmRIYXNoUmVmICkKICAgICAgICA9IGdyZXAgeyAkXy0+e0tleX0gPT0gJFBvc3NpYmxlU3RhdGVJRCB9IEB7JFBvc3NpYmxlU3RhdGVzfTsKCiAgICAjIGEgbWF0Y2ggaXMgZXhwZWN0ZWQKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRGaXJzdEhhc2hSZWYsCiAgICAgICAgIkNoZWNrIGZvciBwb3NzaWJsZSBzdGF0ZSBpZCAkUG9zc2libGVTdGF0ZUlEIiwKICAgICk7CgogICAgIyB0aGUgbmFtZSBzaG91bGQgYWxzbyBtYXRjaAogICAgJEZpcnN0SGFzaFJlZiB8fD0ge307CiAgICBteSAkUG9zc2libGVTdGF0ZU5hbWUgPSAkQ2hhbmdlU3RhdGVJRDJOYW1leyRQb3NzaWJsZVN0YXRlSUR9OwogICAgJFNlbGYtPklzKAogICAgICAgICRGaXJzdEhhc2hSZWYtPntWYWx1ZX0sCiAgICAgICAgJFBvc3NpYmxlU3RhdGVOYW1lLAogICAgICAgICJDaGVjayBmb3IgcG9zc2libGUgc3RhdGUgbmFtZSAkUG9zc2libGVTdGF0ZUlEIiwKICAgICk7CgogICAgIyBvbmx5IG9uZSBtYXRjaCBpcyBleHBlY3RlZAogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTZWNvbmRIYXNoUmVmLAogICAgICAgICJDaGVjayB0aGF0IHRoZSBzdGF0ZSBpZCAkUG9zc2libGVTdGF0ZUlEIGlzIHJldHVybmVkIG9ubHkgb25jZS4iLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3RpbmcgdGhlIG1ldGhvZCBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIHdpdGggQ2hhbmdlSUQgYXJndW1lbnQKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzLi4uCm15ICRUZXN0TnVtYmVyID0gMDsKCm15IEBQb3NzaWJsZVN0YXRlc0ZvclJlcXVlc3RlZCA9ICgKICAgICdyZXF1ZXN0ZWQnLAogICAgJ2luIHByb2dyZXNzJywKICAgICdwZW5kaW5nIGFwcHJvdmFsJywKICAgICdyZWplY3RlZCcsCiAgICAncmV0cmFjdGVkJywKKTsKCm15IEBQb3NzaWJsZVN0YXRlc0ZvclBlbmRpZ0FwcHJvdmFsID0gKAogICAgJ3BlbmRpbmcgYXBwcm92YWwnLAogICAgJ2FwcHJvdmVkJywKICAgICdyZWplY3RlZCcsCiAgICAncmV0cmFjdGVkJywKKTsKCm15IEBQb3NzaWJsZVN0YXRlc0ZvckFwcHJvdmVkID0gKAogICAgJ2FwcHJvdmVkJywKICAgICdyZXRyYWN0ZWQnLAogICAgJ2luIHByb2dyZXNzJywKKTsKCm15IEBQb3NzaWJsZVN0YXRlc0ZvckluUHJvZ3Jlc3MgPSAoCiAgICAnaW4gcHJvZ3Jlc3MnLAogICAgJ2NhbmNlbGVkJywKICAgICdmYWlsZWQnLAogICAgJ3BlbmRpbmcgcGlyJywKICAgICdyZXRyYWN0ZWQnLAogICAgJ3N1Y2Nlc3NmdWwnLAopOwoKIyBUZXN0IGxvZ2ljIHN0YXJ0cy4uLgoKIyBDcmVhdGUgYSBjaGFuZ2Ugb2JqZWN0Li4uCm15ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUFkZCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBHZXQgcG9zc3NpYmxlIHN0YXRlcy4uLgpteSAkUG9zc2libGVTdGF0ZXNVc2luZ0NoYW5nZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgKICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFRlc3ROdW1iZXIrKzsKCl9UZXN0UG9zc2libGVTdGF0ZXMoCiAgICBTdGF0ZSAgICAgICAgICAgICAgICAgPT4gJ1JlcXVlc3RlZCcsCiAgICBQb3NzaWJsZVN0YXRlcyAgICAgICAgPT4gJFBvc3NpYmxlU3RhdGVzVXNpbmdDaGFuZ2VJRCwKICAgIFBvc3NpYmxlRGVmYXVsdFN0YXRlcyA9PiBcQFBvc3NpYmxlU3RhdGVzRm9yUmVxdWVzdGVkLAogICAgVGVzdE51bWJlciAgICAgICAgICAgID0+ICRUZXN0TnVtYmVyLAopOwoKIyBDaGFuZ2UgdGhlIHN0YXRlCm15ICRDaGFuZ2VVcGRhdGVTdWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VVcGRhdGUoCiAgICBDaGFuZ2VJRCAgICA9PiAkQ2hhbmdlSURGb3JDaGFuZ2VQb3NzaWJsZVN0YXRlR2V0LAogICAgQ2hhbmdlU3RhdGUgPT4gJ3BlbmRpbmcgYXBwcm92YWwnLAogICAgVXNlcklEICAgICAgPT4gMSwKKTsKCiRUZXN0TnVtYmVyKys7CgokU2VsZi0+VHJ1ZSgKICAgICRDaGFuZ2VVcGRhdGVTdWNjZXNzLAogICAgIlRlc3QgJFRlc3ROdW1iZXIgU3RhdGUgY2hhbmdlIgopOwoKIyBHZXQgcG9zc3NpYmxlIHN0YXRlcy4uLgokUG9zc2libGVTdGF0ZXNVc2luZ0NoYW5nZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgKICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJREZvckNoYW5nZVBvc3NpYmxlU3RhdGVHZXQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKX1Rlc3RQb3NzaWJsZVN0YXRlcygKICAgIFN0YXRlICAgICAgICAgICAgICAgICA9PiAnQXBwcm92ZWQnLAogICAgUG9zc2libGVTdGF0ZXMgICAgICAgID0+ICRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQsCiAgICBQb3NzaWJsZURlZmF1bHRTdGF0ZXMgPT4gXEBQb3NzaWJsZVN0YXRlc0ZvclBlbmRpZ0FwcHJvdmFsLAogICAgVGVzdE51bWJlciAgICAgICAgICAgID0+ICRUZXN0TnVtYmVyLAopOwoKIyBDaGFuZ2UgdGhlIHN0YXRlCiRDaGFuZ2VVcGRhdGVTdWNjZXNzID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VVcGRhdGUoCiAgICBDaGFuZ2VJRCAgICA9PiAkQ2hhbmdlSURGb3JDaGFuZ2VQb3NzaWJsZVN0YXRlR2V0LAogICAgQ2hhbmdlU3RhdGUgPT4gJ2FwcHJvdmVkJywKICAgIFVzZXJJRCAgICAgID0+IDEsCik7CgokVGVzdE51bWJlcisrOwoKJFNlbGYtPlRydWUoCiAgICAkQ2hhbmdlVXBkYXRlU3VjY2VzcywKICAgICJUZXN0ICRUZXN0TnVtYmVyIFN0YXRlIGNoYW5nZSIKKTsKCiMgR2V0IHBvc3NzaWJsZSBzdGF0ZXMuLi4KJFBvc3NpYmxlU3RhdGVzVXNpbmdDaGFuZ2VJRCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVTdGF0ZXNHZXQoCiAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSURGb3JDaGFuZ2VQb3NzaWJsZVN0YXRlR2V0LAogICAgVXNlcklEICAgPT4gMSwKKTsKCl9UZXN0UG9zc2libGVTdGF0ZXMoCiAgICBTdGF0ZSAgICAgICAgICAgICAgICAgPT4gJ0FwcHJvdmVkJywKICAgIFBvc3NpYmxlU3RhdGVzICAgICAgICA9PiAkUG9zc2libGVTdGF0ZXNVc2luZ0NoYW5nZUlELAogICAgUG9zc2libGVEZWZhdWx0U3RhdGVzID0+IFxAUG9zc2libGVTdGF0ZXNGb3JBcHByb3ZlZCwKICAgIFRlc3ROdW1iZXIgICAgICAgICAgICA9PiAkVGVzdE51bWJlciwKKTsKCiMgQ2hhbmdlIHRoZSBzdGF0ZQokQ2hhbmdlVXBkYXRlU3VjY2VzcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlVXBkYXRlKAogICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlERm9yQ2hhbmdlUG9zc2libGVTdGF0ZUdldCwKICAgIENoYW5nZVN0YXRlID0+ICdpbiBwcm9ncmVzcycsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJFRlc3ROdW1iZXIrKzsKCiRTZWxmLT5UcnVlKAogICAgJENoYW5nZVVwZGF0ZVN1Y2Nlc3MsCiAgICAiVGVzdCAkVGVzdE51bWJlciBTdGF0ZSBjaGFuZ2UiCik7CgojIEdldCBwb3Nzc2libGUgc3RhdGVzLi4uCiRQb3NzaWJsZVN0YXRlc1VzaW5nQ2hhbmdlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlU3RhdGVzR2V0KAogICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlERm9yQ2hhbmdlUG9zc2libGVTdGF0ZUdldCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgpfVGVzdFBvc3NpYmxlU3RhdGVzKAogICAgU3RhdGUgICAgICAgICAgICAgICAgID0+ICdJbiBQcm9ncmVzcycsCiAgICBQb3NzaWJsZVN0YXRlcyAgICAgICAgPT4gJFBvc3NpYmxlU3RhdGVzVXNpbmdDaGFuZ2VJRCwKICAgIFBvc3NpYmxlRGVmYXVsdFN0YXRlcyA9PiBcQFBvc3NpYmxlU3RhdGVzRm9ySW5Qcm9ncmVzcywKICAgIFRlc3ROdW1iZXIgICAgICAgICAgICA9PiAkVGVzdE51bWJlciwKKTsKCiMgRGVsZXRlIHRoZSBDaGFuZ2UKJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VEZWxldGUoCiAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSURGb3JDaGFuZ2VQb3NzaWJsZVN0YXRlR2V0LAogICAgVXNlcklEICAgPT4gMSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDSVAgYWxsb2NhdGUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgY3VycmVudCBhbGxvY2F0aW9uIGxpc3QgKFVzZXJJRCBpcyBuZWVkZWQpCm15ICRFbXB0eUFsbG9jYXRlRGF0YSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZUxpc3QoKTsKCiMgY2hlY2sgdGhlIHJlc3VsdAokU2VsZi0+RmFsc2UoCiAgICAkRW1wdHlBbGxvY2F0ZURhdGEsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogQWxsb2NhdGVMaXN0KCknLAopOwoKIyBnZXQgY3VycmVudCBhbGxvY2F0aW9uIGxpc3QKbXkgJEN1cnJlbnRBbGxvY2F0ZURhdGEgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPlRydWUoCiAgICAkQ3VycmVudEFsbG9jYXRlRGF0YSwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnOiBBbGxvY2F0ZUxpc3QoKScsCik7CgojIGNoZWNrIHRoZSBhbGxvY2F0aW9uIGhhc2gKbXkgJEhhc2hJc09LID0gMTsKaWYgKCByZWYgJEN1cnJlbnRBbGxvY2F0ZURhdGEgbmUgJ0hBU0gnICkgewogICAgJEhhc2hJc09LID0gMDsKfQoKIyBjaGVjayB0aGUgYWxsb2NhdGlvbiAyZCBoYXNoCmlmICgkSGFzaElzT0spIHsKCiAgICBJTVBBQ1RJRDoKICAgIGZvciBteSAkSW1wYWN0SUQgKCBrZXlzICV7JEN1cnJlbnRBbGxvY2F0ZURhdGF9ICkgewoKICAgICAgICBpZiAoIHJlZiAkQ3VycmVudEFsbG9jYXRlRGF0YS0+eyRJbXBhY3RJRH0gbmUgJ0hBU0gnICkgewogICAgICAgICAgICAkSGFzaElzT0sgPSAwOwogICAgICAgICAgICBsYXN0IElNUEFDVElEOwogICAgICAgIH0KCiAgICAgICAgQ0FURUdPUllJRDoKICAgICAgICBmb3IgbXkgJENhdGVnb3J5SUQgKCBrZXlzICV7ICRDdXJyZW50QWxsb2NhdGVEYXRhLT57JEltcGFjdElEfSB9ICkgewoKICAgICAgICAgICAgaWYgKCAhJENhdGVnb3J5SUQgfHwgISRDdXJyZW50QWxsb2NhdGVEYXRhLT57JEltcGFjdElEfS0+eyRDYXRlZ29yeUlEfSApIHsKICAgICAgICAgICAgICAgICRIYXNoSXNPSyA9IDA7CiAgICAgICAgICAgICAgICBsYXN0IElNUEFDVElEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojIGNoZWNrIEhhc2hPSwokU2VsZi0+VHJ1ZSgKICAgICRIYXNoSXNPSywKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnOiBBbGxvY2F0ZUxpc3QoKScsCik7CgojIHVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBoYXNoIChub3QgYWxsIG5lZWRlZCBhcmd1bWVudHMgZ2l2ZW4pCm15ICRDSVBBbGxvY2F0aW9uVXBkYXRlZCA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5GYWxzZSgKICAgICRDSVBBbGxvY2F0aW9uVXBkYXRlZCwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnOiBBbGxvY2F0ZVVwZGF0ZSgpJywKKTsKCiMgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIGhhc2ggKG5vdCBhbGwgbmVlZGVkIGFyZ3VtZW50cyBnaXZlbikKbXkgJENJUEFsbG9jYXRpb25Jc1VwZGF0ZWQgPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+QWxsb2NhdGVVcGRhdGUoCiAgICBBbGxvY2F0ZURhdGEgPT4gJEN1cnJlbnRBbGxvY2F0ZURhdGEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPkZhbHNlKAogICAgJENJUEFsbG9jYXRpb25Jc1VwZGF0ZWQsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogQWxsb2NhdGVVcGRhdGUoKScsCik7CgojIHVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBoYXNoIChhbGxvY2F0aW9uIGhhc2gpCm15ICRDSVBBbGxvY2F0aW9uSXNVcGRhdGVkTnJUaHJlZSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIEFsbG9jYXRlRGF0YSA9PiB7CiAgICAgICAgVGVzdCAgPT4gJ2FhYScsCiAgICAgICAgVGVzdDIgPT4gJ2JiYicsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIHRoZSByZXN1bHQKJFNlbGYtPkZhbHNlKAogICAgJENJUEFsbG9jYXRpb25Jc1VwZGF0ZWROclRocmVlLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICc6IEFsbG9jYXRlVXBkYXRlKCknLAopOwoKIyB1cGRhdGUgdGhlIGFsbG9jYXRpb24gaGFzaApteSAkU3VjY2VzcyA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgIEFsbG9jYXRlRGF0YSA9PiAkQ3VycmVudEFsbG9jYXRlRGF0YSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKIyBjaGVjayB0aGUgcmVzdWx0CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJzogQWxsb2NhdGVVcGRhdGUoKScsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ0lQIGxvb2t1cCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokTG9va3VwT2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUNJUExvb2t1cCgKICAgIENJUCAgPT4gJzEgdmVyeSBoaWdoJywKICAgIFR5cGUgPT4gJ25vbi1leGlzdGVudCcsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnSW52YWxpZCB0eXBlIHBhc3NlZCB0byBDaGFuZ2VDSVBMb29rdXAoKScsCik7CgokTG9va3VwT2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUNJUExvb2t1cCgKICAgIENJUCA9PiAnMSB2ZXJ5IGhpZ2gnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgJ1BhcmFtZXRlciBUeXBlIG5vdCBwYXNzZWQgdG8gQ2hhbmdlQ0lQTG9va3VwKCknLAopOwoKJExvb2t1cE9rID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VDSVBMb29rdXAoCiAgICBUeXBlID0+ICdQcmlvcml0eScsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnUGFyYW1ldGVyIElEIG9yIENJUCBub3QgcGFzc2VkIHRvIENoYW5nZUNJUExvb2t1cCgpJywKKTsKCiRMb29rdXBPayA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQ0lQTG9va3VwKAogICAgVHlwZSA9PiAnUHJpb3JpdHknLAogICAgQ0lQICA9PiAnMSB2ZXJ5IGhpZ2gnLAogICAgSUQgICA9PiAxMjMsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT2ssCiAgICAnRXhjbHVzaXZlIHBhcmFtZXRlcnMgSUQgYW5kIENJUCBwYXNzZWQgdG8gQ2hhbmdlQ0lQTG9va3VwKCknLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENoYW5nZVBvc3NpYmxlQ0lQR2V0KCkgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFBvc3NpYmxlQ0lQR2V0T2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgVHlwZSAgID0+ICdub24tZXhpc3RlbnQnLAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkUG9zc2libGVDSVBHZXRPaywKICAgICdJbnZhbGlkIHR5cGUgcGFzc2VkIHRvIENoYW5nZVBvc3NpYmxlQ0lQR2V0KCknLAopOwoKJFBvc3NpYmxlQ0lQR2V0T2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZVBvc3NpYmxlQ0lQR2V0KAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkUG9zc2libGVDSVBHZXRPaywKICAgICdQYXJhbWV0ZXIgVHlwZSBub3QgcGFzc2VkIHRvIENoYW5nZVBvc3NpYmxlQ0lQR2V0KCknLAopOwoKIyBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHRocmVlIHR5cGVzLgpteSAkUG9zc2libGVDSVBSZWZlcmVuY2UgPSBqb2luICcsICcsIEBDSVBWYWx1ZXM7CmZvciBteSAkVHlwZSAocXcoQ2F0ZWdvcnkgSW1wYWN0IFByaW9yaXR5KSkgewogICAgbXkgJFBvc3NpYmxlQ0lQcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlUG9zc2libGVDSVBHZXQoCiAgICAgICAgVHlwZSAgID0+ICRUeXBlLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgcmVmICRQb3NzaWJsZUNJUHMsCiAgICAgICAgJ0FSUkFZJywKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENoYW5nZVBvc3NpYmxlQ0lQR2V0KCkgcmV0dXJuZWQgYXJyYXkgcmVmIGZvciAnJFR5cGUnIiwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIGpvaW4oICcsICcsIG1hcCB7ICRfLT57VmFsdWV9IH0gQHskUG9zc2libGVDSVBzfSApLAogICAgICAgICRQb3NzaWJsZUNJUFJlZmVyZW5jZSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50IC0gQ2hhbmdlUG9zc2libGVDSVBHZXQoKSByZXR1cm5lZCBleHBlY3RlZCB2YWx1ZXMgZm9yICckVHlwZSciLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3Rpbmcgc3VwcG9ydCBmb3IgYXR0YWNobWVudHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgKCRBdHRhY2htZW50VGVzdENoYW5nZUlEKSA9IEB7ICRMYWJlbDJDaGFuZ2VJRHN7QXR0YWNobWVudH0gfTsKCiMgdmVyaWZ5IHRoYXQgaW5pdGlhbHkgbm8gYXR0YWNobWVudCBleGlzdHMKbXkgJUF0dGFjaG1lbnRMaXN0ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBdHRhY2htZW50TGlzdCgKICAgIENoYW5nZUlEID0+ICRBdHRhY2htZW50VGVzdENoYW5nZUlELAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhcigga2V5cyAlQXR0YWNobWVudExpc3QgKSwKICAgIDAsCiAgICAnbm8gYXR0YWNobWVudHMgaW5pdGlhbGx5JywKKTsKCm15IEBUZXN0RmlsZUxpc3QgPSAoCiAgICB7CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2ZpcnN0IGF0dGFjaG1lbnQnLAogICAgICAgIENvbnRlbnQgICAgID0+ICdGaXJzdCBhdHRhY2htZW50IGZyb20gSVRTTUNoYW5nZS50JywKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICB9LAogICAgewogICAgICAgIEZpbGVuYW1lICAgID0+ICdzZWNvbmQgYXR0YWNobWVudCcsCiAgICAgICAgQ29udGVudCAgICAgPT4gJ1NlY29uZCBhdHRhY2htZW50IGZyb20gSVRTTUNoYW5nZS50JywKICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICB9LAopOwoKbXkgJEZpbGVDb3VudCA9IDE7Cm15ICVGaWxlbmFtZTJGaWxlSUQ7CmZvciBteSAkVGVzdEZpbGUgKEBUZXN0RmlsZUxpc3QpIHsKCiAgICBteSAkQWRkT2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRBZGQoCiAgICAgICAgJXskVGVzdEZpbGV9LAogICAgICAgIENoYW5nZUlEID0+ICRBdHRhY2htZW50VGVzdENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoICRBZGRPaywgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogYXR0YWNobWVudCBhZGRlZCIgKTsKCiAgICBteSAlQXR0YWNobWVudExpc3QgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRBdHRhY2htZW50VGVzdENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIoIGtleXMgJUF0dGFjaG1lbnRMaXN0ICksCiAgICAgICAgJEZpbGVDb3VudCwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBudW1iZXIgb2YgYXR0YWNobWVudHMgYWZ0ZXIgYWRkaW5nIiwKICAgICk7CgogICAgbXkgJEZpbGVJRCA9IG1heCgga2V5cyAlQXR0YWNobWVudExpc3QgKTsKICAgICRGaWxlbmFtZTJGaWxlSUR7ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSB9ID0gJEZpbGVJRDsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEF0dGFjaG1lbnRMaXN0eyRGaWxlSUR9LAogICAgICAgICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBmaWxlbmFtZSBmcm9tIENoYW5nZUF0dGFjaG1lbnRMaXN0KCkiLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudEdldCgKICAgICAgICBGaWxlSUQgPT4gJEZpbGVJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSggJEF0dGFjaG1lbnQsICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IENoYW5nZUF0dGFjaG1lbnRHZXQoKSByZXR1cm5lZCB0cnVlIiApOwoKICAgIGZvciBteSAkQXR0ciAocXcoRmlsZW5hbWUgQ29udGVudCBDb250ZW50VHlwZSkpIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57JEF0dHJ9LAogICAgICAgICAgICAkVGVzdEZpbGUtPnskQXR0cn0sCiAgICAgICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6ICRBdHRyIGZyb20gQ2hhbmdlQXR0YWNobWVudEdldCIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQXR0YWNobWVudEV4aXN0cyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudEV4aXN0cygKICAgICAgICBGaWxlbmFtZSA9PiAkVGVzdEZpbGUtPntGaWxlbmFtZX0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJEF0dGFjaG1lbnRUZXN0Q2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSggJEF0dGFjaG1lbnRFeGlzdHMsICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgZXhpc3RzIiApOwoKfQpjb250aW51ZSB7CiAgICAkRmlsZUNvdW50Kys7Cn0KCiMgbm93IGRlbGV0ZSB0aGUgYXR0YWNobWVudHMKJEZpbGVDb3VudCA9IDE7CmZvciBteSAkVGVzdEZpbGUgKEBUZXN0RmlsZUxpc3QpIHsKCiAgICBteSAkRmlsZUlEICAgPSAkRmlsZW5hbWUyRmlsZUlEeyAkVGVzdEZpbGUtPntGaWxlbmFtZX0gfTsKICAgIG15ICREZWxldGVPayA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudERlbGV0ZSgKICAgICAgICBGaWxlSUQgICA9PiAkRmlsZUlELAogICAgICAgIENoYW5nZUlEID0+ICRBdHRhY2htZW50VGVzdENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJERlbGV0ZU9rLAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgZGVsZXRlZCIsCiAgICApOwoKICAgIG15ICVBdHRhY2htZW50TGlzdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudExpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJEF0dGFjaG1lbnRUZXN0Q2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhcigga2V5cyAlQXR0YWNobWVudExpc3QgKSwKICAgICAgICAyIC0gJEZpbGVDb3VudCwKICAgICAgICAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBudW1iZXIgb2YgYXR0YWNobWVudHMgYWZ0ZXIgZGVsZXRpb24iLAogICAgKTsKCiAgICBteSAkQXR0YWNobWVudEV4aXN0cyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQXR0YWNobWVudEV4aXN0cygKICAgICAgICBGaWxlbmFtZSA9PiAkVGVzdEZpbGUtPntGaWxlbmFtZX0sCiAgICAgICAgQ2hhbmdlSUQgPT4gJEF0dGFjaG1lbnRUZXN0Q2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+RmFsc2UoICRBdHRhY2htZW50RXhpc3RzLCAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBhdHRhY2htZW50IGlzIGdvbmUiICk7Cn0KY29udGludWUgewogICAgJEZpbGVDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2xlYW4gdGhlIHN5c3RlbQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNoYW5nZSB0aGUgbmV3bHkgYWRkZWQgdXNlcnMKJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpOwppZiAoICFkZWZpbmVkICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnICkgewogICAgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAxOwp9CiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgc2V0IHVuaXR0ZXN0IHVzZXJzIGludmFsaWQKZm9yIG15ICRVbml0dGVzdFVzZXJJRCAoQFVzZXJJRHMpIHsKCiAgICAjIGdldCB1c2VyIGRhdGEKICAgIG15ICVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRVbml0dGVzdFVzZXJJRCwKICAgICk7CgogICAgIyB1cGRhdGUgdXNlcgogICAgJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlclVwZGF0ZSgKICAgICAgICAlVXNlciwKICAgICAgICBWYWxpZElEID0+ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ2ludmFsaWQnICksCiAgICAgICAgQ2hhbmdlVXNlcklEID0+IDEsCiAgICApOwp9CgojIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKKTsKCiMgZGVsZXRlIHRoZSB0ZXN0IGNoYW5nZXMKbXkgJERlbGV0ZVRlc3RDb3VudCA9IDE7CmZvciBteSAkQ2hhbmdlSUQgKCBrZXlzICVUZXN0ZWRDaGFuZ2VJRCApIHsKICAgIG15ICREZWxldGVPayA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlRGVsZXRlKAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVPaywKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gQ2hhbmdlRGVsZXRlKCkgKENoYW5nZUlEPSRDaGFuZ2VJRCkiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjaGFuZ2UgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgQ2FjaGUgICAgPT4gMCwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRDaGFuZ2VEYXRhLT57Q2hhbmdlSUR9LAogICAgICAgICJEZWxldGVUZXN0ICREZWxldGVUZXN0Q291bnQgLSBkb3VibGUgY2hlY2sgKENoYW5nZUlEPSRDaGFuZ2VJRCkiLAogICAgKTsKfQpjb250aW51ZSB7CiAgICAkRGVsZXRlVGVzdENvdW50Kys7Cn0KCj1vdmVyIDQKCj1pdGVtIFNldFRpbWVzKCkKClNldCBuZXcgdmFsdWVzIGZvciBDcmVhdGVUaW1lIGFuZCBDaGFuZ2VUaW1lIGZvciBhIGdpdmVuIENoYW5nZUlELgoKICAgIG15ICRVcGRhdGVTdWNjZXNzID0gU2V0VGltZXMoCiAgICAgICAgQ2hhbmdlSUQgPT4gMTIzLAogICAgICAgIENyZWF0ZVRpbWUgPT4gJzIwMDktMTAtMzAgMDE6MDA6MTUnLAogICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMDktMTAtMzAgMDE6MDA6MTUnLAogICAgKTsKCj1iYWNrCgo9Y3V0CgpzdWIgU2V0VGltZXMgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICAjIGNoZWNrIGNoYW5nZSBpZAogICAgaWYgKCAhJFBhcmFte0NoYW5nZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2hhbmdlSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgIGlmICggISRQYXJhbXtDcmVhdGVUaW1lfSAmJiAhJFBhcmFte0NoYW5nZVRpbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBwYXJhbWV0ZXIgQ3JlYXRlVGltZSBvciBDaGFuZ2VUaW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQEJpbmQ7CiAgICBteSAkU1FMID0gJ1VQREFURSBjaGFuZ2VfaXRlbSBTRVQgJzsKCiAgICBpZiAoICRQYXJhbXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAkU1FMIC49ICdjcmVhdGVfdGltZSA9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NyZWF0ZVRpbWV9OwogICAgfQoKICAgIGlmICggJFBhcmFte0NyZWF0ZVRpbWV9ICYmICRQYXJhbXtDaGFuZ2VUaW1lfSApIHsKICAgICAgICAkU1FMIC49ICcsICc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2hhbmdlVGltZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnY2hhbmdlX3RpbWUgPSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDaGFuZ2VUaW1lfTsKICAgIH0KCiAgICAkU1FMIC49ICdXSEVSRSBpZCA9ID8gJzsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2hhbmdlSUR9OwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgIEtleSAgPT4gJ0NoYW5nZUdldDo6SUQ6OicgLiAkUGFyYW17Q2hhbmdlSUR9LAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnSVRTTUNoYW5nZU1hbmFnZW1lbnQnLAogICAgICAgIEtleSAgPT4gJ0NoYW5nZUxpc3QnLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKIyBzZXQgU2VuZE5vdGlmaWNhdGlvbnMgdG8gaXQncyBvcmlnaW5hbCB2YWx1ZQokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdJVFNNQ2hhbmdlOjpTZW5kTm90aWZpY2F0aW9ucycsCiAgICBWYWx1ZSA9PiAkU2VuZE5vdGlmaWNhdGlvbnNPcmcsCik7Cgo9b3ZlciA0Cgo9aXRlbSBfVGVzdFBvc3NpYmxlU3RhdGVzKCkKCkludGVybmFsIHVzZSBvbmx5IQpSdW5zIGEgc2VyaWVzIG9mIHRlc3RzIGZvciBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIGJ5IHVzaW5nIGEgQ2hhbmdlSUQgYXMgYXJndW1lbnQKCiAgICBfVGVzdFBvc3NzaWJsZVN0YXRlcygKICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgICAgPT4gJ0luIFByb2dyZXNzJywgICAgICAgICAgICAgICAgICMgU3RhdGUgbmFtZSB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHRlc3RzCiAgICAgICAgUG9zc2libGVTdGF0ZXMgICAgICAgID0+ICRQb3NzaWJsZVN0YXRlcywgICAgICAgICAgICAgICAjIFRoZSByZXN1bHQgZnJvbSBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpCiAgICAgICAgUG9zc2libGVEZWZhdWx0U3RhdGVzID0+IFxAUG9zc2libGVTdGF0ZXNGb3JJblByb2dyZXNzLCAjIEFycmF5IHRvIHBvc3NpYmxlIHN0YXRlIHRvIGNvbXBhcmUKICAgICAgICBUZXN0TnVtYmVyICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGVzdG51bWJlcgoKICAgICk7Cgo9YmFjawoKPWN1dAoKc3ViIF9UZXN0UG9zc2libGVTdGF0ZXMgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICBteSAkU3RhdGUgICAgICAgICAgICAgICAgID0gJFBhcmFte1N0YXRlfTsKICAgIG15ICRQb3NzaWJsZVN0YXRlcyAgICAgICAgPSAkUGFyYW17UG9zc2libGVTdGF0ZXN9OwogICAgbXkgQFBvc3NpYmxlRGVmYXVsdFN0YXRlcyA9IEB7ICRQYXJhbXtQb3NzaWJsZURlZmF1bHRTdGF0ZXN9IH07CiAgICBteSAkVGVzdE51bWJlciAgICAgICAgICAgID0gJFBhcmFte1Rlc3ROdW1iZXJ9OwoKICAgICMgQ2hlY2sgaWYgcmV0dXJuLi4uCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUG9zc2libGVTdGF0ZXMsCiAgICAgICAgIlBvc3NpYmxlIFN0YXRlcyBUZXN0ICRUZXN0TnVtYmVyOiBDaGFuZ2VQb3NzaWJsZVN0YXRlc0dldCgpIC0gIgogICAgICAgICAgICAuICJyZXR1cm5zIGEgbGlzdCBvZiBwb3NpYmxlIHN0YXRlcyBmcm9tICRTdGF0ZSBTdGF0ZS4iLAogICAgKTsKCiAgICAjIENoZWNrIGlmIHJldHVybmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygc3RhdGVzLi4uCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JFBvc3NpYmxlU3RhdGVzVXNpbmdDaGFuZ2VJRH0sCiAgICAgICAgc2NhbGFyIEBQb3NzaWJsZURlZmF1bHRTdGF0ZXMsCiAgICAgICAgIlBvc3NpYmxlIFN0YXRlcyBUZXN0ICRUZXN0TnVtYmVyOiB8LSIKICAgICAgICAgICAgLiAicmV0dXJucyB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgdGhlICRTdGF0ZSBTdGF0ZSBkZWZhdWx0LiIsCiAgICApOwoKICAgIGZvciBteSAkUG9zc2libGVTdGF0ZUhhc2ggKCBAeyRQb3NzaWJsZVN0YXRlc30gKSB7CiAgICAgICAgbXkgKCAkRmlyc3RIYXNoUmVmLCAkU2Vjb25kSGFzaFJlZiApCiAgICAgICAgICAgID0gZ3JlcCB7ICRfIGVxICRQb3NzaWJsZVN0YXRlSGFzaC0+e1ZhbHVlfSB9IEBQb3NzaWJsZURlZmF1bHRTdGF0ZXM7CgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHN0YXRlIG5hbWVzIGFyZSBjb3JyZWN0Li4uCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkRmlyc3RIYXNoUmVmLAogICAgICAgICAgICAkUG9zc2libGVTdGF0ZUhhc2gtPntWYWx1ZX0sCiAgICAgICAgICAgICJQb3NzaWJsZSBTdGF0ZXMgVGVzdCAkVGVzdE51bWJlcjogfC0gbWF0Y2ggZGVmYXVsdCBzdGF0ZXMgZnJvbSAkU3RhdGUgU3RhdGUuIiwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHRoZSBzdGF0ZSBuYW1lIGlzIG5vdCByZXBldGVkCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2Vjb25kSGFzaFJlZiwKICAgICAgICAgICAgIlBvc3NpYmxlIFN0YXRlcyBUZXN0ICRUZXN0TnVtYmVyOiB8LSBzdGF0ZXMgZm9ybSAkU3RhdGUgbWF0Y2ggb25seSBvbmNlIgogICAgICAgICk7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIElUU01Db25kaXRpb24udCAtIENvbmRpdGlvbiB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTUNvbmRpdGlvbi50LHYgMS42MCAyMDEwLzAxLzMwIDExOjE5OjU1IGJlcyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ29uZGl0aW9uOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwoKIyBjcmVhdGUgY29tbW9uIG9iamVjdHMKJFNlbGYtPntDaGFuZ2VPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntDb25kaXRpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb24tPm5ldyggJXskU2VsZn0gKTsKCiMgdGVzdCBpZiBjaGFuZ2Ugb2JqZWN0IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQokU2VsZi0+VHJ1ZSgKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gY29uc3RydWN0aW9uIG9mIGNoYW5nZSBvYmplY3QnLAopOwoKIyB0ZXN0IGlmIHdvcmtvcmRlciBvYmplY3Qgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5UcnVlKAogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBjb25zdHJ1Y3Rpb24gb2Ygd29ya29yZGVyIG9iamVjdCcsCik7CgojIHRlc3QgaWYgY29uZGl0aW9uIG9iamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKJFNlbGYtPlRydWUoCiAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0sCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNvbnN0cnVjdGlvbiBvZiBjb25kaXRpb24gb2JqZWN0JywKKTsKCiMgdHVybiBvZmYgU2VuZE5vdGlmaWNhdGlvbnMsIGluIG9yZGVyIHRvIGF2b2lkIGEgbG90IG9mIHVzZWxlc3MgbWFpbHMKbXkgJFNlbmROb3RpZmljYXRpb25zT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmNhdGlvbnMnKTsKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSVRTTUNoYW5nZTo6U2VuZE5vdGlmaWNhdGlvbnMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IENvbmRpdGlvbiBBUEkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgcHVibGljIGludGVyZmFjZSAoaW4gYWxwaGFiZXRpY2FsIG9yZGVyKQpteSBAT2JqZWN0TWV0aG9kcyA9IHF3KAogICAgQXR0cmlidXRlQWRkCiAgICBBdHRyaWJ1dGVEZWxldGUKICAgIEF0dHJpYnV0ZUdldAogICAgQXR0cmlidXRlTGlzdAogICAgQXR0cmlidXRlTG9va3VwCiAgICBBdHRyaWJ1dGVVcGRhdGUKICAgIENvbmRpdGlvbkFkZAogICAgQ29uZGl0aW9uRGVsZXRlCiAgICBDb25kaXRpb25EZWxldGVBbGwKICAgIENvbmRpdGlvbkdldAogICAgQ29uZGl0aW9uTGlzdAogICAgQ29uZGl0aW9uTWF0Y2hFeGVjdXRlCiAgICBDb25kaXRpb25NYXRjaEV4ZWN1dGVBbGwKICAgIENvbmRpdGlvblVwZGF0ZQogICAgRXhwcmVzc2lvbkFkZAogICAgRXhwcmVzc2lvbkRlbGV0ZQogICAgRXhwcmVzc2lvbkRlbGV0ZUFsbAogICAgRXhwcmVzc2lvbkdldAogICAgRXhwcmVzc2lvbkxpc3QKICAgIEV4cHJlc3Npb25NYXRjaAogICAgRXhwcmVzc2lvblVwZGF0ZQogICAgT2JqZWN0QWRkCiAgICBPYmplY3REZWxldGUKICAgIE9iamVjdEdldAogICAgT2JqZWN0TGlzdAogICAgT2JqZWN0TG9va3VwCiAgICBPYmplY3RVcGRhdGUKICAgIE9wZXJhdG9yQWRkCiAgICBPcGVyYXRvckRlbGV0ZQogICAgT3BlcmF0b3JFeGVjdXRlCiAgICBPcGVyYXRvckdldAogICAgT3BlcmF0b3JMaXN0CiAgICBPcGVyYXRvckxvb2t1cAogICAgT3BlcmF0b3JVcGRhdGUKKTsKCiMgY2hlY2sgaWYgc3VicyBhcmUgYXZhaWxhYmxlCmZvciBteSAkT2JqZWN0TWV0aG9kIChAT2JqZWN0TWV0aG9kcykgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5jYW4oJE9iamVjdE1ldGhvZCksCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBjaGVjayAnY2FuICRPYmplY3RNZXRob2QnIiwKICAgICk7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBtYWtlIHNvbWUgcHJlcGFyYXRpb25zCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMga2VlcCB0cmFjayBvZiBhIHRpbWUgYmVmb3JlIG9iamVjdHMgd2VyZSBhZGRlZCwKIyBmb3IgY29tcGFyaXNvbnMgaW4gZXhwcmVzc2lvbiBtYXRjaCB0ZXN0cwpteSAkU3lzdGVtVGltZUJlZm9yZUFkZGluZyA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSAtIDE7CgojIGNyZWF0ZSBuZXcgY2hhbmdlCm15IEBDaGFuZ2VJRHM7Cm15IEBDaGFuZ2VUaXRsZXM7CkNSRUFURUNIQU5HRToKZm9yIG15ICRDcmVhdGVDaGFuZ2UgKCAwIC4uIDkgKSB7CiAgICBteSAkQ2hhbmdlVGl0bGUgPSAnVW5pdFRlc3RDaGFuZ2UnIC4gJENyZWF0ZUNoYW5nZTsKICAgIG15ICRDaGFuZ2VJRCAgICA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQWRkKAogICAgICAgIENoYW5nZVRpdGxlID0+ICRDaGFuZ2VUaXRsZSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDaGFuZ2VBZGQgLT4gJENoYW5nZUlEIiwKICAgICk7CgogICAgIyBkbyBub3Qgc3RvcmUgY2hhbmdlIGlkIGlmIGFkZCBmYWlsZWQKICAgIG5leHQgQ1JFQVRFQ0hBTkdFIGlmICEkQ2hhbmdlSUQ7CgogICAgIyBzdG9yZSBjaGFuZ2UgaWQgZm9yIGZ1cnRoZXIgdXNhZ2UgYW5kIGRlbGV0aW9uCiAgICBwdXNoIEBDaGFuZ2VJRHMsICAgICRDaGFuZ2VJRDsKICAgIHB1c2ggQENoYW5nZVRpdGxlcywgJENoYW5nZVRpdGxlOwp9CgojIGNyZWF0ZSBuZXcgd29ya29yZGVycwpteSBAV29ya09yZGVySURzOwpteSBAV29ya09yZGVyVGl0bGVzOwpDUkVBVEVXT1JLT1JERVI6CmZvciBteSAkQ3JlYXRlV29ya09yZGVyICggMCAuLiAoICggMyAqICggc2NhbGFyIEBDaGFuZ2VJRHMgKSApIC0gMSApICkgewogICAgbXkgJFdvcmtPcmRlclRpdGxlID0gJ1VuaXRUZXN0V08nIC4gJENyZWF0ZVdvcmtPcmRlcjsKICAgIG15ICRXb3JrT3JkZXJJRCAgICA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQWRkKAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRHNbICggJENyZWF0ZVdvcmtPcmRlciAlIHNjYWxhciBAQ2hhbmdlSURzICkgXSwKICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICRXb3JrT3JkZXJUaXRsZSwKICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKSwKICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpICsgMTAwICksCiAgICAgICAgKSwKICAgICAgICBBY3R1YWxTdGFydFRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpLAogICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAoICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSArIDEwMCApLAogICAgICAgICksCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIFdvcmtPcmRlckFkZCAoQ2hhbmdlSUQ6ICcKICAgICAgICAgICAgLiAkQ2hhbmdlSURzWyAoICRDcmVhdGVXb3JrT3JkZXIgJSBzY2FsYXIgQENoYW5nZUlEcyApIF0gLiAiKSAtPiAkV29ya09yZGVySUQiLAogICAgKTsKCiAgICAjIGRvIG5vdCBzdG9yZSB3b3Jrb3JkZXIgaWQgaWYgYWRkIGZhaWxlZAogICAgbmV4dCBDUkVBVEVXT1JLT1JERVIgaWYgISRXb3JrT3JkZXJJRDsKCiAgICAjIHN0b3JlIHdvcmtvcmRlciBpZCBmb3IgZnVydGhlciB1c2FnZSBhbmQgZGVsZXRpb24KICAgIHB1c2ggQFdvcmtPcmRlcklEcywgICAgJFdvcmtPcmRlcklEOwogICAgcHVzaCBAV29ya09yZGVyVGl0bGVzLCAkV29ya09yZGVyVGl0bGU7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBjb25kaXRpb24gdGVzdHMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBjcmVhdGUgbmV3IGNvbmRpdGlvbgpteSBAQ29uZGl0aW9uSURzOwpteSAlQ29uZGl0aW9uQ291bnQ7CkNIQU5HRUlEOgpmb3IgbXkgJENoYW5nZUlEIChAQ2hhbmdlSURzKSB7CgogICAgIyBhZGQgc29tZSBjb25kaXRpb25zIHRvIGVhY2ggY2hhbmdlCiAgICBDT05ESVRJT05DT1VOVEVSOgogICAgZm9yIG15ICRDb25kaXRpb25Db3VudGVyICggMCAuLiA1ICkgewoKICAgICAgICAjIGJ1aWxkIGNvbmRpdGlvbiBuYW1lCiAgICAgICAgbXkgJENvbmRpdGlvbk5hbWUgPSAiVW5pdFRlc3RDb25kaXRpb25OYW1lXyR7Q2hhbmdlSUR9XyIgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CgogICAgICAgICMgYWRkIGEgY29uZGl0aW9uCiAgICAgICAgbXkgJENvbmRpdGlvbklEID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25BZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAkQ29uZGl0aW9uTmFtZSwKICAgICAgICAgICAgRXhwcmVzc2lvbkNvbmp1bmN0aW9uID0+ICdhbGwnLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDb25kaXRpb25JRCwKICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25BZGQgLT4gQ29uZGl0aW9uSUQ6ICRDb25kaXRpb25JRCIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBDT05ESVRJT05DT1VOVEVSIGlmICEkQ29uZGl0aW9uSUQ7CgogICAgICAgICMgcmVtZW1iZXIgY2hhbmdlIGlkIGZvciBsYXRlciB0ZXN0cwogICAgICAgICRDb25kaXRpb25Db3VudHskQ2hhbmdlSUR9Kys7CgogICAgICAgICMgZ2V0IHRoZSBhZGRlZCBjb25kaXRpb24KICAgICAgICBteSAkQ29uZGl0aW9uRGF0YSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uR2V0KAogICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQ29uZGl0aW9uRGF0YS0+e0NvbmRpdGlvbklEfSwKICAgICAgICAgICAgJENvbmRpdGlvbklELAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvbkdldCAtPiBDb25kaXRpb25JRDogJENvbmRpdGlvbklEIiwKICAgICAgICApOwoKICAgICAgICAjIHJlbWVtYmVyIGFsbCBjcmVhdGVkIGNvbmRpdGlvbnMgaWRzCiAgICAgICAgcHVzaCBAQ29uZGl0aW9uSURzLCAkQ29uZGl0aW9uSUQ7CgogICAgICAgICMgY29uZGl0aW9uIHVwZGF0ZSB0ZXN0cwogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25VcGRhdGUoCiAgICAgICAgICAgIENvbmRpdGlvbklEICAgICAgICAgICA9PiAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgIEV4cHJlc3Npb25Db25qdW5jdGlvbiA9PiAnYWxsJywKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgICAgID0+ICdBbiB1cGRhdGVkIGNvbW1lbnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ29uZGl0aW9uVXBkYXRlIC0+IENvbmRpdGlvbklEOiAkQ29uZGl0aW9uSUQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSB1cGRhdGVkIGNvbmRpdGlvbgogICAgICAgICRDb25kaXRpb25EYXRhID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25HZXQoCiAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRDb25kaXRpb25EYXRhLT57Q29tbWVudH0sCiAgICAgICAgICAgICdBbiB1cGRhdGVkIGNvbW1lbnQnLAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvbkdldCAtPiBDb25kaXRpb25JRDogJENvbmRpdGlvbklEIiwKICAgICAgICApOwoKICAgICAgICAjIHRyeSB0byBhZGQgdGhlIHNhbWUgY29uZGl0aW9uIGFnYWluIChDaGFuZ2VJRCBhbmQgTmFtZSBhcmUgdGhlIHNhbWUpIChtdXN0IGZhaWwpCiAgICAgICAgJENvbmRpdGlvbklEID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25BZGQoCiAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgICA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAkQ29uZGl0aW9uTmFtZSwKICAgICAgICAgICAgRXhwcmVzc2lvbkNvbmp1bmN0aW9uID0+ICdhbGwnLAogICAgICAgICAgICBWYWxpZElEICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ29uZGl0aW9uSUQsCiAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ29uZGl0aW9uQWRkIiwKICAgICAgICApOwoKICAgICAgICAjIGp1c3QgaW4gY2FzZSBpZiB0aGUgY29uZGl0aW9uIGNvdWxkIGJlIGFkZGVkCiAgICAgICAgaWYgKCRDb25kaXRpb25JRCkgewogICAgICAgICAgICBwdXNoIEBDb25kaXRpb25JRHMsICRDb25kaXRpb25JRDsKICAgICAgICB9CiAgICB9Cn0KCiMgY29uZGl0aW9uIGxpc3QgdGVzdApDSEFOR0VJRDoKZm9yIG15ICRDaGFuZ2VJRCAoIGtleXMgJUNvbmRpdGlvbkNvdW50ICkgewoKICAgICMgZ2V0IGNvbmRpdGlvbiBsaXN0CiAgICBteSAkQ29uZGl0aW9uSURzUmVmID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25MaXN0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBWYWxpZCAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskQ29uZGl0aW9uSURzUmVmfSwKICAgICAgICAkQ29uZGl0aW9uQ291bnR7JENoYW5nZUlEfSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvbkxpc3QgLT4gTnVtYmVyIG9mIGNvbmRpdGlvbnMgZm9yIENoYW5nZUlEOiAkQ2hhbmdlSUQiLAogICAgKTsKCiAgICAjIGlmIG5vIGNvbmRpdGlvbnMgZXhpc3QgZm9yIHRoaXMgY2hhbmdlCiAgICBuZXh0IENIQU5HRUlEIGlmICFAeyRDb25kaXRpb25JRHNSZWZ9OwoKICAgICMgc2V0IHRoZSBmaXJzdCBjb25kaXRpb24gb2YgdGhlIGN1cnJlbnQgY2hhbmdlIGludmFsaWQKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25VcGRhdGUoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklEc1JlZi0+WzBdLAogICAgICAgIFZhbGlkSUQgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAjIGludmFsaWQKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvblVwZGF0ZSAtPiBDb25kaXRpb25JRDogJENvbmRpdGlvbklEc1JlZi0+WzBdIiwKICAgICk7CgogICAgIyBnZXQgY29uZGl0aW9uIGxpc3QgYWdhaW4KICAgICRDb25kaXRpb25JRHNSZWYgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkNvbmRpdGlvbkxpc3QoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFZhbGlkICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRDb25kaXRpb25JRHNSZWZ9LAogICAgICAgICRDb25kaXRpb25Db3VudHskQ2hhbmdlSUR9IC0gMSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIENvbmRpdGlvbkxpc3QgLT4gTnVtYmVyIG9mIGNvbmRpdGlvbnMgZm9yIENoYW5nZUlEOiAkQ2hhbmdlSUQiLAogICAgKTsKCiAgICAjIGdldCBjb25kaXRpb24gbGlzdCBhZ2FpbiwgYnV0IG5vdyB3aXRoIGFsc28gdGhlIGludmFsaWQgY29uZGl0aW9ucwogICAgJENvbmRpdGlvbklEc1JlZiA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uTGlzdCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVmFsaWQgICAgPT4gMCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7JENvbmRpdGlvbklEc1JlZn0sCiAgICAgICAgJENvbmRpdGlvbkNvdW50eyRDaGFuZ2VJRH0sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25MaXN0IC0+IE51bWJlciBvZiBjb25kaXRpb25zIGZvciBDaGFuZ2VJRDogJENoYW5nZUlEIiwKICAgICk7Cgp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY29uZGl0aW9uIG9iamVjdCB0ZXN0cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGNoZWNrIGZvciBkZWZhdWx0IGNvbmRpdGlvbiBvYmplY3RzCm15IEBDb25kaXRpb25PYmplY3RzID0gcXcoSVRTTUNoYW5nZSBJVFNNV29ya09yZGVyKTsKCiMgY2hlY2sgY29uZGl0aW9uIG9iamVjdHMKZm9yIG15ICRDb25kaXRpb25PYmplY3QgKEBDb25kaXRpb25PYmplY3RzKSB7CgogICAgIyBtYWtlIGxvb2t1cCB0byBnZXQgb2JqZWN0IGlkCiAgICBteSAkT2JqZWN0SUQgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdExvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJENvbmRpdGlvbk9iamVjdCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICkgfHwgJyc7CgogICAgIyBjaGVjayBvbiByZXR1cm4gdmFsdWUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRPYmplY3RJRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9iamVjdExvb2t1cCBvbiAnJENvbmRpdGlvbk9iamVjdCcgLT4gT2JqZWN0SUQ6ICRPYmplY3RJRCIsCiAgICApOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhIHdpdGggb2JqZWN0IGlkCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T2JqZWN0R2V0KAogICAgICAgIE9iamVjdElEID0+ICRPYmplY3RJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIHJldHVybiBwYXJhbWV0ZXJzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJE9iamVjdERhdGEtPntOYW1lfSwKICAgICAgICAkQ29uZGl0aW9uT2JqZWN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gT2JqZWN0R2V0KCkgbmFtZSBjaGVjaycsCiAgICApOwp9CgojIGNoZWNrIGZvciBvYmplY3QgYWRkCm15IEBDb25kaXRpb25PYmplY3RDcmVhdGVkOwpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgIyBhZGQgbmV3IG9iamVjdHMKICAgIG15ICRPYmplY3RJRCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T2JqZWN0QWRkKAogICAgICAgIE5hbWUgICA9PiAnT2JqZWN0TmFtZScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBvbiByZXR1cm4gdmFsdWUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRPYmplY3RJRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9iamVjdEFkZCAtPiBPYmplY3RJRDogJE9iamVjdElEIiwKICAgICk7CgogICAgIyBzYXZlIG9iamVjdCBpZCBmb3IgZGVsZXRlIHRlc3QKICAgIHB1c2ggQENvbmRpdGlvbk9iamVjdENyZWF0ZWQsICRPYmplY3RJRDsKfQoKIyBjaGVjayBjb25kaXRpb24gb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdExpc3QoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY2hlY2sgZm9yIG9iamVjdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJE9iamVjdExpc3QsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9iamVjdExpc3QgaXMgbm90IGVtcHR5IiwKKTsKCiMgY2hlY2sgZm9yIG9iamVjdCBsaXN0IGFzIGhhc2ggcmVmCiRTZWxmLT5JcygKICAgIHJlZiAkT2JqZWN0TGlzdCwKICAgICdIQVNIJywKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT2JqZWN0TGlzdCB0eXBlIiwKKTsKCiMgY2hlY2sgdXBkYXRlIG9mIGNvbmRpdGlvbiBvYmplY3QKbXkgJENvbmRpdGlvbk9iamVjdE5ld05hbWUgPSAnVW5pdFRlc3RVcGRhdGUnIC4gaW50IHJhbmQgMV8wMDBfMDAwOwokU2VsZi0+VHJ1ZSgKICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T2JqZWN0VXBkYXRlKAogICAgICAgIE9iamVjdElEID0+ICRDb25kaXRpb25PYmplY3RDcmVhdGVkWzBdLAogICAgICAgIE5hbWUgICAgID0+ICRDb25kaXRpb25PYmplY3ROZXdOYW1lLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBPYmplY3RVcGRhdGUiLAopOwpteSAkQ29uZGl0aW9uT2JqZWN0VXBkYXRlID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5PYmplY3RHZXQoCiAgICBPYmplY3RJRCA9PiAkQ29uZGl0aW9uT2JqZWN0Q3JlYXRlZFswXSwKICAgIFVzZXJJRCAgID0+IDEsCik7CiRTZWxmLT5JcygKICAgICRDb25kaXRpb25PYmplY3RVcGRhdGUtPntOYW1lfSwKICAgICRDb25kaXRpb25PYmplY3ROZXdOYW1lLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBPYmplY3RVcGRhdGUgdmVyaWZ5IHVwZGF0ZSIsCik7CgojIGNoZWNrIGZvciBvYmplY3QgZGVsZXRlCmZvciBteSAkT2JqZWN0SUQgKEBDb25kaXRpb25PYmplY3RDcmVhdGVkKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdERlbGV0ZSgKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJE9iamVjdElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICksCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBPYmplY3REZWxldGUgLT4gT2JqZWN0SUQ6ICRPYmplY3RJRCIsCiAgICApOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNvbmRpdGlvbiBhdHRyaWJ1dGVzIHRlc3RzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGNoZWNrIGZvciBkZWZhdWx0IGNvbmRpdGlvbiBhdHRyaWJ1dGVzCm15IEBDb25kaXRpb25BdHRyaWJ1dGVzID0gcXcoCiAgICBDaGFuZ2VUaXRsZSAgICAgIENhdGVnb3J5SUQgICAgICBJbXBhY3RJRCBQcmlvcml0eUlEIFBsYW5uZWRFZmZvcnQgICAgQWNjb3VudGVkVGltZQogICAgQ2hhbmdlTWFuYWdlcklEICBDaGFuZ2VCdWlsZGVySUQgV29ya09yZGVyQWdlbnRJRAogICAgV29ya09yZGVyVGl0bGUgICBXb3JrT3JkZXJOdW1iZXIgV29ya09yZGVyU3RhdGVJRCAgICBXb3JrT3JkZXJUeXBlSUQKICAgIFBsYW5uZWRTdGFydFRpbWUgUGxhbm5lZEVuZFRpbWUgIEFjdHVhbFN0YXJ0VGltZSAgICAgQWN0dWFsRW5kVGltZQopOwoKIyBjaGVjayBjb25kaXRpb24gYXR0cmlidXRlcwpmb3IgbXkgJENvbmRpdGlvbkF0dHJpYnV0ZSAoQENvbmRpdGlvbkF0dHJpYnV0ZXMpIHsKCiAgICAjIG1ha2UgbG9va3VwIHRvIGdldCBhdHRyaWJ1dGUgaWQKICAgIG15ICRBdHRyaWJ1dGVJRCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+QXR0cmlidXRlTG9va3VwKAogICAgICAgIE5hbWUgPT4gJENvbmRpdGlvbkF0dHJpYnV0ZSwKICAgICkgfHwgJyc7CgogICAgIyBjaGVjayBvbiByZXR1cm4gdmFsdWUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBdHRyaWJ1dGVJRCwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIiAtIEF0dHJpYnV0ZUxvb2t1cCBvbiAnJENvbmRpdGlvbkF0dHJpYnV0ZScgLT4gQXR0cmlidXRlSUQ6ICRBdHRyaWJ1dGVJRCciLAogICAgKTsKCiAgICAjIGdldCBhdHRyaWJ1dGUgZGF0YSB3aXRoIGF0dHJpYnV0ZSBpZAogICAgbXkgJEF0dHJpYnV0ZURhdGEgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkF0dHJpYnV0ZUdldCgKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRBdHRyaWJ1dGVJRCwKICAgICk7CgogICAgIyBjaGVjayByZXR1cm4gcGFyYW1ldGVycwogICAgJFNlbGYtPklzKAogICAgICAgICRBdHRyaWJ1dGVEYXRhLT57TmFtZX0sCiAgICAgICAgJENvbmRpdGlvbkF0dHJpYnV0ZSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIEF0dHJpYnV0ZUdldCgpIG5hbWUgY2hlY2snLAogICAgKTsKfQoKIyBjaGVjayBmb3Igb2JqZWN0IGFkZApteSBAQ29uZGl0aW9uQXR0cmlidXRlQ3JlYXRlZDsKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgYWRkIG5ldyBvYmplY3RzCiAgICBteSAkQXR0cmlidXRlSUQgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkF0dHJpYnV0ZUFkZCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBOYW1lICAgPT4gJ0F0dHJpYnV0ZU5hbWUnIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICApOwoKICAgICMgY2hlY2sgb24gcmV0dXJuIHZhbHVlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXR0cmlidXRlSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBdHRyaWJ1dGVBZGQgLT4gQXR0cmlidXRlSUQ6ICRBdHRyaWJ1dGVJRCIsCiAgICApOwoKICAgICMgc2F2ZSBvYmplY3QgaXQgZm9yIGRlbGV0ZSB0ZXN0CiAgICBwdXNoIEBDb25kaXRpb25BdHRyaWJ1dGVDcmVhdGVkLCAkQXR0cmlidXRlSUQ7Cn0KCiMgY2hlY2sgY29uZGl0aW9uIGF0dHJpYnV0ZSBsaXN0Cm15ICRBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BdHRyaWJ1dGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIGZvciBhdHRyaWJ1dGUgbGlzdAokU2VsZi0+VHJ1ZSgKICAgICRBdHRyaWJ1dGVMaXN0LAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBdHRyaWJ1dGVMaXN0IGlzIG5vdCBlbXB0eSIsCik7CgojIGNoZWNrIGZvciBhdHRyaWJ1dGUgbGlzdCBhcyBoYXNoIHJlZgokU2VsZi0+SXMoCiAgICByZWYgJEF0dHJpYnV0ZUxpc3QsCiAgICAnSEFTSCcsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEF0dHJpYnV0ZUxpc3QgdHlwZSIsCik7CgojIGNoZWNrIHVwZGF0ZSBvZiBhdHRyaWJ1dGUgb2JqZWN0Cm15ICRDb25kaXRpb25BdHRyaWJ1dGVOZXdOYW1lID0gJ1VuaXRUZXN0VXBkYXRlJyAuIGludCByYW5kIDFfMDAwXzAwMDsKJFNlbGYtPlRydWUoCiAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkF0dHJpYnV0ZVVwZGF0ZSgKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIEF0dHJpYnV0ZUlEID0+ICRDb25kaXRpb25BdHRyaWJ1dGVDcmVhdGVkWzBdLAogICAgICAgIE5hbWUgICAgICAgID0+ICRDb25kaXRpb25BdHRyaWJ1dGVOZXdOYW1lLAogICAgKSwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQXR0cmlidXRlVXBkYXRlIiwKKTsKbXkgJENvbmRpdGlvbkF0dHJpYnV0ZVVwZGF0ZSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+QXR0cmlidXRlR2V0KAogICAgVXNlcklEICAgICAgPT4gMSwKICAgIEF0dHJpYnV0ZUlEID0+ICRDb25kaXRpb25BdHRyaWJ1dGVDcmVhdGVkWzBdLAopOwokU2VsZi0+SXMoCiAgICAkQ29uZGl0aW9uQXR0cmlidXRlVXBkYXRlLT57TmFtZX0sCiAgICAkQ29uZGl0aW9uQXR0cmlidXRlTmV3TmFtZSwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQXR0cmlidXRlVXBkYXRlIHZlcmlmeSB1cGRhdGUiLAopOwoKIyBjaGVjayBmb3IgYXR0cmlidXRlIGRlbGV0ZQpmb3IgbXkgJEF0dHJpYnV0ZUlEIChAQ29uZGl0aW9uQXR0cmlidXRlQ3JlYXRlZCkgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BdHRyaWJ1dGVEZWxldGUoCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+ICRBdHRyaWJ1dGVJRCwKICAgICAgICApLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQXR0cmlidXRlRGVsZXRlIC0+IEF0dHJpYnV0ZUlEOiAkQXR0cmlidXRlSUQiLAogICAgKTsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBjb25kaXRpb24gb3BlcmF0b3IgdGVzdHMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgY2hlY2sgZm9yIGRlZmF1bHQgY29uZGl0aW9uIG9wZXJhdG9ycwpteSBAQ29uZGl0aW9uT3BlcmF0b3JzID0gKAoKICAgICMgY29tbW9uIG1hdGNoaW5nCiAgICAnaXMnLCAnaXMgbm90JywgJ2lzIGVtcHR5JywgJ2lzIG5vdCBlbXB0eScsCgogICAgIyBkaWdpdCBtYXRjaGluZwogICAgJ2lzIGdyZWF0ZXIgdGhhbicsICdpcyBsZXNzIHRoYW4nLAoKICAgICMgZGF0ZSBtYXRjaGluZwogICAgJ2lzIGJlZm9yZScsICdpcyBhZnRlcicsCgogICAgIyBzdHJpbmcgbWF0Y2hpbmcKICAgICdjb250YWlucycsICdub3QgY29udGFpbnMnLCAnYmVnaW5zIHdpdGgnLCAnZW5kcyB3aXRoJywKCiAgICAjIGFjdGlvbiBvcGVyYXRvcgogICAgJ3NldCcsICdsb2NrJywKKTsKCiMgY2hlY2sgY29uZGl0aW9uIG9wZXJhdG9ycwpmb3IgbXkgJENvbmRpdGlvbk9wZXJhdG9yIChAQ29uZGl0aW9uT3BlcmF0b3JzKSB7CgogICAgIyBtYWtlIGxvb2t1cCB0byBnZXQgb3BlcmF0b3IgaWQKICAgIG15ICRPcGVyYXRvcklEID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5PcGVyYXRvckxvb2t1cCggTmFtZSA9PiAkQ29uZGl0aW9uT3BlcmF0b3IgKSB8fCAnJzsKCiAgICAjIGNoZWNrIG9uIHJldHVybiB2YWx1ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE9wZXJhdG9ySUQsCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICIgLSBPcGVyYXRvckxvb2t1cCBvbiAnJENvbmRpdGlvbk9wZXJhdG9yJyAtPiBPcGVyYXRvcklEOiAkT3BlcmF0b3JJRCIsCiAgICApOwoKICAgICMgZ2V0IG9wZXJhdG9yIGRhdGEgd2l0aCBvcGVyYXRvciBpZAogICAgbXkgJE9wZXJhdG9yRGF0YSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T3BlcmF0b3JHZXQoCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIE9wZXJhdG9ySUQgPT4gJE9wZXJhdG9ySUQsCiAgICApOwoKICAgICMgY2hlY2sgcmV0dXJuIHBhcmFtZXRlcnMKICAgICRTZWxmLT5JcygKICAgICAgICAkT3BlcmF0b3JEYXRhLT57TmFtZX0sCiAgICAgICAgJENvbmRpdGlvbk9wZXJhdG9yLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gT3BlcmF0b3JHZXQoKSBuYW1lIGNoZWNrJywKICAgICk7Cn0KCiMgY2hlY2sgZm9yIG9iamVjdCBhZGQKbXkgQENvbmRpdGlvbk9wZXJhdG9yQ3JlYXRlZDsKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgYWRkIG5ldyBvYmplY3RzCiAgICBteSAkT3BlcmF0b3JJRCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T3BlcmF0b3JBZGQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgTmFtZSAgID0+ICdPcGVyYXRvck5hbWUnIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICApOwoKICAgICMgY2hlY2sgb24gcmV0dXJuIHZhbHVlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkT3BlcmF0b3JJRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9wZXJhdG9yQWRkIC0+IE9wZXJhdG9ySUQ6ICRPcGVyYXRvcklEIiwKICAgICk7CgogICAgIyBzYXZlIG9iamVjdCBpdCBmb3IgZGVsZXRlIHRlc3QKICAgIHB1c2ggQENvbmRpdGlvbk9wZXJhdG9yQ3JlYXRlZCwgJE9wZXJhdG9ySUQ7Cn0KCiMgY2hlY2sgY29uZGl0aW9uIG9wZXJhdG9yIGxpc3QKbXkgJE9wZXJhdG9yTGlzdCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T3BlcmF0b3JMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGNoZWNrIGZvciBvcGVyYXRvciBsaXN0CiRTZWxmLT5UcnVlKAogICAgJE9wZXJhdG9yTGlzdCwKICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT3BlcmF0b3JMaXN0IGlzIG5vdCBlbXB0eSIsCik7CgojIGNoZWNrIGZvciBvcGVyYXRvciBsaXN0IGFzIGhhc2ggcmVmCiRTZWxmLT5JcygKICAgIHJlZiAkT3BlcmF0b3JMaXN0LAogICAgJ0hBU0gnLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBPcGVyYXRvckxpc3QgdHlwZSIsCik7CgojIGNoZWNrIHVwZGF0ZSBvZiBvcGVyYXRvciBvYmplY3QKbXkgJENvbmRpdGlvbk9wZXJhdG9yTmV3TmFtZSA9ICdVbml0VGVzdFVwZGF0ZScgLiBpbnQgcmFuZCAxXzAwMF8wMDA7CiRTZWxmLT5UcnVlKAogICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5PcGVyYXRvclVwZGF0ZSgKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgT3BlcmF0b3JJRCA9PiAkQ29uZGl0aW9uT3BlcmF0b3JDcmVhdGVkWzBdLAogICAgICAgIE5hbWUgICAgICAgPT4gJENvbmRpdGlvbk9wZXJhdG9yTmV3TmFtZSwKICAgICksCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIE9wZXJhdG9yVXBkYXRlIiwKKTsKbXkgJENvbmRpdGlvbk9wZXJhdG9yVXBkYXRlID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5PcGVyYXRvckdldCgKICAgIFVzZXJJRCAgICAgPT4gMSwKICAgIE9wZXJhdG9ySUQgPT4gJENvbmRpdGlvbk9wZXJhdG9yQ3JlYXRlZFswXSwKKTsKJFNlbGYtPklzKAogICAgJENvbmRpdGlvbk9wZXJhdG9yVXBkYXRlLT57TmFtZX0sCiAgICAkQ29uZGl0aW9uT3BlcmF0b3JOZXdOYW1lLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBPcGVyYXRvclVwZGF0ZSB2ZXJpZnkgdXBkYXRlIiwKKTsKCiMgY2hlY2sgZm9yIG9wZXJhdG9yIGRlbGV0ZQpmb3IgbXkgJE9wZXJhdG9ySUQgKEBDb25kaXRpb25PcGVyYXRvckNyZWF0ZWQpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+T3BlcmF0b3JEZWxldGUoCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiAkT3BlcmF0b3JJRCwKICAgICAgICApLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gT3BlcmF0b3JEZWxldGUgLT4gT3BlcmF0b3JJRDogJE9wZXJhdG9ySUQiLAogICAgKTsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBjb25kaXRpb24gZXhwcmVzc2lvbiB0ZXN0cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBjaGVjayBmb3IgZGVmYXVsdCBjb25kaXRpb24gZXhwcmVzc2lvbnMKbXkgQEV4cHJlc3Npb25UZXN0cyA9ICgKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMCwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ0R1bW15Q29tcGFyZVZhbHVlMScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlTWFuYWdlcklEJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnRHVtbXlDb21wYXJlVmFsdWUxJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzIG5vdCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzFdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICdEdW1teUNvbXBhcmVWYWx1ZTInLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cHJlc3Npb25VcGRhdGUgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ05ld0R1bW15Q29tcGFyZVZhbHVlJyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgbm90JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMV0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJFdvcmtPcmRlclRpdGxlc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHByZXNzaW9uVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgZ3JlYXRlciB0aGFuJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzFdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJ0R1bW15Q29tcGFyZVZhbHVlMicsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwcmVzc2lvblVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBTZWxlY3RvciA9PiAkV29ya09yZGVySURzWzFdLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJENoYW5nZVRpdGxlc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgbm90JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJENoYW5nZVRpdGxlc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYW5nZVRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgbm90JywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJENoYW5nZVRpdGxlc1swXSAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAnYWxsJywKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzhdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAnYW55JywKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBlbXB0eScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRXb3JrT3JkZXJUaXRsZXNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ2lzIG5vdCBlbXB0eScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRXb3JrT3JkZXJUaXRsZXNbMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JrT3JkZXJOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBncmVhdGVyIHRoYW4nLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgZ3JlYXRlciB0aGFuJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gMV8wMDBfMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgbGVzcyB0aGFuJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gMV8wMDBfMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgbGVzcyB0aGFuJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpICsgMTAgKSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMCwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZUJlZm9yZUFkZGluZywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBNYXRjaFN1Y2Nlc3MgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICAgPT4gewogICAgICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMgYWZ0ZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lQmVmb3JlQWRkaW5nLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYW5uZWRTdGFydFRpbWUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdpcyBhZnRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkgKyAxMCApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdjb250YWlucycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+IHN1YnN0ciggJFdvcmtPcmRlclRpdGxlc1swXSwgLTQgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnY29udGFpbnMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAkV29ya09yZGVyVGl0bGVzWzBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdjb250YWlucycsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCAgPT4gJENvbmRpdGlvbklEc1syXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgICA9PiAkV29ya09yZGVySURzWzBdLAogICAgICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICdOb3QgQSBWYWxpZCBWYWx1ZSAnIC4gaW50IHJhbmQgMV8wMDBfMDAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdub3QgY29udGFpbnMnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiAnTm90IEEgVmFsaWQgVmFsdWUgJyAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnbm90IGNvbnRhaW5zJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gJFdvcmtPcmRlclRpdGxlc1swXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnYmVnaW5zIHdpdGgnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBzdWJzdHIoICRXb3JrT3JkZXJUaXRsZXNbMF0sIDAsIDQgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnYmVnaW5zIHdpdGgnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBzdWJzdHIoICRXb3JrT3JkZXJUaXRsZXNbMF0sIDEgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE1hdGNoU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICA9PiB7CiAgICAgICAgICAgIEV4cHJlc3Npb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIE9wZXJhdG9ySUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnZW5kcyB3aXRoJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEICA9PiAkQ29uZGl0aW9uSURzWzJdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgID0+ICRXb3JrT3JkZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDb21wYXJlVmFsdWUgPT4gc3Vic3RyKCAkV29ya09yZGVyVGl0bGVzWzBdLCAtNCApLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTWF0Y2hTdWNjZXNzID0+IDAsCiAgICAgICAgU291cmNlRGF0YSAgID0+IHsKICAgICAgICAgICAgRXhwcmVzc2lvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV29ya09yZGVyVGl0bGUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdlbmRzIHdpdGgnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgID0+ICRDb25kaXRpb25JRHNbMl0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIENvbXBhcmVWYWx1ZSA9PiBzdWJzdHIoICRXb3JrT3JkZXJUaXRsZXNbMF0sIDEsIDMgKSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAopOwoKIyBjaGVjayBjb25kaXRpb24gZXhwcmVzc2lvbnMKbXkgQEV4cHJlc3Npb25JRHM7CkVYUFJFU1NJT05URVNUOgpmb3IgbXkgJEV4cHJlc3Npb25UZXN0IChARXhwcmVzc2lvblRlc3RzKSB7CgogICAgIyBzdG9yZSBkYXRhIG9mIHRlc3QgY2FzZXMgbG9jYWxseQogICAgbXkgJVNvdXJjZURhdGE7CiAgICBteSAkRXhwcmVzc2lvbklEOwogICAgbXkgJUV4cHJlc3Npb25BZGRTb3VyY2VEYXRhOwogICAgbXkgJUV4cHJlc3Npb25BZGREYXRhOwoKICAgICMgZXh0cmFjdCBzb3VyY2UgZGF0YQogICAgaWYgKCAkRXhwcmVzc2lvblRlc3QtPntTb3VyY2VEYXRhfSApIHsKICAgICAgICAlU291cmNlRGF0YSA9ICV7ICRFeHByZXNzaW9uVGVzdC0+e1NvdXJjZURhdGF9IH07CiAgICB9CgogICAgbmV4dCBFWFBSRVNTSU9OVEVTVCBpZiAhJVNvdXJjZURhdGE7CgogICAgQ1JFQVRFREFUQToKICAgIGZvciBteSAkQ3JlYXRlRGF0YSAoIGtleXMgJVNvdXJjZURhdGEgKSB7CgogICAgICAgICMgYWRkIGV4cHJlc3Npb24KICAgICAgICBpZiAoICRDcmVhdGVEYXRhIGVxICdFeHByZXNzaW9uQWRkJyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCBFeHByZXNzaW9uQWRkIGRhdGEKICAgICAgICAgICAgJUV4cHJlc3Npb25BZGRTb3VyY2VEYXRhID0gJXsgJFNvdXJjZURhdGF7JENyZWF0ZURhdGF9IH07CgogICAgICAgICAgICAjIHNldCBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgIG15IEBTdGF0aWNGaWVsZHMgPSBxdyggU2VsZWN0b3IgQ29tcGFyZVZhbHVlIFVzZXJJRCBDb25kaXRpb25JRCApOwoKICAgICAgICAgICAgU1RBVElDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkU3RhdGljRmllbGQgKEBTdGF0aWNGaWVsZHMpIHsKCiAgICAgICAgICAgICAgICAjIG9tbWl0IHN0YXRpYyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0CiAgICAgICAgICAgICAgICBuZXh0IFNUQVRJQ0ZJRUxEIGlmICFleGlzdHMgJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRTdGF0aWNGaWVsZH0KICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWRlZmluZWQgJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRTdGF0aWNGaWVsZH07CgogICAgICAgICAgICAgICAgIyBzYWZlIGRhdGEKICAgICAgICAgICAgICAgICRFeHByZXNzaW9uQWRkRGF0YXskU3RhdGljRmllbGR9ID0gJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRTdGF0aWNGaWVsZH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFsbCBmaWVsZHMgZm9yIEV4cHJlc3Npb25BZGQKICAgICAgICAgICAgZm9yIG15ICRFeHByZXNzaW9uQWRkVmFsdWUgKCBrZXlzICVFeHByZXNzaW9uQWRkU291cmNlRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIG9tbWl0IHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIG5leHQgaWYgZ3JlcCB7ICRfIGVxICRFeHByZXNzaW9uQWRkVmFsdWUgfSBAU3RhdGljRmllbGRzOwoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBmb3IgZmllbGRzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkVmFsdWUgKCBrZXlzICV7ICRFeHByZXNzaW9uQWRkU291cmNlRGF0YXskRXhwcmVzc2lvbkFkZFZhbHVlfSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIGdhdGhlcmVkIGluZm9ybWF0aW9uIGluIGhhc2ggZm9yIGFkZGluZwogICAgICAgICAgICAgICAgICAgICRFeHByZXNzaW9uQWRkRGF0YXskRXhwcmVzc2lvbkFkZFZhbHVlfSA9CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+JEZpZWxkVmFsdWUoCiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRFeHByZXNzaW9uQWRkU291cmNlRGF0YXskRXhwcmVzc2lvbkFkZFZhbHVlfS0+eyRGaWVsZFZhbHVlfSB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBleHByZXNzaW9uCiAgICAgICAgICAgICRFeHByZXNzaW9uSUQgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25BZGQoCiAgICAgICAgICAgICAgICAlRXhwcmVzc2lvbkFkZERhdGEsCiAgICAgICAgICAgICkgfHwgMDsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gJENyZWF0ZURhdGEgLT4gJEV4cHJlc3Npb25JRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENSRUFURURBVEEgaWYgISRFeHByZXNzaW9uSUQ7CgogICAgICAgICAgICAjIHNhdmUgY3JlYXRlZCBJRCBmb3IgZGVsZXRpbmcgZXhwcmVzc2lvbnMKICAgICAgICAgICAgcHVzaCBARXhwcmVzc2lvbklEcywgJEV4cHJlc3Npb25JRDsKCiAgICAgICAgICAgICMgY2hlY2sgdGhlIGFkZGVkIGV4cHJlc3Npb24KICAgICAgICAgICAgbXkgJEV4cHJlc3Npb25HZXREYXRhID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5FeHByZXNzaW9uR2V0KAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJEV4cHJlc3Npb25BZGREYXRhe1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLAogICAgICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBFeHByZXNzaW9uQWRkKCk6IEV4cHJlc3Npb25HZXQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0ZXN0IHZhbHVlcwogICAgICAgICAgICBkZWxldGUgJEV4cHJlc3Npb25BZGREYXRhe1VzZXJJRH07CiAgICAgICAgICAgIGZvciBteSAkVGVzdFZhbHVlICgga2V5cyAlRXhwcmVzc2lvbkFkZERhdGEgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLT57JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgJEV4cHJlc3Npb25BZGREYXRheyRUZXN0VmFsdWV9LAogICAgICAgICAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gRXhwcmVzc2lvbkFkZCgpOiBFeHByZXNzaW9uR2V0IC0+ICRUZXN0VmFsdWUiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0gICAgIyBlbmQgaWYgKCAkQ3JlYXRlRGF0YSBlcSAnRXhwcmVzc2lvbkFkZCcgKQoKICAgICAgICAjIHVwZGF0ZSBleHByZXNzaW9uCiAgICAgICAgaWYgKCAkQ3JlYXRlRGF0YSBlcSAnRXhwcmVzc2lvblVwZGF0ZScgKSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgRXhwcmVzc2lvblVwZGF0ZSBkYXRhCiAgICAgICAgICAgIG15ICVFeHByZXNzaW9uVXBkYXRlU291cmNlRGF0YSA9ICV7ICRTb3VyY2VEYXRheyRDcmVhdGVEYXRhfSB9OwogICAgICAgICAgICBteSAlRXhwcmVzc2lvblVwZGF0ZURhdGE7CgogICAgICAgICAgICAjIHNldCBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgIG15IEBTdGF0aWNGaWVsZHMgPSBxdyggU2VsZWN0b3IgQ29tcGFyZVZhbHVlIFVzZXJJRCBDb25kaXRpb25JRCApOwoKICAgICAgICAgICAgU1RBVElDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkU3RhdGljRmllbGQgKEBTdGF0aWNGaWVsZHMpIHsKCiAgICAgICAgICAgICAgICAjIG9tbWl0IHN0YXRpYyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0CiAgICAgICAgICAgICAgICBuZXh0IFNUQVRJQ0ZJRUxEIGlmICEkRXhwcmVzc2lvblVwZGF0ZVNvdXJjZURhdGF7JFN0YXRpY0ZpZWxkfTsKCiAgICAgICAgICAgICAgICAjIHNhZmUgZGF0YQogICAgICAgICAgICAgICAgJEV4cHJlc3Npb25VcGRhdGVEYXRheyRTdGF0aWNGaWVsZH0gPSAkRXhwcmVzc2lvblVwZGF0ZVNvdXJjZURhdGF7JFN0YXRpY0ZpZWxkfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWxsIGZpZWxkcyBmb3IgRXhwcmVzc2lvblVwZGF0ZQogICAgICAgICAgICBmb3IgbXkgJEV4cHJlc3Npb25VcGRhdGVWYWx1ZSAoIGtleXMgJUV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRhICkgewoKICAgICAgICAgICAgICAgICMgb21taXQgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgbmV4dCBpZiBncmVwIHsgJF8gZXEgJEV4cHJlc3Npb25VcGRhdGVWYWx1ZSB9IEBTdGF0aWNGaWVsZHM7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWVzIGZvciBmaWVsZHMKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRWYWx1ZSAoIGtleXMgJXsgJEV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRheyRFeHByZXNzaW9uVXBkYXRlVmFsdWV9IH0gKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIHN0b3JlIGdhdGhlcmVkIGluZm9ybWF0aW9uIGluIGhhc2ggZm9yIHVwZGF0aW5nCiAgICAgICAgICAgICAgICAgICAgJEV4cHJlc3Npb25VcGRhdGVEYXRheyRFeHByZXNzaW9uVXBkYXRlVmFsdWV9ID0KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT4kRmllbGRWYWx1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJEV4cHJlc3Npb25VcGRhdGVTb3VyY2VEYXRheyRFeHByZXNzaW9uVXBkYXRlVmFsdWV9LT57JEZpZWxkVmFsdWV9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXBkYXRlIGV4cHJlc3Npb24KICAgICAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25VcGRhdGUoCiAgICAgICAgICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgICVFeHByZXNzaW9uVXBkYXRlRGF0YSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtICRDcmVhdGVEYXRhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ1JFQVRFREFUQSBpZiAhJFVwZGF0ZVN1Y2Nlc3M7CgogICAgICAgICAgICAjIGNoZWNrIHRoZSBhZGRlZCBleHByZXNzaW9uCiAgICAgICAgICAgIG15ICRFeHByZXNzaW9uR2V0RGF0YSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbkdldCgKICAgICAgICAgICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRFeHByZXNzaW9uVXBkYXRlRGF0YXtVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRFeHByZXNzaW9uR2V0RGF0YSwKICAgICAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gRXhwcmVzc2lvblVwZGF0ZSgpOiBFeHByZXNzaW9uR2V0JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWVyZ2UgYWRkIGFuZCB1cGRhdGUgZGF0YQogICAgICAgICAgICAlRXhwcmVzc2lvblVwZGF0ZURhdGEgPSAoICVFeHByZXNzaW9uQWRkRGF0YSwgJUV4cHJlc3Npb25VcGRhdGVEYXRhICk7CgogICAgICAgICAgICAjIHRlc3QgdmFsdWVzCiAgICAgICAgICAgIGRlbGV0ZSAkRXhwcmVzc2lvblVwZGF0ZURhdGF7VXNlcklEfTsKICAgICAgICAgICAgZm9yIG15ICRUZXN0VmFsdWUgKCBrZXlzICVFeHByZXNzaW9uVXBkYXRlRGF0YSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkRXhwcmVzc2lvbkdldERhdGEtPnskVGVzdFZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAkRXhwcmVzc2lvblVwZGF0ZURhdGF7JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBFeHByZXNzaW9uVXBkYXRlKCk6IEV4cHJlc3Npb25HZXQgLT4gJFRlc3RWYWx1ZSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSAgICAjIGVuZCBpZiAoICRDcmVhdGVEYXRhIGVxICdFeHByZXNzaW9uVXBkYXRlJyApCiAgICB9Cn0KCiMgY2hlY2sgZm9yIGV4cHJlc3Npb24gbGlzdApDT05ESVRJT05JRDoKZm9yIG15ICRDb25kaXRpb25JRCAoQENvbmRpdGlvbklEcykgewoKICAgICMgY2hlY2sgZm9yIGV4cHJlc3Npb25zIG9mIHRoaXMgY29uZGl0aW9uIGlkCiAgICBteSAkRXhwcmVzc2lvblRlc3RDb3VudCA9IDA7CiAgICBFWFBSRVNTSU9OVEVTVDoKICAgIGZvciBteSAkRXhwcmVzc2lvblRlc3QgKEBFeHByZXNzaW9uVGVzdHMpIHsKCiAgICAgICAgIyBvbW1pdCB0ZXN0IGNhc2UgaWYgbm8gc291cmNlIGRhdGEgaXMgYXZhaWxhYmxlCiAgICAgICAgbmV4dCBFWFBSRVNTSU9OVEVTVCBpZiAhJEV4cHJlc3Npb25UZXN0LT57U291cmNlRGF0YX07CgogICAgICAgICMgb21taXQgdGVzdCBjYXNlIGlmIG5vIGV4cHJlc3Npb24gc2hvdWwgYmUgYWRkZWQKICAgICAgICBuZXh0IEVYUFJFU1NJT05URVNUIGlmICEkRXhwcmVzc2lvblRlc3QtPntTb3VyY2VEYXRhfS0+e0V4cHJlc3Npb25BZGR9OwoKICAgICAgICAkRXhwcmVzc2lvblRlc3RDb3VudCsrCiAgICAgICAgICAgIGlmICRFeHByZXNzaW9uVGVzdC0+e1NvdXJjZURhdGF9LT57RXhwcmVzc2lvbkFkZH0tPntDb25kaXRpb25JRH0gPT0gJENvbmRpdGlvbklEOwogICAgfQoKICAgIG15ICRFeHByZXNzaW9uTGlzdCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbkxpc3QoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICByZWYgJEV4cHJlc3Npb25MaXN0LAogICAgICAgICdBUlJBWScsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICcgLSBFeHByZXNzaW9uTGlzdCByZXR1cm4gdmFsdWUnLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBsaXN0IHR5cGUKICAgIG5leHQgQ09ORElUSU9OSUQgaWYgcmVmICRFeHByZXNzaW9uTGlzdCBuZSAnQVJSQVknOwoKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskRXhwcmVzc2lvbkxpc3R9LAogICAgICAgICRFeHByZXNzaW9uVGVzdENvdW50LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gRXhwcmVzc2lvbkxpc3QgLT4gJENvbmRpdGlvbklEIiwKICAgICk7Cn0KCiMgdGVzdCBmb3IgbWF0Y2hpbmcKZm9yIG15ICRFeHByZXNzaW9uQ291bnRlciAoIDAgLi4gKCBzY2FsYXIgQEV4cHJlc3Npb25JRHMgLSAxICkgKSB7CgogICAgbXkgJEV4cHJlc3Npb25JRCA9ICRFeHByZXNzaW9uSURzWyRFeHByZXNzaW9uQ291bnRlcl07CgogICAgIyBncm91cCByZWxhdGVkIHRlc3RzCiAgICAkVGVzdENvdW50Kys7CgogICAgIyBwcmludCBpbmZvIGFib3V0IHRoZSBtYXRjaCB0ZXN0OgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiTWF0Y2ggdGVzdCAkVGVzdENvdW50OiAiCiAgICAgICAgICAgIC4gIkV4cHJlc3Npb25Db3VudGVyID0+ICRFeHByZXNzaW9uQ291bnRlciwgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQiLAogICAgKTsKCiAgICAjIGdldCBvYmplY3QgdmFsdWUgZm9yIGF0dHJpYnV0ZXMKICAgIG15ICRPYmplY3ROYW1lCiAgICAgICAgPSAkRXhwcmVzc2lvblRlc3RzWyRFeHByZXNzaW9uQ291bnRlcl0tPntTb3VyY2VEYXRhfS0+e0V4cHJlc3Npb25BZGR9LT57T2JqZWN0SUR9CiAgICAgICAgLT57T2JqZWN0TG9va3VwfS0+e05hbWV9OwoKICAgICMgY2hlY2sgZm9yIHVwZGF0ZWQgb2JqZWN0CiAgICBpZiAoCiAgICAgICAgJEV4cHJlc3Npb25UZXN0c1skRXhwcmVzc2lvbkNvdW50ZXJdLT57U291cmNlRGF0YX0tPntFeHByZXNzaW9uVXBkYXRlfQogICAgICAgICYmICRFeHByZXNzaW9uVGVzdHNbJEV4cHJlc3Npb25Db3VudGVyXS0+e1NvdXJjZURhdGF9LT57RXhwcmVzc2lvblVwZGF0ZX0tPntPYmplY3RJRH0KICAgICAgICAtPntPYmplY3RMb29rdXB9LT57TmFtZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJE9iamVjdE5hbWUKICAgICAgICAgICAgPSAkRXhwcmVzc2lvblRlc3RzWyRFeHByZXNzaW9uQ291bnRlcl0tPntTb3VyY2VEYXRhfS0+e0V4cHJlc3Npb25VcGRhdGV9LT57T2JqZWN0SUR9CiAgICAgICAgICAgIC0+e09iamVjdExvb2t1cH0tPntOYW1lfTsKICAgIH0KCiAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZvciBhdHRyaWJ1dGVzCiAgICBteSAkQXR0cmlidXRlTmFtZQogICAgICAgID0gJEV4cHJlc3Npb25UZXN0c1skRXhwcmVzc2lvbkNvdW50ZXJdLT57U291cmNlRGF0YX0tPntFeHByZXNzaW9uQWRkfS0+e0F0dHJpYnV0ZUlEfQogICAgICAgIC0+e0F0dHJpYnV0ZUxvb2t1cH0tPntOYW1lfTsKCiAgICAjIGNoZWNrIGZvciB1cGRhdGVkIGF0dHJpYnV0ZQogICAgaWYgKAogICAgICAgICRFeHByZXNzaW9uVGVzdHNbJEV4cHJlc3Npb25Db3VudGVyXS0+e1NvdXJjZURhdGF9LT57RXhwcmVzc2lvblVwZGF0ZX0KICAgICAgICAmJiAkRXhwcmVzc2lvblRlc3RzWyRFeHByZXNzaW9uQ291bnRlcl0tPntTb3VyY2VEYXRhfS0+e0V4cHJlc3Npb25VcGRhdGV9LT57QXR0cmlidXRlSUR9CiAgICAgICAgLT57QXR0cmlidXRlTG9va3VwfS0+e05hbWV9CiAgICAgICAgKQogICAgewogICAgICAgICRBdHRyaWJ1dGVOYW1lCiAgICAgICAgICAgID0gJEV4cHJlc3Npb25UZXN0c1skRXhwcmVzc2lvbkNvdW50ZXJdLT57U291cmNlRGF0YX0tPntFeHByZXNzaW9uVXBkYXRlfS0+e0F0dHJpYnV0ZUlEfQogICAgICAgICAgICAtPntBdHRyaWJ1dGVMb29rdXB9LT57TmFtZX07CiAgICB9CgogICAgIyB0ZXN0IG9uIHN1Y2Nlc3NmdWwgcmVzdWx0CiAgICBpZiAoICRFeHByZXNzaW9uVGVzdHNbJEV4cHJlc3Npb25Db3VudGVyXS0+e01hdGNoU3VjY2Vzc30gKSB7CgogICAgICAgICMgdGVzdCB3aXRob3V0IGdpdmVuIGNoYW5nZWQgYXR0cmlidXRlcwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25NYXRjaCgKICAgICAgICAgICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50IC0gRXhwcmVzc2lvbk1hdGNoIHJldHVybiB0cnVlLCB3aXRob3V0IGNoYW5nZWQgYXR0cmlidXRlcyIsCiAgICAgICAgKTsKCiAgICAgICAgIyB0ZXN0IHdpdGggZ2l2ZW4gY2hhbmdlZCBhdHRyaWJ1dGVzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgJE9iamVjdE5hbWUgPT4gWyRBdHRyaWJ1dGVOYW1lXSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQgLSBFeHByZXNzaW9uTWF0Y2ggcmV0dXJuIHRydWUsIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIiwKICAgICAgICApOwoKICAgICAgICAjIHRlc3Qgd2l0aCB3cm9uZyBnaXZlbiBvYmplY3QgdHlwZSBvZiBjaGFuZ2VkIGF0dHJpYnV0ZXMKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEICAgICAgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNDaGFuZ2VkID0+IHsgJE9iamVjdE5hbWUgLiAnVVQnIC4gaW50IHJhbmQgMV8wMDAgPT4gWyRBdHRyaWJ1dGVOYW1lXSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQgLSBFeHByZXNzaW9uTWF0Y2ggcmV0dXJuIGZhbHNlLCB3cm9uZyBvYmplY3QgdHlwZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyB0ZXN0IHdpdGggd3JvbmcgZ2l2ZW4gYXR0cmlidXRlIHR5cGUgb2YgY2hhbmdlZCBhdHRyaWJ1dGVzCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25NYXRjaCgKICAgICAgICAgICAgICAgIEV4cHJlc3Npb25JRCAgICAgID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzQ2hhbmdlZCA9PiB7ICRPYmplY3ROYW1lID0+IFsgJEF0dHJpYnV0ZU5hbWUgLiAnVVQnIC4gaW50IHJhbmQgMV8wMDAgXSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQgLSBFeHByZXNzaW9uTWF0Y2ggcmV0dXJuIGZhbHNlLCB3cm9uZyBhdHRyaWJ1dGUgdHlwZSIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHRlc3Qgd2l0aG91dCBnaXZlbiBjaGFuZ2VkIGF0dHJpYnV0ZXMKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbk1hdGNoKAogICAgICAgICAgICAgICAgRXhwcmVzc2lvbklEID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQgLSBFeHByZXNzaW9uTWF0Y2ggcmV0dXJuIGZhbHNlLCB3aXRob3V0IGNoYW5nZWQgYXR0cmlidXRlcyIsCiAgICAgICAgKTsKCiAgICAgICAgIyB0ZXN0IHdpdGggZ2l2ZW4gY2hhbmdlZCBhdHRyaWJ1dGVzCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkV4cHJlc3Npb25NYXRjaCgKICAgICAgICAgICAgICAgIEV4cHJlc3Npb25JRCAgICAgID0+ICRFeHByZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzQ2hhbmdlZCA9PiB7ICRPYmplY3ROYW1lID0+IFskQXR0cmlidXRlTmFtZV0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50IC0gRXhwcmVzc2lvbk1hdGNoIHJldHVybiBmYWxzZSwgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMiLAogICAgICAgICk7CiAgICB9Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY29uZGl0aW9uIGV4cHJlc3Npb24gdGVzdHMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgY2hlY2sgZm9yIGRlZmF1bHQgY29uZGl0aW9uIGV4cHJlc3Npb25zCm15IEBBY3Rpb25UZXN0cyA9ICgKICAgIHsKICAgICAgICBBY3Rpb25TdWNjZXNzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgICA9PiB7CiAgICAgICAgICAgIEFjdGlvbkFkZCA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ3NldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklEc1sxXSwKICAgICAgICAgICAgICAgIFNlbGVjdG9yICAgID0+ICRDaGFuZ2VJRHNbMF0sCiAgICAgICAgICAgICAgICBBY3Rpb25WYWx1ZSA9PiAnTmV3IENoYW5nZSBUaXRsZScgLiBpbnQgcmFuZCAxXzAwMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQWN0aW9uU3VjY2VzcyA9PiAwLAogICAgICAgIFNvdXJjZURhdGEgICAgPT4gewogICAgICAgICAgICBBY3Rpb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnQ2hhbmdlU3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3JMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAjIHN0YXRpYyBmaWVsZHMKICAgICAgICAgICAgICAgIENvbmRpdGlvbklEID0+ICRDb25kaXRpb25JRHNbMV0sCiAgICAgICAgICAgICAgICBTZWxlY3RvciAgICA9PiAkQ2hhbmdlSURzWzBdLAogICAgICAgICAgICAgICAgQWN0aW9uVmFsdWUgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgQWN0aW9uU3VjY2VzcyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgICAgPT4gewogICAgICAgICAgICBBY3Rpb25BZGQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQXR0cmlidXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnQ2hhbmdlTWFuYWdlcklEJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnc2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSURzWzZdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJENoYW5nZUlEc1sxXSwKICAgICAgICAgICAgICAgIEFjdGlvblZhbHVlID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEFjdGlvblN1Y2Nlc3MgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICAgID0+IHsKICAgICAgICAgICAgQWN0aW9uQWRkID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ0lUU01Xb3JrT3JkZXInLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMb29rdXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICA9PiAnc2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICAgICBDb25kaXRpb25JRCA9PiAkQ29uZGl0aW9uSURzWzBdLAogICAgICAgICAgICAgICAgU2VsZWN0b3IgICAgPT4gJFdvcmtPcmRlcklEc1swXSwKICAgICAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICdOZXcgV29ya09yZGVyVGl0bGUgVGl0bGUnIC4gaW50IHJhbmQgMV8wMDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAopOwoKIyBjaGVjayBjb25kaXRpb24gYWN0aW9ucwpteSBAQWN0aW9uSURzOwpBQ1RJT05URVNUOgpmb3IgbXkgJEFjdGlvblRlc3QgKEBBY3Rpb25UZXN0cykgewoKICAgICMgc3RvcmUgZGF0YSBvZiB0ZXN0IGNhc2VzIGxvY2FsbHkKICAgIG15ICVTb3VyY2VEYXRhOwogICAgbXkgJEFjdGlvbklEOwoKICAgICMgZXh0cmFjdCBzb3VyY2UgZGF0YQogICAgaWYgKCAkQWN0aW9uVGVzdC0+e1NvdXJjZURhdGF9ICkgewogICAgICAgICVTb3VyY2VEYXRhID0gJXsgJEFjdGlvblRlc3QtPntTb3VyY2VEYXRhfSB9OwogICAgfQoKICAgICMgY2hlY2sgZm9yIHNvdXIgZGF0YQogICAgbmV4dCBBQ1RJT05URVNUIGlmICElU291cmNlRGF0YTsKCiAgICBDUkVBVEVEQVRBOgogICAgZm9yIG15ICRDcmVhdGVEYXRhICgga2V5cyAlU291cmNlRGF0YSApIHsKCiAgICAgICAgIyBhZGQgYWN0aW9uCiAgICAgICAgaWYgKCAkQ3JlYXRlRGF0YSBlcSAnQWN0aW9uQWRkJyApIHsKCiAgICAgICAgICAgICMgYWRkIGFjdGlvbgogICAgICAgICAgICAkQWN0aW9uSUQgPSBfQWN0aW9uQWRkKCAkU291cmNlRGF0YXskQ3JlYXRlRGF0YX0gKTsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGFjdGlvbiBpZAogICAgICAgICAgICBuZXh0IENSRUFURURBVEEgaWYgISRBY3Rpb25JRDsKCiAgICAgICAgICAgICMgc2F2ZSBjcmVhdGVkIElEIGZvciBkZWxldGluZyBhY3Rpb25zCiAgICAgICAgICAgIHB1c2ggQEFjdGlvbklEcywgJEFjdGlvbklEOwogICAgICAgIH0KICAgIH0KfQoKIyBjaGVjayBleGVjdXRpb24gb2YgYWN0aW9ucwpBQ1RJT05DT1VOVEVSOgpmb3IgbXkgJEFjdGlvbkNvdW50ZXIgKCAwIC4uICggKCBzY2FsYXIgQEFjdGlvblRlc3RzICkgLSAxICkgKSB7CgogICAgbXkgJEFjdGlvbklEID0gJEFjdGlvbklEc1skQWN0aW9uQ291bnRlcl0gfHwgMDsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQWN0aW9uSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBY3Rpb25FeGVjdXRlIC0+IEFjdGlvbklEOiAkQWN0aW9uSUQiLAogICAgKTsKCiAgICBuZXh0IEFDVElPTkNPVU5URVIgaWYgISRBY3Rpb25JRDsKCiAgICAjIHNlbGVjdCBhc3NlcnQgZnVuY3Rpb24KICAgIG15ICRUZXN0U3ViID0gJ0ZhbHNlJzsKICAgIGlmICggJEFjdGlvblRlc3RzWyRBY3Rpb25Db3VudGVyXS0+e0FjdGlvblN1Y2Nlc3N9ICkgewogICAgICAgICRUZXN0U3ViID0gJ1RydWUnOwogICAgfQoKICAgICMgdGVzdCBmb3IgcmVzdWx0CiAgICAkU2VsZi0+JFRlc3RTdWIoCiAgICAgICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25FeGVjdXRlKAogICAgICAgICAgICBBY3Rpb25JRCA9PiAkQWN0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICkKICAgICAgICAgICAgfHwgMCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkV4ZWN1dGUgLT4gQWN0aW9uSUQ6ICRBY3Rpb25JRCIsCiAgICApOwoKICAgICMgZG8gbm90IGV4ZWN1dGUgZnVydGhlciBjaGVja3MgaWYgYWN0aW9uCiAgICAjIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBzdWNjZXNzZnVsbHkKICAgIG5leHQgQUNUSU9OQ09VTlRFUiBpZiAhJEFjdGlvblRlc3RzWyRBY3Rpb25Db3VudGVyXS0+e0FjdGlvblN1Y2Nlc3N9OwoKICAgICMgY2hlY2sgZm9yIHVwZGF0ZWQgYWN0aW9uCiAgICBteSAkQWN0aW9uID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25HZXQoCiAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFjdGlvbiwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkV4ZWN1dGUgLT4gQWN0aW9uR2V0OiAkQWN0aW9uSUQiLAogICAgKTsKICAgIG5leHQgQUNUSU9OQ09VTlRFUiBpZiAhJEFjdGlvbjsKCiAgICAjIGdldCBvYmplY3QgbmFtZQogICAgbXkgJE9iamVjdE5hbWUgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPk9iamVjdExvb2t1cCgKICAgICAgICBPYmplY3RJRCA9PiAkQWN0aW9uLT57T2JqZWN0SUR9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE9iamVjdE5hbWUsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBY3Rpb25FeGVjdXRlIC0+IE9iamVjdExvb2t1cDogJE9iamVjdE5hbWUiLAogICAgKTsKICAgIG5leHQgQUNUSU9OQ09VTlRFUiBpZiAhJE9iamVjdE5hbWU7CgogICAgIyBnZXQgYXR0cmlidXRlIG5hbWUKICAgIG15ICRBdHRyaWJ1dGVOYW1lID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BdHRyaWJ1dGVMb29rdXAoCiAgICAgICAgQXR0cmlidXRlSUQgPT4gJEFjdGlvbi0+e0F0dHJpYnV0ZUlEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBdHRyaWJ1dGVOYW1lLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQWN0aW9uRXhlY3V0ZSAtPiBBdHRyaWJ1dGVMb29rdXA6ICRBdHRyaWJ1dGVOYW1lIiwKICAgICk7CiAgICBuZXh0IEFDVElPTkNPVU5URVIgaWYgISRPYmplY3ROYW1lOwoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YTsKICAgIGlmICggJE9iamVjdE5hbWUgZXEgJ0lUU01DaGFuZ2UnICkgewogICAgICAgICRPYmplY3REYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRBY3Rpb24tPntTZWxlY3Rvcn0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJE9iamVjdE5hbWUgZXEgJ0lUU01Xb3JrT3JkZXInICkgewogICAgICAgICRPYmplY3REYXRhID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRBY3Rpb24tPntTZWxlY3Rvcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBdHRyaWJ1dGVOYW1lLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQWN0aW9uRXhlY3V0ZSAtPiBnZXQgT2JqZWN0RGF0YTogJE9iamVjdE5hbWUiLAogICAgKTsKICAgIG5leHQgQUNUSU9OQ09VTlRFUiBpZiAhJE9iamVjdERhdGE7CgogICAgIyBjaGVjayBmb3IgdXBkYXRlZCB2YWx1ZQogICAgJFNlbGYtPklzKAogICAgICAgICRPYmplY3REYXRhLT57JEF0dHJpYnV0ZU5hbWV9LAogICAgICAgICRBY3Rpb24tPntBY3Rpb25WYWx1ZX0sCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBBY3Rpb25FeGVjdXRlIC0+IGdldCBjaGFuZ2VkIGRhdGE6ICRPYmplY3ROYW1lIiwKICAgICk7Cn0KCiMgdGVzdCBmb3IgbWF0Y2ggc3RhdGUgbG9jawokU2VsZi0+RmFsc2UoCiAgICAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkNvbmRpdGlvbk1hdGNoU3RhdGVMb2NrKAogICAgICAgIE9iamVjdE5hbWUgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgIFNlbGVjdG9yICAgPT4gJENoYW5nZUlEc1swXSwKICAgICAgICBTdGF0ZUlEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICkKICAgICAgICB8fCAwLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBDb25kaXRpb25NYXRjaFN0YXRlTG9jayIsCik7CgojIGNoZWNrIGZvciBleHByZXNzaW9uIGRlbGV0ZQpmb3IgbXkgJEV4cHJlc3Npb25JRCAoQEV4cHJlc3Npb25JRHMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbkRlbGV0ZSgKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgICAgIEV4cHJlc3Npb25JRCA9PiAkRXhwcmVzc2lvbklELAogICAgICAgICksCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSBFeHByZXNzaW9uRGVsZXRlIC0+IEV4cHJlc3Npb25JRDogJEV4cHJlc3Npb25JRCIsCiAgICApOwoKICAgICMgZG91YmxlIGNoZWNrIGlmIGV4cHJlc3Npb24gaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRFeHByZXNzaW9uRGF0YSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHVuZGVmLAogICAgICAgICRFeHByZXNzaW9uRGF0YS0+e0V4cHJlc3Npb25JRH0sCiAgICAgICAgJ1Rlc3QnIC4gJFRlc3RDb3VudCsrIC4gJzogRXhwcmVzc2lvbkRlbGV0ZSgpIC0gZG91YmxlIGNoZWNrJywKICAgICk7Cn0KCiMgY2hlY2sgZm9yIGFjdGlvbiBkZWxldGUKZm9yIG15ICRBY3Rpb25JRCAoQEFjdGlvbklEcykgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25EZWxldGUoCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgIEFjdGlvbklEID0+ICRBY3Rpb25JRCwKICAgICAgICApLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQWN0aW9uRGVsZXRlIC0+IEFjdGlvbklEOiAkQWN0aW9uSUQiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBhY3Rpb24gaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRBY3Rpb25EYXRhID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25HZXQoCiAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICB1bmRlZiwKICAgICAgICAkQWN0aW9uRGF0YS0+e0FjdGlvbklEfSwKICAgICAgICAnVGVzdCcgLiAkVGVzdENvdW50KysgLiAnOiBBY3Rpb25EZWxldGUoKSAtIGRvdWJsZSBjaGVjaycsCiAgICApOwp9CgojIGRlbGV0ZSBjcmVhdGVkIGNvbmRpdGlvbnMKZm9yIG15ICRDb25kaXRpb25JRCAoQENvbmRpdGlvbklEcykgewoKICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25EZWxldGUoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVTdWNjZXNzLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ29uZGl0aW9uRGVsZXRlIC0+IENvbmRpdGlvbklEOiAkQ29uZGl0aW9uSUQiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjb25kaXRpb24gaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRDb25kaXRpb25EYXRhID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5Db25kaXRpb25HZXQoCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICB1bmRlZiwKICAgICAgICAkQ29uZGl0aW9uRGF0YS0+e0NvbmRpdGlvbklEfSwKICAgICAgICAnVGVzdCcgLiAkVGVzdENvdW50KysgLiAnOiBDb25kaXRpb25EZWxldGUoKSAtIGRvdWJsZSBjaGVjaycsCiAgICApOwp9CgojIGRlbGV0ZSBjcmVhdGVkIGNoYW5nZXMKZm9yIG15ICRDaGFuZ2VJRCAoQENoYW5nZUlEcykgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gQ2hhbmdlRGVsZXRlIC0+IENoYW5nZUlEOiAkQ2hhbmdlSUQiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjaGFuZ2UgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICB1bmRlZiwKICAgICAgICAkQ2hhbmdlRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAnVGVzdCcgLiAkVGVzdENvdW50KysgLiAnOiBDaGFuZ2VEZWxldGUoKSAtIGRvdWJsZSBjaGVjaycsCiAgICApOwp9CgojIHNldCBTZW5kTm90aWZpY2F0aW9ucyB0byBpdCdzIG9yaWdpbmFsIHZhbHVlCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmljYXRpb25zJywKICAgIFZhbHVlID0+ICRTZW5kTm90aWZpY2F0aW9uc09yZywKKTsKCnN1YiBfQWN0aW9uQWRkIHsKICAgIG15ICRBY3Rpb25EYXRhID0gc2hpZnQ7CgogICAgcmV0dXJuIGlmICEkQWN0aW9uRGF0YTsKICAgIHJldHVybiBpZiByZWYgJEFjdGlvbkRhdGEgbmUgJ0hBU0gnOwoKICAgICMgaGFzaCBmb3IgYWRkaW5nCiAgICBteSAlQWN0aW9uQWRkOwoKICAgICMgc2V0IHN0YXRpYyBmaWVsZHMKICAgIG15IEBTdGF0aWNGaWVsZHMgPSBxdyggU2VsZWN0b3IgQWN0aW9uVmFsdWUgVXNlcklEIENvbmRpdGlvbklEICk7CgogICAgU1RBVElDRklFTEQ6CiAgICBmb3IgbXkgJFN0YXRpY0ZpZWxkIChAU3RhdGljRmllbGRzKSB7CgogICAgICAgICMgb21taXQgc3RhdGljIGZpZWxkIGlmIGl0IGlzIG5vdCBzZXQKICAgICAgICBuZXh0IFNUQVRJQ0ZJRUxEIGlmICFleGlzdHMgJEFjdGlvbkRhdGEtPnskU3RhdGljRmllbGR9OwogICAgICAgIG5leHQgU1RBVElDRklFTEQgaWYgIWRlZmluZWQgJEFjdGlvbkRhdGEtPnskU3RhdGljRmllbGR9OwoKICAgICAgICAjIHNhZmUgZGF0YQogICAgICAgICRBY3Rpb25BZGR7JFN0YXRpY0ZpZWxkfSA9ICRBY3Rpb25EYXRhLT57JFN0YXRpY0ZpZWxkfTsKICAgIH0KCiAgICAjIGdldCBhbGwgZmllbGRzIGZvciBBY3Rpb25BZGQKICAgIGZvciBteSAkQWN0aW9uQWRkVmFsdWUgKCBrZXlzICV7JEFjdGlvbkRhdGF9ICkgewoKICAgICAgICAjIG9tbWl0IHN0YXRpYyBmaWVsZHMKICAgICAgICBuZXh0IGlmIGdyZXAgeyAkXyBlcSAkQWN0aW9uQWRkVmFsdWUgfSBAU3RhdGljRmllbGRzOwoKICAgICAgICAjIGdldCB2YWx1ZXMgZm9yIGZpZWxkcwogICAgICAgIGZvciBteSAkRmllbGRWYWx1ZSAoIGtleXMgJXsgJEFjdGlvbkRhdGEtPnskQWN0aW9uQWRkVmFsdWV9IH0gKSB7CgogICAgICAgICAgICAjIHN0b3JlIGdhdGhlcmVkIGluZm9ybWF0aW9uIGluIGhhc2ggZm9yIGFkZGluZwogICAgICAgICAgICAkQWN0aW9uQWRkeyRBY3Rpb25BZGRWYWx1ZX0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT4kRmllbGRWYWx1ZSgKICAgICAgICAgICAgICAgICV7ICRBY3Rpb25EYXRhLT57JEFjdGlvbkFkZFZhbHVlfS0+eyRGaWVsZFZhbHVlfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgYWN0aW9uCiAgICBteSAkQWN0aW9uSUQgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPkFjdGlvbkFkZCgKICAgICAgICAlQWN0aW9uQWRkLAogICAgKSB8fCAwOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBY3Rpb25JRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkFkZCAtPiAkQWN0aW9uSUQiLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBBY3Rpb25JRAogICAgcmV0dXJuIGlmICEkQWN0aW9uSUQ7CgogICAgIyBjaGVjayB0aGUgYWRkZWQgYWN0aW9uCiAgICBteSAkQWN0aW9uR2V0ID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25HZXQoCiAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgIFVzZXJJRCAgID0+ICRBY3Rpb25BZGR7VXNlcklEfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQWN0aW9uR2V0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gQWN0aW9uQWRkKCk6IEFjdGlvbkdldCcsCiAgICApOwoKICAgICMgZGVsZXRlIFVzZXJJRCwgaXQgaXMgbm90IHJldHVybmVkCiAgICBkZWxldGUgJEFjdGlvbkFkZHtVc2VySUR9OwoKICAgICMgdGVzdCB2YWx1ZXMKICAgIGZvciBteSAkVGVzdFZhbHVlICgga2V5cyAlQWN0aW9uQWRkICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJEFjdGlvbkdldC0+eyRUZXN0VmFsdWV9LAogICAgICAgICAgICAkQWN0aW9uQWRkeyRUZXN0VmFsdWV9LAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkFkZCgpOiBBY3Rpb25HZXQgLT4gJFRlc3RWYWx1ZSIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEFjdGlvbklEOwp9CgoxOwo=
IyAtLQojIElUU01TdGF0ZU1hY2hpbmUudCAtIFN0YXRlTWFjaGluZSB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMy0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogSVRTTVN0YXRlTWFjaGluZS50LHYgMS45IDIwMTAvMDEvMzAgMjI6Mzg6NDEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01TdGF0ZU1hY2hpbmU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwokU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNU3RhdGVNYWNoaW5lLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CgojIHRlc3QgaWYgc3RhdGVtYWNoaW5lIG9iamVjdCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKJFNlbGYtPlRydWUoCiAgICAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0sCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNvbnN0cnVjdGlvbiBvZiBzdGF0ZW1hY2hpbmUgb2JqZWN0JywKKTsKJFNlbGYtPklzKAogICAgcmVmICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fSwKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZScsCiAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNsYXNzIG9mIHN0YXRlbWFjaGluZSBvYmplY3QnLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3QgU3RhdGVNYWNoaW5lIEFQSQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCnsKCiAgICAjIGRlZmluZSBwdWJsaWMgaW50ZXJmYWNlIChpbiBhbHBoYWJldGljYWwgb3JkZXIpCiAgICBteSBAT2JqZWN0TWV0aG9kcyA9IHF3KAogICAgICAgIFN0YXRlTGlzdAogICAgICAgIFN0YXRlTG9va3VwCiAgICAgICAgU3RhdGVUcmFuc2l0aW9uQWRkCiAgICAgICAgU3RhdGVUcmFuc2l0aW9uRGVsZXRlCiAgICAgICAgU3RhdGVUcmFuc2l0aW9uRGVsZXRlQWxsCiAgICAgICAgU3RhdGVUcmFuc2l0aW9uR2V0CiAgICAgICAgU3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzCiAgICAgICAgU3RhdGVUcmFuc2l0aW9uTGlzdAogICAgICAgIFN0YXRlVHJhbnNpdGlvblVwZGF0ZQogICAgKTsKCiAgICAjIGNoZWNrIGlmIHN1YnMgYXJlIGF2YWlsYWJsZQogICAgZm9yIG15ICRPYmplY3RNZXRob2QgKEBPYmplY3RNZXRob2RzKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+Y2FuKCRPYmplY3RNZXRob2QpLAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrICdjYW4gJE9iamVjdE1ldGhvZCciLAogICAgICAgICk7CiAgICB9Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZGVmYXVsdCB0cmFuc2l0aW9ucyBmb3IgY2hhbmdlIHN0YXRlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCB0aGUgY2hhbmdlIHN0YXRlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKbXkgJU5hbWUyQ2hhbmdlU3RhdGVJRCA9IHJldmVyc2UgJXsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgKQogICAgfTsKCiMgYWRkIHplcm8gZW50cnkgZm9yIHRoZSBpbml0aWFsIHN0YXRlCiROYW1lMkNoYW5nZVN0YXRlSUR7MH0gPSAwOwoKIyBidWlsZCByZXZlcnNlIGxvb2t1cCBoYXNoCm15ICVDaGFuZ2VTdGF0ZUlEMk5hbWUgPSByZXZlcnNlICVOYW1lMkNoYW5nZVN0YXRlSUQ7CgojIGRlZmF1bHQgQ2hhbmdlU3RhdGUgVHJhbnNpdGlvbnMKbXkgJURlZmF1bHRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zID0gKAogICAgMCA9PiBbJ3JlcXVlc3RlZCddLAogICAgJ3JlcXVlc3RlZCcgPT4gWyAncmVqZWN0ZWQnLCAncmV0cmFjdGVkJywgJ3BlbmRpbmcgYXBwcm92YWwnLCAnaW4gcHJvZ3Jlc3MnIF0sCiAgICAncGVuZGluZyBhcHByb3ZhbCcgPT4gWyAncmVqZWN0ZWQnLCAncmV0cmFjdGVkJywgJ2FwcHJvdmVkJyBdLAogICAgJ2FwcHJvdmVkJyAgICA9PiBbICdyZXRyYWN0ZWQnLCAgICdpbiBwcm9ncmVzcycgXSwKICAgICdpbiBwcm9ncmVzcycgPT4gWyAncGVuZGluZyBwaXInLCAncmV0cmFjdGVkJywgJ2ZhaWxlZCcsICdzdWNjZXNzZnVsJywgJ2NhbmNlbGVkJyBdLAogICAgJ3BlbmRpbmcgcGlyJyA9PiBbICdmYWlsZWQnLCAgICAgICdzdWNjZXNzZnVsJyBdLAogICAgJ3JlamVjdGVkJyAgID0+IFswXSwKICAgICdyZXRyYWN0ZWQnICA9PiBbMF0sCiAgICAnZmFpbGVkJyAgICAgPT4gWzBdLAogICAgJ3N1Y2Nlc3NmdWwnID0+IFswXSwKICAgICdjYW5jZWxlZCcgICA9PiBbMF0sCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGRlZmF1bHQgdHJhbnNpdGlvbnMgZm9yIHdvcmtvcmRlciBzdGF0ZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGhlIHdvcmtvcmRlciBzdGF0ZXMgZnJvbSB0aGUgZ2VuZXJhbCBjYXRhbG9nCm15ICVOYW1lMldvcmtPcmRlclN0YXRlSUQgPSByZXZlcnNlICV7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgICkKICAgIH07CgojIGFkZCB6ZXJvIGVudHJ5IGZvciB0aGUgaW5pdGlhbCBzdGF0ZQokTmFtZTJXb3JrT3JkZXJTdGF0ZUlEezB9ID0gMDsKCiMgYnVpbGQgcmV2ZXJzZSBsb29rdXAgaGFzaApteSAlV29ya09yZGVyU3RhdGVJRDJOYW1lID0gcmV2ZXJzZSAlTmFtZTJXb3JrT3JkZXJTdGF0ZUlEOwoKIyBkZWZhdWx0IFdvcmtPcmRlclN0YXRlIFRyYW5zaXRpb25zCm15ICVEZWZhdWx0V29ya09yZGVyU3RhdGVUcmFuc2l0aW9ucyA9ICgKICAgIDAgICAgICAgICAgICAgPT4gWydjcmVhdGVkJ10sCiAgICAnY3JlYXRlZCcgICAgID0+IFsgJ2FjY2VwdGVkJywgJ2NhbmNlbGVkJyBdLAogICAgJ2FjY2VwdGVkJyAgICA9PiBbICdyZWFkeScsICdjYW5jZWxlZCcgXSwKICAgICdyZWFkeScgICAgICAgPT4gWyAnaW4gcHJvZ3Jlc3MnLCAnY2FuY2VsZWQnIF0sCiAgICAnaW4gcHJvZ3Jlc3MnID0+IFsgJ2Nsb3NlZCcsICdjYW5jZWxlZCcgXSwKICAgICdjYW5jZWxlZCcgICAgPT4gWzBdLAogICAgJ2Nsb3NlZCcgICAgICA9PiBbMF0sCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc3RhdGUgdHJhbnNpc3Rpb24gZ2V0IGVuZCBzdGF0ZXMgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgICMgZ2V0IG5leHQgZW5kIHN0YXRlcyBmb3IgJ2FwcHJvdmVkJwogICAgbXkgJE5leHRFbmRTdGF0ZUlEc1JlZiA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKAogICAgICAgIFN0YXRlSUQgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHthcHByb3ZlZH0sCiAgICAgICAgQ2xhc3MgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgbXkgJU5leHRFbmRTdGF0ZUxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyROZXh0RW5kU3RhdGVJRHNSZWZ9OwoKICAgICMgJ3JldHJhY3RlZCcgaXMgYSBuZXh0IGVuZCBzdGF0ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE5leHRFbmRTdGF0ZUxvb2t1cHsgJE5hbWUyQ2hhbmdlU3RhdGVJRHtyZXRyYWN0ZWR9IH0sCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcygpIC0gR2V0IHRoZSBuZXh0IGVuZCBzdGF0ZXMuIiwKICAgICk7CgogICAgIyAnaW4gcHJvZ3Jlc3MnIGlzIG5vdCBhIG5leHQgZW5kIHN0YXRlCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJE5leHRFbmRTdGF0ZUxvb2t1cHsgJE5hbWUyQ2hhbmdlU3RhdGVJRHsnaW4gcHJvZ3Jlc3MnfSB9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoKSAtIEdldCB0aGUgbmV4dCBlbmQgc3RhdGVzLiIsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBnZXQgbmV4dCBlbmQgc3RhdGVzIGZvciAncmVxdWVzdGVkJwogICAgJE5leHRFbmRTdGF0ZUlEc1JlZiA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKAogICAgICAgIFN0YXRlSUQgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHtyZXF1ZXN0ZWR9LAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKICAgICVOZXh0RW5kU3RhdGVMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQHskTmV4dEVuZFN0YXRlSURzUmVmfTsKCiAgICAjICdyZWplY3RlZCcgaXMgYSBuZXh0IGVuZCBzdGF0ZQogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE5leHRFbmRTdGF0ZUxvb2t1cHsgJE5hbWUyQ2hhbmdlU3RhdGVJRHtyZWplY3RlZH0gfSwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKCkgLSBHZXQgdGhlIG5leHQgZW5kIHN0YXRlcy4iLAogICAgKTsKCiAgICAjICdyZXRyYWN0ZWQnIGlzIGEgbmV4dCBlbmQgc3RhdGUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICROZXh0RW5kU3RhdGVMb29rdXB7ICROYW1lMkNoYW5nZVN0YXRlSUR7cmV0cmFjdGVkfSB9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoKSAtIEdldCB0aGUgbmV4dCBlbmQgc3RhdGVzLiIsCiAgICApOwoKICAgICMgJ3BlbmRpbmcgYXBwcm92YWwnIGlzIG5vdCBhIG5leHQgZW5kIHN0YXRlCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJE5leHRFbmRTdGF0ZUxvb2t1cHsgJE5hbWUyQ2hhbmdlU3RhdGVJRHsncGVuZGluZyBhcHByb3ZhbCd9IH0sCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkdldEVuZFN0YXRlcygpIC0gR2V0IHRoZSBuZXh0IGVuZCBzdGF0ZXMuIiwKICAgICk7CgogICAgIyAnaW4gcHJvZ3Jlc3MnIGlzIG5vdCBhIG5leHQgZW5kIHN0YXRlCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJE5leHRFbmRTdGF0ZUxvb2t1cHsgJE5hbWUyQ2hhbmdlU3RhdGVJRHsnaW4gcHJvZ3Jlc3MnfSB9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoKSAtIEdldCB0aGUgbmV4dCBlbmQgc3RhdGVzLiIsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBnZXQgbmV4dCBlbmQgc3RhdGVzIGZvciAncmV0cmFjdGVkJwogICAgJE5leHRFbmRTdGF0ZUlEc1JlZiA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uR2V0RW5kU3RhdGVzKAogICAgICAgIFN0YXRlSUQgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHtyZXRyYWN0ZWR9LAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKCiAgICAjICdyZXRyYWN0ZWQnIGhhcyBubyBuZXh0IGVuZCBzdGF0ZXMsIGJlY2F1c2UgaXQgaXMgYW4gZW5kIHN0YXRlIGl0c2VsZgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgIHNjYWxhciBAeyROZXh0RW5kU3RhdGVJRHNSZWZ9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXRFbmRTdGF0ZXMoKSAtIEdldCB0aGUgbmV4dCBlbmQgc3RhdGVzLiIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc3RhdGUgdHJhbnNpc3Rpb24gYWRkLCB1cGRhdGUgYW5kIGRlbGV0ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgIyBhZGQgYSBzZWNvbmQgc3RhcnQgdHJhbnNpdGlvbiAoIG11c3QgZmFpbCApCiAgICBteSAkVHJhbnNpdGlvbklEID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgU3RhdGVJRCAgICAgPT4gMCwKICAgICAgICBOZXh0U3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRUcmFuc2l0aW9uSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICI6IFN0YXRlVHJhbnNpdGlvbkFkZCgpIC0gQWRkIGFub3RoZXIgc3RhcnQgc3RhdGUgdHJhbnNpdGlvbi4iLAogICAgKTsKCiAgICAjIGFkZCBhIG5ldyBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbgogICAgJFRyYW5zaXRpb25JRCA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVUcmFuc2l0aW9uQWRkKAogICAgICAgIFN0YXRlSUQgICAgID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7YXBwcm92ZWR9LAogICAgICAgIE5leHRTdGF0ZUlEID0+ICROYW1lMkNoYW5nZVN0YXRlSUR7YXBwcm92ZWR9LAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVHJhbnNpdGlvbklELAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBTdGF0ZVRyYW5zaXRpb25BZGQoKSAtIEFkZCBhIG5ldyBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbi4iLAogICAgKTsKCiAgICAjIHRyeSB0byBzZXQgdGhlIHN0YXRlIHRvIGJlIGFuIGVuZCBzdGF0ZSAobXVzdCBmYWlsLCBiZWNhdXNlIG90aGVyIGZvbGxvd2luZyBzdGF0ZXMgZXhpc3QpCiAgICAkVHJhbnNpdGlvbklEID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgU3RhdGVJRCAgICAgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHthcHByb3ZlZH0sCiAgICAgICAgTmV4dFN0YXRlSUQgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRUcmFuc2l0aW9uSUQsCiAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkFkZCgpIC0gQWRkIGEgbmV3IGNoYW5nZSBzdGF0ZSB0cmFuc2l0aW9uIG11c3QgZmFpbCwgYmVjYXVzZSBvZiBleGlzdGluZyBmb2xsb3dpbmcgc3RhdGVzLiIsCiAgICApOwoKICAgICMgdXBkYXRlIGEgc3RhdGUgdHJhbnNpdGlvbgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlVHJhbnNpdGlvblVwZGF0ZSgKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBOZXh0U3RhdGVJRCAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBOZXdOZXh0U3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2ZhaWxlZH0sCiAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBTdGF0ZVRyYW5zaXRpb25VcGRhdGUoKSAtIFVwZGF0ZSBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbi4iLAogICAgKTsKCiAgICAjIGdldCB0aGUgdXBkYXRlZCBzdGF0ZSB0cmFuc2l0aW9uCiAgICBteSAkTmV4dFN0YXRlSURzUmVmID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25HZXQoCiAgICAgICAgU3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2FwcHJvdmVkfSwKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICk7CiAgICBteSAlTmV4dFN0YXRlTG9va3VwID0gbWFwIHsgJF8gPT4gMSB9IEB7JE5leHRTdGF0ZUlEc1JlZn07CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTmV4dFN0YXRlTG9va3VweyAkTmFtZTJDaGFuZ2VTdGF0ZUlEe2ZhaWxlZH0gfSwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uR2V0KCkgLSBHZXQgdGhlIHVwZGF0ZWQgY2hhbmdlIHN0YXRlIHRyYW5zaXRpb24uIiwKICAgICk7CgogICAgIyB1cGRhdGUgYSBzdGF0ZSB0cmFuc2l0aW9uCiAgICAjIChtdXN0IGZhaWwsIGJlY2F1c2UgbmV3IG5leHQgc3RhdGUgaXMgYW4gZW5kIHN0YXRlIGFuZCBvdGhlciBmb2xsb3dpbmcgc3RhdGVzIGFscmVhZHkgZXhpc3RzKQogICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlVHJhbnNpdGlvblVwZGF0ZSgKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEe3JlcXVlc3RlZH0sCiAgICAgICAgTmV4dFN0YXRlSUQgICAgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHtyZWplY3RlZH0sCiAgICAgICAgTmV3TmV4dFN0YXRlSUQgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25VcGRhdGUoKSAtIFVwZGF0ZSBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbiAoc2V0IGVuZCBzdGF0ZSBtdXN0IGZhaWwpLiIsCiAgICApOwoKICAgICMgdXBkYXRlIGEgc3RhdGUgdHJhbnNpdGlvbiAobXVzdCBmYWlsLCBiZWNhdXNlIGJvdGggc3RhdGVzIGFyZSB6ZXJvKQogICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlVHJhbnNpdGlvblVwZGF0ZSgKICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAwLAogICAgICAgIE5leHRTdGF0ZUlEICAgID0+IDAsCiAgICAgICAgTmV3TmV4dFN0YXRlSUQgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25VcGRhdGUoKSAtIFVwZGF0ZSBjaGFuZ2Ugc3RhdGUgdHJhbnNpdGlvbiAoYm90aCBzdGF0ZXMgemVybyB0ZXN0KS4iLAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgdHJhbnNpdGlvbiB0aGF0IHdhcyBhZGRlZCBiZWZvcmUKICAgIG15ICREZWxldGVTdWNjZXNzID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25EZWxldGUoCiAgICAgICAgU3RhdGVJRCAgICAgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHthcHByb3ZlZH0sCiAgICAgICAgTmV4dFN0YXRlSUQgPT4gJE5hbWUyQ2hhbmdlU3RhdGVJRHtmYWlsZWR9LAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICREZWxldGVTdWNjZXNzLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBTdGF0ZVRyYW5zaXRpb25EZWxldGUoKSAtIERlbGV0ZSBhIGNoYW5nZSBzdGF0ZSB0cmFuc2l0aW9uLiIsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2hlY2sgdGhlIGRlZmF1bHQgU3RhdGVNYWNoaW5lIHRyYW5zaXRpb25zIGZvciBjaGFuZ2Ugc3RhdGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGRlZmF1bHQgY2hhbmdlIHN0YXRlIHRyYW5zaXRpb25zIGZyb20gZGF0YWJhc2UKbXkgJENoYW5nZVN0YXRlVHJhbnNpdGlvbnMgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlVHJhbnNpdGlvbkxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCik7CgojIGNoZWNrIFN0YXRlVHJhbnNpdGlvbkxpc3QgZm9yIGNoYW5nZSBzdGF0ZXMKJFNlbGYtPklzKAogICAgc2NhbGFyIGtleXMgJXskQ2hhbmdlU3RhdGVUcmFuc2l0aW9uc30gfHwgMCwKICAgIHNjYWxhciBrZXlzICVEZWZhdWx0Q2hhbmdlU3RhdGVUcmFuc2l0aW9ucywKICAgICdUZXN0ICcKICAgICAgICAuICRUZXN0Q291bnQrKwogICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uTGlzdCgpIC0gbnVtYmVyIG9mIGRlZmF1bHQgc3RhcnQgc3RhdGVzIGZvciBjaGFuZ2Ugc3RhdGVzLiIsCik7Cgpmb3IgbXkgJERlZmF1bHRTdGF0ZSAoIGtleXMgJURlZmF1bHRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zICkgewoKICAgICMgY29udmVydCB0aGUgZGVmYXVsdCBzdGF0ZSB0byBhIHN0YXRlSUQKICAgIG15ICREZWZhdWx0U3RhdGVJRCA9ICROYW1lMkNoYW5nZVN0YXRlSUR7JERlZmF1bHRTdGF0ZX07CgogICAgIyBjaGVjayBpZiBhbGwgc3RhcnQgc3RhdGVzIGFyZSB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdAogICAgIyBhbmQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgbmV4dCBzdGF0ZXMKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHsgJENoYW5nZVN0YXRlVHJhbnNpdGlvbnMtPnsgJE5hbWUyQ2hhbmdlU3RhdGVJRHskRGVmYXVsdFN0YXRlfSB9IH0sCiAgICAgICAgc2NhbGFyIEB7ICREZWZhdWx0Q2hhbmdlU3RhdGVUcmFuc2l0aW9uc3skRGVmYXVsdFN0YXRlfSB9LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25MaXN0KCkgLSBudW1iZXIgb2YgZGVmYXVsdCBuZXh0IHN0YXRlcyBmb3IgY2hhbmdlIHN0YXRlICckRGVmYXVsdFN0YXRlJy4iLAogICAgKTsKCiAgICAjIGdldCBsb29rdXAgaGFzaCBvZiBhY3R1YWwgbmV4dCBzdGF0ZXMKICAgIG15IEBOZXh0U3RhdGVzCiAgICAgICAgPSBzb3J0IG1hcCB7ICRDaGFuZ2VTdGF0ZUlEMk5hbWV7JF99IH0gQHsgJENoYW5nZVN0YXRlVHJhbnNpdGlvbnMtPnskRGVmYXVsdFN0YXRlSUR9IH07CgogICAgbXkgJEluZGV4ID0gMDsKICAgIGZvciBteSAkRGVmYXVsdE5leHRTdGF0ZSAoIHNvcnQgQHsgJERlZmF1bHRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zeyREZWZhdWx0U3RhdGV9IH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmV4dCBzdGF0ZSBpcyB0aGUgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICROZXh0U3RhdGVzWyAkSW5kZXgrKyBdLAogICAgICAgICAgICAkRGVmYXVsdE5leHRTdGF0ZSwKICAgICAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAgICAgLiAkVGVzdENvdW50CiAgICAgICAgICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkxpc3QoKSAtIGRlZmF1bHQgbmV4dCBzdGF0ZSBmb3IgY2hhbmdlIHN0YXRlICckRGVmYXVsdFN0YXRlJy4iLAogICAgICAgICk7CiAgICB9CgogICAgIyB0ZXN0IHRoZSBzdGF0ZSBsb29rdXAgZnVuY3Rpb24gZm9yIHRoZSBzdGF0ZQogICAgbXkgJExvb2tlZFVwU3RhdGVJRCA9ICRTZWxmLT57U3RhdGVNYWNoaW5lT2JqZWN0fS0+U3RhdGVMb29rdXAoCiAgICAgICAgU3RhdGUgPT4gJERlZmF1bHRTdGF0ZSwKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFN0YXRlSUQsCiAgICAgICAgJERlZmF1bHRTdGF0ZUlELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFN0YXRlTG9va3VwKCkgZm9yIGNoYW5nZSBzdGF0ZSAnJERlZmF1bHRTdGF0ZScuIiwKICAgICk7CgogICAgIyB0ZXN0IHRoZSBzdGF0ZSBsb29rdXAgZnVuY3Rpb24gZm9yIHRoZSBzdGF0ZSBpZAogICAgbXkgJExvb2tlZFVwU3RhdGUgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlTG9va3VwKAogICAgICAgIFN0YXRlSUQgPT4gJERlZmF1bHRTdGF0ZUlELAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkTG9va2VkVXBTdGF0ZSwKICAgICAgICAkRGVmYXVsdFN0YXRlLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFN0YXRlTG9va3VwKCkgZm9yIGNoYW5nZSBzdGF0ZSBpZCAnJERlZmF1bHRTdGF0ZUlEJy4iLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNoZWNrIHRoZSBkZWZhdWx0IFN0YXRlTWFjaGluZSB0cmFuc2l0aW9ucyBmb3Igd29ya29yZGVyIHN0YXRlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBkZWZhdWx0IHdvcmtvcmRlciBzdGF0ZSB0cmFuc2l0aW9ucyBmcm9tIGRhdGFiYXNlCm15ICRXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAopOwoKIyBjaGVjayBTdGF0ZVRyYW5zaXRpb25MaXN0IGZvciB3b3Jrb3JkZXIgc3RhdGVzCiRTZWxmLT5JcygKICAgIHNjYWxhciBrZXlzICV7JFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnN9IHx8IDAsCiAgICBzY2FsYXIga2V5cyAlRGVmYXVsdFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnMsCiAgICAnVGVzdCAnCiAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAuICI6IFN0YXRlVHJhbnNpdGlvbkxpc3QoKSAtIE51bWJlciBvZiBkZWZhdWx0IHN0YXJ0IHN0YXRlcyBmb3Igd29ya29yZGVyIHN0YXRlcy4iLAopOwoKZm9yIG15ICREZWZhdWx0U3RhdGUgKCBrZXlzICVEZWZhdWx0V29ya09yZGVyU3RhdGVUcmFuc2l0aW9ucyApIHsKCiAgICAjIGNvbnZlcnQgdGhlIGRlZmF1bHQgc3RhdGUgdG8gYSBzdGF0ZUlECiAgICBteSAkRGVmYXVsdFN0YXRlSUQgPSAkTmFtZTJXb3JrT3JkZXJTdGF0ZUlEeyREZWZhdWx0U3RhdGV9OwoKICAgICMgY2hlY2sgaWYgYWxsIHN0YXJ0IHN0YXRlcyBhcmUgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQKICAgICMgYW5kIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIG5leHQgc3RhdGVzCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEB7ICRXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zLT57ICROYW1lMldvcmtPcmRlclN0YXRlSUR7JERlZmF1bHRTdGF0ZX0gfSB9LAogICAgICAgIHNjYWxhciBAeyAkRGVmYXVsdFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnN7JERlZmF1bHRTdGF0ZX0gfSwKICAgICAgICAnVGVzdCAnCiAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uTGlzdCgpIC0gTnVtYmVyIG9mIGRlZmF1bHQgbmV4dCBzdGF0ZXMgZm9yIHdvcmtvcmRlciBzdGF0ZSAnJERlZmF1bHRTdGF0ZScuIiwKICAgICk7CgogICAgIyBnZXQgbG9va3VwIGhhc2ggb2YgYWN0dWFsIG5leHQgc3RhdGVzCiAgICBteSBATmV4dFN0YXRlcyA9IHNvcnQgbWFwIHsgJFdvcmtPcmRlclN0YXRlSUQyTmFtZXskX30gfQogICAgICAgIEB7ICRXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zLT57JERlZmF1bHRTdGF0ZUlEfSB9OwoKICAgIG15ICRJbmRleCA9IDA7CiAgICBmb3IgbXkgJERlZmF1bHROZXh0U3RhdGUgKCBzb3J0IEB7ICREZWZhdWx0V29ya09yZGVyU3RhdGVUcmFuc2l0aW9uc3skRGVmYXVsdFN0YXRlfSB9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5leHQgc3RhdGUgaXMgdGhlIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkTmV4dFN0YXRlc1sgJEluZGV4KysgXSwKICAgICAgICAgICAgJERlZmF1bHROZXh0U3RhdGUsCiAgICAgICAgICAgICdUZXN0ICcKICAgICAgICAgICAgICAgIC4gJFRlc3RDb3VudAogICAgICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25MaXN0KCkgLSBEZWZhdWx0IG5leHQgc3RhdGUgZm9yIHdvcmtvcmRlciBzdGF0ZSAnJERlZmF1bHRTdGF0ZScuIiwKICAgICAgICApOwogICAgfQoKICAgICMgdGVzdCB0aGUgc3RhdGUgbG9va3VwIGZ1bmN0aW9uIGZvciB0aGUgc3RhdGUKICAgIG15ICRMb29rZWRVcFN0YXRlSUQgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlTG9va3VwKAogICAgICAgIFN0YXRlID0+ICREZWZhdWx0U3RhdGUsCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkTG9va2VkVXBTdGF0ZUlELAogICAgICAgICREZWZhdWx0U3RhdGVJRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTdGF0ZUxvb2t1cCgpIGZvciB3b3Jrb3JkZXIgc3RhdGUgJyREZWZhdWx0U3RhdGUnLiIsCiAgICApOwoKICAgICMgdGVzdCB0aGUgc3RhdGUgbG9va3VwIGZ1bmN0aW9uIGZvciB0aGUgc3RhdGUgaWQKICAgIG15ICRMb29rZWRVcFN0YXRlID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZUxvb2t1cCgKICAgICAgICBTdGF0ZUlEID0+ICREZWZhdWx0U3RhdGVJRCwKICAgICAgICBDbGFzcyAgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICk7CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvb2tlZFVwU3RhdGUsCiAgICAgICAgJERlZmF1bHRTdGF0ZSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBTdGF0ZUxvb2t1cCgpIGZvciB3b3Jrb3JkZXIgc3RhdGUgaWQgJyREZWZhdWx0U3RhdGVJRCcuIiwKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBzdGF0ZSB0cmFuc2l0aW9uIGdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNvbXBhcmUgdGhlIHJlc3VsdHMgZnJvbSBTdGF0ZVRyYW5zaXRpb25MaXN0KCkgYW5kIFN0YXRlVHJhbnNpdGlvbkdldCgpCmZvciBteSAkU3RhdGVJRCAoIGtleXMgJXskQ2hhbmdlU3RhdGVUcmFuc2l0aW9uc30gKSB7CgogICAgIyBnZXQgdGhlIG5leHQgc3RhdGUgaWRzIGZyb20gU3RhdGVUcmFuc2l0aW9uTGlzdCgpCiAgICBteSBATmV4dFN0YXRlSURzRnJvbUxpc3QgPSBzb3J0IEB7ICRDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zLT57JFN0YXRlSUR9IH07CgogICAgIyBnZXQgdGhlIG5leHQgc3RhdGUgaWRzIGZyb20gU3RhdGVUcmFuc2l0aW9uR2V0KCkKICAgIG15ICROZXh0U3RhdGVJRHNSZWYgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlVHJhbnNpdGlvbkdldCgKICAgICAgICBTdGF0ZUlEID0+ICRTdGF0ZUlELAogICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OkNoYW5nZTo6U3RhdGUnLAogICAgKTsKICAgIG15IEBOZXh0U3RhdGVJRHNGcm9tR2V0ID0gc29ydCBAeyROZXh0U3RhdGVJRHNSZWZ9OwoKICAgICMgY2hlY2sgaWYgdGhlIG51bWJlciBvZiBuZXh0IHN0YXRlcyBpcyB0aGUgc2FtZQogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBATmV4dFN0YXRlSURzRnJvbUdldCwKICAgICAgICBzY2FsYXIgQE5leHRTdGF0ZUlEc0Zyb21MaXN0LAogICAgICAgICdUZXN0ICcKICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgLiAiOiBTdGF0ZVRyYW5zaXRpb25HZXQoKSAtIE51bWJlciBvZiBuZXh0IHN0YXRlcyBmb3IgY2hhbmdlIHN0YXRlICckQ2hhbmdlU3RhdGVJRDJOYW1leyRTdGF0ZUlEfScuIiwKICAgICk7CgogICAgbXkgJEluZGV4ID0gMDsKICAgIGZvciBteSAkTmV4dFN0YXRlIChATmV4dFN0YXRlSURzRnJvbUdldCkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBuZXh0IHN0YXRlcyBhcmUgYWxsIHRoZSBzYW1lCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQ2hhbmdlU3RhdGVJRDJOYW1leyROZXh0U3RhdGV9LAogICAgICAgICAgICAkQ2hhbmdlU3RhdGVJRDJOYW1leyAkTmV4dFN0YXRlSURzRnJvbUxpc3RbICRJbmRleCsrIF0gfSwKICAgICAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgICAgIC4gIjogU3RhdGVUcmFuc2l0aW9uR2V0KCkgLSBOZXh0IHN0YXRlIGZvciBjaGFuZ2Ugc3RhdGUgJyRDaGFuZ2VTdGF0ZUlEMk5hbWV7JFN0YXRlSUR9Jy4iLAogICAgICAgICk7CiAgICB9Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjaGVjayBTdGF0ZUxpc3QoKSBmb3IgY2hhbmdlIHN0YXRlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CiAgICBteSAkU3RhdGVMaXN0ID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgQ2xhc3MgID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpDaGFuZ2U6OlN0YXRlJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICkgfHwgW107CgogICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGNoYW5nZSBzdGF0ZXMuIFRoZSBzdGFydCBzdGF0ZSBpcyBub3QgcmV0dXJuZWQgYnkgU3RhdGVMaXN0KCkuCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyKCBAeyRTdGF0ZUxpc3R9ICksCiAgICAgICAgc2NhbGFyKCBrZXlzICVEZWZhdWx0Q2hhbmdlU3RhdGVUcmFuc2l0aW9ucyApIC0gMSwKICAgICAgICAnU3RhdGVMaXN0KCkgLSBDaGFuZ2UgLSBudW1iZXIgb2Ygc3RhdGVzJywKICAgICk7CgogICAgIyBjaGVjayB3aGV0aGVyIHRoZSBkZWZhdWx0IHN0YXRlcyBhcmUgaW4gdGhlIFN0YXRlTGlzdAogICAgREVGQVVMVF9TVEFURToKICAgIGZvciBteSAkRGVmYXVsdFN0YXRlICgga2V5cyAlRGVmYXVsdENoYW5nZVN0YXRlVHJhbnNpdGlvbnMgKSB7CgogICAgICAgICMgc2tpcCB0aGUgZGVmYXVsdCBzdGF0ZSAnMCcKICAgICAgICBuZXh0IERFRkFVTFRfU1RBVEUgaWYgISREZWZhdWx0U3RhdGU7CgogICAgICAgIG15IEBNYXRjaGVzID0gZ3JlcCB7ICRfLT57VmFsdWV9IGVxICREZWZhdWx0U3RhdGUgfSBAeyRTdGF0ZUxpc3R9OwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyKEBNYXRjaGVzKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlN0YXRlTGlzdCgpIC0gQ2hhbmdlIC0gZm91bmQgJERlZmF1bHRTdGF0ZSIsCiAgICAgICAgKTsKICAgIH0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGNoZWNrIFN0YXRlTGlzdCgpIGZvciB3b3Jrb3JkZXIgc3RhdGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKICAgIG15ICRTdGF0ZUxpc3QgPSAkU2VsZi0+e1N0YXRlTWFjaGluZU9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICBDbGFzcyAgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKSB8fCBbXTsKCiAgICAjIENoZWNrIHRoZSBudW1iZXIgb2Ygc3RhdGVzLiBUaGUgc3RhcnQgc3RhdGUgaXMgbm90IHJldHVybmVkIGJ5IFN0YXRlTGlzdCgpLgogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciggQHskU3RhdGVMaXN0fSApLAogICAgICAgIHNjYWxhcigga2V5cyAlRGVmYXVsdFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnMgKSAtIDEsCiAgICAgICAgJ1N0YXRlTGlzdCgpIC0gV29ya09yZGVyIC0gbnVtYmVyIG9mIHN0YXRlcycsCiAgICApOwoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgZGVmYXVsdCBzdGF0ZXMgYXJlIGluIHRoZSBTdGF0ZUxpc3QKICAgIERFRkFVTFRfU1RBVEU6CiAgICBmb3IgbXkgJERlZmF1bHRTdGF0ZSAoIGtleXMgJURlZmF1bHRXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zICkgewoKICAgICAgICAjIHNraXAgdGhlIGRlZmF1bHQgc3RhdGUgJzAnCiAgICAgICAgbmV4dCBERUZBVUxUX1NUQVRFIGlmICEkRGVmYXVsdFN0YXRlOwoKICAgICAgICBteSBATWF0Y2hlcyA9IGdyZXAgeyAkXy0+e1ZhbHVlfSBlcSAkRGVmYXVsdFN0YXRlIH0gQHskU3RhdGVMaXN0fTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhcihATWF0Y2hlcyksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJTdGF0ZUxpc3QoKSAtIFdvcmtPcmRlciAtIGZvdW5kICREZWZhdWx0U3RhdGUiLAogICAgICAgICk7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIElUU01UZW1wbGF0ZS50IC0gY2hhbmdlIHRlc3RzCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJVFNNVGVtcGxhdGUudCx2IDEuNSAyMDEwLzAyLzA5IDE0OjA4OjI2IHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBMaXN0OjpVdGlsIHF3KG1heCk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Db25kaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgTm90ZSBmb3IgZGV2ZWxvcGVyczoKIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBrZXlzIGluICVDaGFuZ2VEZWZpbml0aW9ucyAocmVzcC4gV29ya09yZGVyRGVmaW5pdGlvbnMgKQojIGhhdmUgdG8gYmUgaWRlbnRpY2FsIHdpdGggdGhlIGtleSBuYW1lcyBpbiAlVGVtcGxhdGVEZWZpbml0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJFRlc3RDb3VudCA9IDE7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwokU2VsZi0+e0NoYW5nZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTUNvbmRpdGlvbi0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57V29ya09yZGVyT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57VGVtcGxhdGVPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZS0+bmV3KCAleyRTZWxmfSApOwokU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiMgdGVzdCBpZiBjaGFuZ2Ugb2JqZWN0IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQokU2VsZi0+VHJ1ZSgKICAgICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LAogICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICcgLSBjb25zdHJ1Y3Rpb24gb2YgdGVtcGxhdGUgb2JqZWN0JywKKTsKJFNlbGYtPklzKAogICAgcmVmICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZScsCiAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gJyAtIGNsYXNzIG9mIHRlbXBsYXRlIG9iamVjdCcsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY3JlYXRlIG5lZWRlZCB1c2VycyBhbmQgY3VzdG9tZXIgdXNlcnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwpteSBAQ3VzdG9tZXJVc2VySURzOyAgICAjIGEgbGlzdCBvZiBleGlzdGluZyBhbmQgdmFsaWQgY3VzdG9tZXIgdXNlciBpZHMsIGEgbGlzdCBvZiBzdHJpbmdzCgojIGRpc2FibGUgZW1haWwgY2hlY2tzIHRvIGNyZWF0ZSBuZXcgdXNlcgpteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyk7CmlmICggIWRlZmluZWQgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgKSB7CiAgICAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9IDE7Cn0KJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAwLAopOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiAzICkgewoKICAgICMgY3JlYXRlIG5ldyBjdXN0b21lcnMgZm9yIHRoZSB0ZXN0cwogICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJBZGQoCiAgICAgICAgU291cmNlICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJ0lUU01DaGFuZ2VDdXN0b21lcicgLiAkQ291bnRlciwKICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnVW5pdFRlc3RDdXN0b21lcicsCiAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gJ1VDVCcgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBVc2VyTG9naW4gICAgICA9PiAnVW5pdFRlc3QtSVRTTVRlbXBsYXRlLUN1c3RvbWVyLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICBVc2VyRW1haWwgICAgICA9PiAnVW5pdFRlc3QtSVRTTVRlbXBsYXRlLUN1c3RvbWVyLScKICAgICAgICAgICAgLiAkQ291bnRlcgogICAgICAgICAgICAuIGludCggcmFuZCAxXzAwMF8wMDAgKQogICAgICAgICAgICAuICdAbG9jYWxob3N0JywKICAgICAgICBWYWxpZElEID0+ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExvb2t1cCggVmFsaWQgPT4gJ3ZhbGlkJyApLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKICAgIHB1c2ggQEN1c3RvbWVyVXNlcklEcywgJEN1c3RvbWVyVXNlcklEOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBUZW1wbGF0ZSBBUEkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgcHVibGljIGludGVyZmFjZSAoaW4gYWxwaGFiZXRpY2FsIG9yZGVyKQpteSBAT2JqZWN0TWV0aG9kcyA9IHF3KAogICAgVGVtcGxhdGVBZGQKICAgIFRlbXBsYXRlRGVsZXRlCiAgICBUZW1wbGF0ZVVwZGF0ZQogICAgVGVtcGxhdGVTZWFyY2gKICAgIFRlbXBsYXRlU2VyaWFsaXplCiAgICBUZW1wbGF0ZURlU2VyaWFsaXplCiAgICBUZW1wbGF0ZVR5cGVMb29rdXAKICAgIFRlbXBsYXRlTGlzdAogICAgVGVtcGxhdGVHZXQKKTsKCiMgY2hlY2sgaWYgc3VicyBhcmUgYXZhaWxhYmxlCmZvciBteSAkT2JqZWN0TWV0aG9kIChAT2JqZWN0TWV0aG9kcykgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPmNhbigkT2JqZWN0TWV0aG9kKSwKICAgICAgICAiVGVzdCAiIC4gJFRlc3RDb3VudCsrIC4gIiAtIGNoZWNrICdjYW4gJE9iamVjdE1ldGhvZCciLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHNlYXJjaCBmb3IgZGVmYXVsdCBUZW1wbGF0ZSB0eXBlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSBkZWZhdWx0IFRlbXBsYXRlIHR5cGVzCm15IEBEZWZhdWx0VHlwZXMgPSBxdygKICAgIElUU01DaGFuZ2UKICAgIElUU01Xb3JrT3JkZXIKICAgIElUU01Db25kaXRpb24KICAgIENBQgopOwoKIyBpbnZlc3RpZ2F0ZSB0aGUgZGVmYXVsdCB0eXBlcwpmb3IgbXkgJFR5cGUgKEBEZWZhdWx0VHlwZXMpIHsKCiAgICAjIGxvb2sgdXAgdGhlIHN0YXRlIG5hbWUKICAgIG15ICRMb29rZWRVcFR5cGVJRCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZVR5cGVMb29rdXAoCiAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRUeXBlLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTG9va2VkVXBUeXBlSUQsCiAgICAgICAgIkxvb2sgdXAgdHlwZSAnJFR5cGUnIiwKICAgICk7CgogICAgIyBkbyB0aGUgcmV2ZXJzZSBsb29rdXAKICAgIG15ICRMb29rZWRVcFR5cGUgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVUeXBlTG9va3VwKAogICAgICAgIFRlbXBsYXRlVHlwZUlEID0+ICRMb29rZWRVcFR5cGVJRCwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFR5cGUsCiAgICAgICAgJFR5cGUsCiAgICAgICAgIkxvb2sgdXAgdHlwZSBpZCAnJExvb2tlZFVwVHlwZUlEJyIsCiAgICApOwp9CgojIG5vdyBzb21lIHBhcmFtIGNoZWNrcyBmb3IgQ2hhbmdlU3RhdGVMb29rdXAKbXkgJExvb2t1cE9rID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlVHlwZUxvb2t1cCgpOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgJ05vIHBhcmFtcyBwYXNzZWQgdG8gVGVtcGxhdGVUeXBlTG9va3VwKCknLAopOwoKJExvb2t1cE9rID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlVHlwZUxvb2t1cCgKICAgIFRlbXBsYXRlVHlwZSAgID0+ICdhcHByb3ZlZCcsCiAgICBUZW1wbGF0ZVR5cGVJRCA9PiAyLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgJ0V4Y2x1c2l2ZSBwYXJhbXMgcGFzc2VkIHRvIFRlbXBsYXRlVHlwZUxvb2t1cCgpJywKKTsKCiRMb29rdXBPayA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZVR5cGVMb29rdXAoCiAgICBUZW1wbGF0ZVR5cGVzID0+ICdJVFNNQW55dGhpbmcnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9rLAogICAgIkluY29ycmVjdCBwYXJhbSAnVGVtcGxhdGVUeXBlcycgcGFzc2VkIHRvIFRlbXBsYXRlVHlwZUxvb2t1cCgpIiwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBnZW5lcmFsIHRlbXBsYXRlIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgc3RvcmUgY3VycmVudCBUZXN0Q291bnQgZm9yIGJldHRlciB0ZXN0IGNhc2UgcmVjb2duaXRpb24KbXkgJFRlc3RDb3VudE1pc2MgPSAkVGVzdENvdW50OwoKIyBBbiB1bmlxdWUgaW5kZW50aWZpZXIsIHNvIHRoYXQgZGF0YSBmcm9tIGRpZmZlcmVudCB0ZXN0IHJ1bnMKIyB3b24ndCBiZSBtaXhlZCB1cC4gVGhlIHN0cmluZyBpcyBmb3JtYXRlZCB0byBhIGNvbnN0YW50IGxlbmd0aCwKIyBhcyB0aGUgY29udmVyc2lvbiB0byBwbGFpbiB0ZXh0IHdpdGggVG9Bc2NpaSgpIGRlcGVuZHMgb24gdGhlIHN0cmluZyBsZW5ndGguCm15ICRVbmlxdWVTaWduYXR1cmUgPSBzcHJpbnRmICdVbml0VGVzdC1JVFNNVGVtcGxhdGUtJTA2ZF8lMDEwZCcsCiAgICBpbnQoIHJhbmQgMV8wMDBfMDAwICksCiAgICB0aW1lKCk7CgpteSAlQ2hhbmdlRGVmaW5pdGlvbnMgPSAoCiAgICBCYXNlQ2hhbmdlID0+IHsKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ0FTQ0lJIENoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdBU0NJSSBDaGFuZ2UgLSBEZXNjcmlwdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIEp1c3RpZmljYXRpb24gICA9PiAnQVNDSUkgQ2hhbmdlIC0gSnVzdGlmaWNhdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAxLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAxLAogICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbCiAgICAgICAgICAgIDEsCiAgICAgICAgXSwKICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICBAQ3VzdG9tZXJVc2VySURzLAogICAgICAgIF0sCiAgICB9LAogICAgVW5pY29kZUNoYW5nZSA9PiB7CiAgICAgICAgQ2hhbmdlVGl0bGUgICA9PiAiVW5pY29kZSBDaGFuZ2UgLSBUaXRsZSDDpMO2w7wgLSAkVW5pcXVlU2lnbmF0dXJlIiwKICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdVbmljb2RlIENoYW5nZSAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgSnVzdGlmaWNhdGlvbiA9PiAiVW5pY29kZSBDaGFuZ2UgLSBKdXN0aWZpY2F0aW9uICIKICAgICAgICAgICAgLiAiXHh7MTY3fVx4e2I2fVx4ezIwYWN9XEBceHsxNDJ9XHh7MTQyfVx4ezEzOH1qXHh7ZjB9XHh7YjV9XHh7YWJ9XHh7ZGZ9XHh7YmJ9ICIKICAgICAgICAgICAgLiAiLSAkVW5pcXVlU2lnbmF0dXJlIiwKICAgICAgICBDaGFuZ2VNYW5hZ2VySUQgPT4gMSwKICAgICAgICBDaGFuZ2VCdWlsZGVySUQgPT4gMSwKICAgICAgICBDQUJBZ2VudHMgICAgICAgPT4gWwogICAgICAgICAgICAxLAogICAgICAgIF0sCiAgICB9LAogICAgQ29udGFpbmVyQ2hhbmdlID0+IHsKICAgICAgICBDaGFuZ2VUaXRsZSAgICAgPT4gJ0NvbnRhaW5lciBDaGFuZ2UgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnQ29udGFpbmVyIENoYW5nZSAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgSnVzdGlmaWNhdGlvbiAgID0+ICdDb250YWluZXIgQ2hhbmdlIC0gSnVzdGlmaWNhdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIENoYW5nZU1hbmFnZXJJRCA9PiAxLAogICAgICAgIENoYW5nZUJ1aWxkZXJJRCA9PiAxLAogICAgICAgIENBQkFnZW50cyAgICAgICA9PiBbCiAgICAgICAgICAgIDEsCiAgICAgICAgXSwKICAgIH0sCiAgICBUYXJnZXRDaGFuZ2UgPT4gewogICAgICAgIENoYW5nZVRpdGxlICAgICA9PiAnVGFyZ2V0IENoYW5nZSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgRGVzY3JpcHRpb24gICAgID0+ICdUYXJnZXQgQ2hhbmdlIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBKdXN0aWZpY2F0aW9uICAgPT4gJ1RhcmdldCBDaGFuZ2UgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgQ2hhbmdlTWFuYWdlcklEID0+IDEsCiAgICAgICAgQ2hhbmdlQnVpbGRlcklEID0+IDEsCiAgICAgICAgQ0FCQWdlbnRzICAgICAgID0+IFsKICAgICAgICAgICAgMSwKICAgICAgICBdLAogICAgfSwKKTsKCiMgY3JlYXRlIGNoYW5nZSB0aGF0IHNob3VsZCBhY3QgYXMgdGhlIGJhc2UgZm9yIHRoZSB0ZW1wbGF0ZSB0ZXN0Cm15ICVDcmVhdGVkQ2hhbmdlSUQ7Cgpmb3IgbXkgJENoYW5nZU5hbWUgKCBrZXlzICVDaGFuZ2VEZWZpbml0aW9ucyApIHsKICAgICRDcmVhdGVkQ2hhbmdlSUR7JENoYW5nZU5hbWV9ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBZGQoCiAgICAgICAgJXsgJENoYW5nZURlZmluaXRpb25zeyRDaGFuZ2VOYW1lfSB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZENoYW5nZUlEeyRDaGFuZ2VOYW1lfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VBZGQoKSAtICRDcmVhdGVkQ2hhbmdlSUR7JENoYW5nZU5hbWV9IGNyZWF0ZWQgKCRDaGFuZ2VOYW1lKSIsCiAgICApOwp9Cgpmb3IgbXkgJENoYW5nZU5hbWUgKCBrZXlzICVDcmVhdGVkQ2hhbmdlSUQgKSB7CiAgICBteSAkQ2hhbmdlSUQgPSAkQ3JlYXRlZENoYW5nZUlEeyRDaGFuZ2VOYW1lfTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlQWRkKCkgLSAkQ2hhbmdlSUQgY3JlYXRlZCAoJENoYW5nZU5hbWUpIiwKICAgICk7CgogICAgbXkgJENoYW5nZSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDcmVhdGVkQ2hhbmdlSUR7JENoYW5nZU5hbWV9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2hhbmdlIGF0dHJpYnV0ZXMKICAgIGZvciBteSAkUmVxdWVzdGVkQXR0cmlidXRlICgga2V5cyAleyAkQ2hhbmdlRGVmaW5pdGlvbnN7JENoYW5nZU5hbWV9IH0gKSB7CgogICAgICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAgICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKQogICAgICAgIG15ICRDaGFuZ2VBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJENoYW5nZS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CgogICAgICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUKICAgICAgICAgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJENoYW5nZURlZmluaXRpb25zeyRDaGFuZ2VOYW1lfS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENoYW5nZUF0dHJpYnV0ZSwKICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIGFkZCB3b3Jrb3JkZXJzCm15ICVXb3JrT3JkZXJEZWZpbml0aW9ucyA9ICgKICAgIEFTQ0lJV29ya09yZGVyID0+IHsKICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkQ3JlYXRlZENoYW5nZUlEe0NvbnRhaW5lckNoYW5nZX0sCiAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ0p1c3QgYW4gQVNDSUkgd29ya29yZGVyIHRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICB9LAogICAgVW1sYXV0c1dvcmtPcmRlciA9PiB7CiAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJENyZWF0ZWRDaGFuZ2VJRHtDb250YWluZXJDaGFuZ2V9LAogICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3Jrb3JkZXIgdGl0bGUgd2l0aCBnZXJtYW4gdW1sYXV0cyDDpMO2w7wtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgfSwKICAgIFVuaWNvZGVXb3JrT3JkZXIgPT4gewogICAgICAgIENoYW5nZUlEICAgICAgID0+ICRDcmVhdGVkQ2hhbmdlSUR7Q29udGFpbmVyQ2hhbmdlfSwKICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya29yZGVyIHRpdGxlIHdpdGggdW5pY29kZSBjaGFycyBceHsxNjd9XHh7YjZ9XHh7MjBhY30gLSAnCiAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgIH0sCik7CgpteSAlQ3JlYXRlZFdvcmtPcmRlcklEOwpmb3IgbXkgJFdvcmtPcmRlck5hbWUgKCBrZXlzICVXb3JrT3JkZXJEZWZpbml0aW9ucyApIHsKCiAgICAjIGFkZCB3b3Jrb3JkZXIKICAgICRDcmVhdGVkV29ya09yZGVySUR7JFdvcmtPcmRlck5hbWV9ID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgJXsgJFdvcmtPcmRlckRlZmluaXRpb25zeyRXb3JrT3JkZXJOYW1lfSB9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICBteSAkV29ya09yZGVySUQgPSAkQ3JlYXRlZFdvcmtPcmRlcklEeyRXb3JrT3JkZXJOYW1lfTsKCiAgICAjIGdldCB3b3Jrb3JkZXIKICAgIG15ICRXb3JrT3JkZXIgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckdldCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayB3b3Jrb3JkZXIgYXR0cmlidXRlcwogICAgZm9yIG15ICRSZXF1ZXN0ZWRBdHRyaWJ1dGUgKCBrZXlzICV7ICRXb3JrT3JkZXJEZWZpbml0aW9uc3skV29ya09yZGVyTmFtZX0gfSApIHsKCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZUdldCgpCiAgICAgICAgbXkgJFdvcmtPcmRlckF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkV29ya09yZGVyLT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZQogICAgICAgICAgICA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkV29ya09yZGVyRGVmaW5pdGlvbnN7JFdvcmtPcmRlck5hbWV9LT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkV29ya09yZGVyQXR0cmlidXRlLAogICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSAkUmVxdWVzdGVkQXR0cmlidXRlIChXb3JrT3JkZXJJRDogJFdvcmtPcmRlcklEKSIsCiAgICAgICAgKTsKCiAgICAgICAgJFRlc3RDb3VudCsrOwogICAgfQp9CgojIGFkZCBjb25kaXRpb25zCm15ICVDb25kaXRpb25EZWZpbml0aW9ucyA9ICgKICAgIFNpbXBsZUNvbmRpdGlvbiA9PiB7CiAgICAgICAgQ29uZGl0aW9uQWRkID0+IHsKICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICAgID0+ICRDcmVhdGVkQ2hhbmdlSUR7QmFzZUNoYW5nZX0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnU2ltcGxlIENvbmRpdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBFeHByZXNzaW9uQ29uanVuY3Rpb24gPT4gJ2FsbCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBFeHByZXNzaW9uQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0SUQgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0TG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhbmdlVGl0bGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgT3BlcmF0b3JJRCA9PiB7CiAgICAgICAgICAgICAgICBPcGVyYXRvckxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnaXMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgc3RhdGljIGZpZWxkcwogICAgICAgICAgICAjQ29uZGl0aW9uSUQgID0+IC4uLiwgIyBUaGlzIGlzIGZpbGxlZCBieSBmb2xsb3dpbmcgY29kZQogICAgICAgICAgICBTZWxlY3RvciAgICAgPT4gJENyZWF0ZWRDaGFuZ2VJRHtCYXNlQ2hhbmdlfSwKICAgICAgICAgICAgQ29tcGFyZVZhbHVlID0+ICdEdW1teUNvbXBhcmVWYWx1ZTEnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFjdGlvbkFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdElEID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdExvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEF0dHJpYnV0ZUlEID0+IHsKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxvb2t1cCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICdDaGFuZ2VUaXRsZScsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBPcGVyYXRvcklEID0+IHsKICAgICAgICAgICAgICAgIE9wZXJhdG9yTG9va3VwID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJ3NldCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBzdGF0aWMgZmllbGRzCiAgICAgICAgICAgICNDb25kaXRpb25JRCAgPT4gLi4uLCAjIFRoaXMgaXMgZmlsbGVkIGJ5IGZvbGxvd2luZyBjb2RlCiAgICAgICAgICAgIFNlbGVjdG9yICAgID0+ICRDcmVhdGVkQ2hhbmdlSUR7QmFzZUNoYW5nZX0sCiAgICAgICAgICAgIEFjdGlvblZhbHVlID0+ICdOZXcgQ2hhbmdlIFRpdGxlJyAuICRVbmlxdWVTaWduYXR1cmUgLiBpbnQgcmFuZCAxXzAwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgfQogICAgfSwKKTsKCm15ICVDcmVhdGVkQ29uZGl0aW9uSUQ7CgpDT05ESVRJT05OQU1FOgpmb3IgbXkgJENvbmRpdGlvbk5hbWUgKCBrZXlzICVDb25kaXRpb25EZWZpbml0aW9ucyApIHsKICAgIG15ICRDb25kaXRpb25EYXRhID0gJENvbmRpdGlvbkRlZmluaXRpb25zeyRDb25kaXRpb25OYW1lfS0+e0NvbmRpdGlvbkFkZH07CiAgICBteSAkQ29uZGl0aW9uSUQgICA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+Q29uZGl0aW9uQWRkKAogICAgICAgICV7JENvbmRpdGlvbkRhdGF9LAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ29uZGl0aW9uSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQWRkIENvbmRpdGlvbiAkQ29uZGl0aW9uTmFtZSIsCiAgICApOwoKICAgIG5leHQgQ09ORElUSU9OTkFNRSBpZiAhJENvbmRpdGlvbklEOwoKICAgICRDcmVhdGVkQ29uZGl0aW9uSUR7JENvbmRpdGlvbk5hbWV9ID0gJENvbmRpdGlvbklEOwoKICAgIG15ICRFeHByZXNzaW9uRGF0YSA9ICRDb25kaXRpb25EZWZpbml0aW9uc3skQ29uZGl0aW9uTmFtZX0tPntFeHByZXNzaW9uQWRkfTsKICAgIG15ICRFeHByZXNzaW9uSUQgPSBfRXhwcmVzc2lvbkFkZCggJEV4cHJlc3Npb25EYXRhLCAkQ29uZGl0aW9uSUQgKTsKCiAgICBteSAkQWN0aW9uRGF0YSA9ICRDb25kaXRpb25EZWZpbml0aW9uc3skQ29uZGl0aW9uTmFtZX0tPntBY3Rpb25BZGR9OwogICAgbXkgJEFjdGlvbklEID0gX0FjdGlvbkFkZCggJEFjdGlvbkRhdGEsICRDb25kaXRpb25JRCApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjcmVhdGUgdGVtcGxhdGVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15ICVUZXN0ZWRUZW1wbGF0ZUlEOwpteSAlVGVzdGVkVGVtcGxhdGVTdHJpbmdzOwoKbXkgJVRlbXBsYXRlRGVmaW5pdGlvbnMgPSAoCiAgICBCYXNlQ2hhbmdlID0+IHsKICAgICAgICBOYW1lICAgICA9PiAnQmFzZSBDaGFuZ2UgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICA9PiAnSVRTTUNoYW5nZScsCiAgICAgICAgVmFsaWRJRCAgPT4gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgQ2hhbmdlSUQgPT4gJENyZWF0ZWRDaGFuZ2VJRHtCYXNlQ2hhbmdlfSwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgfSwKICAgIFVuaWNvZGVDaGFuZ2UgPT4gewogICAgICAgIE5hbWUgICAgID0+ICdVbmljb2RlIENoYW5nZSBUZW1wbGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFR5cGUgICAgID0+ICdJVFNNQ2hhbmdlJywKICAgICAgICBWYWxpZElEICA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ3JlYXRlZENoYW5nZUlEe1VuaWNvZGVDaGFuZ2V9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICB9LAogICAgQVNDSUlXb3JrT3JkZXIgPT4gewogICAgICAgIE5hbWUgICAgICAgID0+ICdBc2NpaSBXb3JrT3JkZXIgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICAgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVmFsaWRJRCAgICAgPT4gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgV29ya09yZGVySUQgPT4gJENyZWF0ZWRXb3JrT3JkZXJJRHtBU0NJSVdvcmtPcmRlcn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgIH0sCiAgICBVbWxhdXRzV29ya09yZGVyID0+IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnVW1sYXV0cyBXb3JrT3JkZXIgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICAgICA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICAgICAgVmFsaWRJRCAgICAgPT4gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAndmFsaWQnICksCiAgICAgICAgV29ya09yZGVySUQgPT4gJENyZWF0ZWRXb3JrT3JkZXJJRHtVbWxhdXRzV29ya09yZGVyfSwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgfSwKICAgIFVuaWNvZGVXb3JrT3JkZXIgPT4gewogICAgICAgIE5hbWUgICAgICAgID0+ICdVbmljb2RlIFdvcmtPcmRlciBUZW1wbGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFR5cGUgICAgICAgID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICBWYWxpZElEICAgICA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkQ3JlYXRlZFdvcmtPcmRlcklEe1VuaWNvZGVXb3JrT3JkZXJ9LAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICB9LAogICAgQ0FCQ3VzdG9tZXJBZ2VudCA9PiB7CiAgICAgICAgTmFtZSAgICAgPT4gJ0N1c3RvbWVyIGFuZCBBZ2VudCBDQUIgVGVtcGxhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICBUeXBlICAgICA9PiAnQ0FCJywKICAgICAgICBWYWxpZElEICA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ3JlYXRlZENoYW5nZUlEe0Jhc2VDaGFuZ2V9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICB9LAogICAgU2ltcGxlQ29uZGl0aW9uID0+IHsKICAgICAgICBOYW1lICAgICAgICA9PiAnU2ltcGxlIENvbmRpdGlvbiBUZW1wbGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIFR5cGUgICAgICAgID0+ICdJVFNNQ29uZGl0aW9uJywKICAgICAgICBWYWxpZElEICAgICA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICBDb25kaXRpb25JRCA9PiAkQ3JlYXRlZENvbmRpdGlvbklEe1NpbXBsZUNvbmRpdGlvbn0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlbXBsYXRlRGVmaW5pdGlvbk5hbWUgKCBrZXlzICVUZW1wbGF0ZURlZmluaXRpb25zICkgewoKICAgICMgY3JlYXRlIHNpbXBsZSBjaGFuZ2UgdGVtcGxhdGUKICAgICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfS0+e0NvbnRlbnR9ID0KICAgICAgICAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVTZXJpYWxpemUoCiAgICAgICAgJXsgJFRlbXBsYXRlRGVmaW5pdGlvbnN7JFRlbXBsYXRlRGVmaW5pdGlvbk5hbWV9IH0sCiAgICAgICAgVGVtcGxhdGVUeXBlID0+ICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfS0+e1R5cGV9LAogICAgICAgICk7CgogICAgIyBjaGVjayBzZXJpYWxpemF0aW9uCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGVtcGxhdGVEZWZpbml0aW9uc3skVGVtcGxhdGVEZWZpbml0aW9uTmFtZX0tPntDb250ZW50fSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVNlcmlhbGl6ZSBmb3IgJFRlbXBsYXRlRGVmaW5pdGlvbk5hbWUiLAogICAgKTsKCiAgICAjIGFkZCB0ZW1wbGF0ZQogICAgJFRlc3RlZFRlbXBsYXRlSUR7JFRlbXBsYXRlRGVmaW5pdGlvbk5hbWV9ID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlQWRkKAogICAgICAgICV7ICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfSB9LAogICAgICAgIFRlbXBsYXRlVHlwZSA9PiAkVGVtcGxhdGVEZWZpbml0aW9uc3skVGVtcGxhdGVEZWZpbml0aW9uTmFtZX0tPntUeXBlfSwKICAgICk7CgogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskVGVtcGxhdGVEZWZpbml0aW9uTmFtZX07CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBJRAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRlbXBsYXRlSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gVGVtcGxhdGVBZGQgZm9yICRUZW1wbGF0ZURlZmluaXRpb25OYW1lIiwKICAgICk7CgogICAgIyBnZXQgY3JlYXRlZCB0ZW1wbGF0ZQogICAgbXkgJFRlbXBsYXRlID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGF0dHJpYnV0ZXMgbmFtZSwgdHlwZSBhbmQgY29udGVudAogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KE5hbWUgVHlwZSBDb250ZW50KSkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFRlbXBsYXRlLT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICRUZW1wbGF0ZURlZmluaXRpb25zeyRUZW1wbGF0ZURlZmluaXRpb25OYW1lfS0+eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSAkQXR0cmlidXRlIChUZW1wbGF0ZUlEOiAkVGVtcGxhdGVJRCkiLAogICAgICAgICk7CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIGNyZWF0ZSBvYmplY3RzIGJhc2VkIG9uIHRlbXBsYXRlcwpteSBAQ2hhbmdlSURzOwoKQ0hBTkdFVEVNUExBVEVOQU1FOgpmb3IgbXkgJENoYW5nZVRlbXBsYXRlTmFtZSAoIGtleXMgJUNyZWF0ZWRDaGFuZ2VJRCApIHsKCiAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskQ2hhbmdlVGVtcGxhdGVOYW1lfTsKCiAgICBuZXh0IENIQU5HRVRFTVBMQVRFTkFNRSBpZiAhJFRlbXBsYXRlSUQ7CgogICAgIyBkZXNlcmlhbGl6ZSB0ZW1wbGF0ZQogICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlRGVTZXJpYWxpemUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2hhbmdlIGlkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3JlYXRlIGNoYW5nZSBiYXNlZCBvbiB0ZW1wbGF0ZSAoVGVtcGxhdGVJRDogJFRlbXBsYXRlSUQpIiwKICAgICk7CgogICAgIyBnZXQgY2hhbmdlIGRhdGEKICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBjaGFuZ2UgYXR0cmlidXRlcwogICAgZm9yIG15ICRSZXF1ZXN0ZWRBdHRyaWJ1dGUgKCBrZXlzICV7ICRDaGFuZ2VEZWZpbml0aW9uc3skQ2hhbmdlVGVtcGxhdGVOYW1lfSB9ICkgewoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICA9IDE7CgogICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gQ2hhbmdlR2V0KCkKICAgICAgICBteSAkQ2hhbmdlQXR0cmlidXRlID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRDaGFuZ2UtPnskUmVxdWVzdGVkQXR0cmlidXRlfSApOwoKICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlCiAgICAgICAgICAgID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoCiAgICAgICAgICAgICRDaGFuZ2VEZWZpbml0aW9uc3skQ2hhbmdlVGVtcGxhdGVOYW1lfS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9CiAgICAgICAgICAgICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENoYW5nZUF0dHJpYnV0ZSwKICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgICAgICk7CiAgICB9CgogICAgcHVzaCBAQ2hhbmdlSURzLCAkQ2hhbmdlSUQ7CgogICAgJFRlc3RDb3VudCsrOwp9CgpXT1JLT1JERVJURU1QTEFURU5BTUU6CmZvciBteSAkV29ya09yZGVyVGVtcGxhdGVOYW1lICgga2V5cyAlQ3JlYXRlZFdvcmtPcmRlcklEICkgewoKICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRXb3JrT3JkZXJUZW1wbGF0ZU5hbWV9OwoKICAgIG5leHQgV09SS09SREVSVEVNUExBVEVOQU1FIGlmICEkVGVtcGxhdGVJRDsKCiAgICAjIGRlc2VyaWFsaXplIHRlbXBsYXRlCiAgICBteSAkV29ya09yZGVySUQgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVEZVNlcmlhbGl6ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIENoYW5nZUlEICAgPT4gJENyZWF0ZWRDaGFuZ2VJRHtUYXJnZXRDaGFuZ2V9LAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgIyBjaGVjayBjaGFuZ2UgaWQKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDcmVhdGUgd29ya29yZGVyIGJhc2VkIG9uIHRlbXBsYXRlIChUZW1wbGF0ZUlEOiAkVGVtcGxhdGVJRCkiLAogICAgKTsKCiAgICAjIGdldCBjaGFuZ2UgZGF0YQogICAgbXkgJFdvcmtPcmRlciA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyR2V0KAogICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIGNoYW5nZSBhdHRyaWJ1dGVzCiAgICBSRVFVRVNURURBVFRSSUJVVEU6CiAgICBmb3IgbXkgJFJlcXVlc3RlZEF0dHJpYnV0ZSAoIGtleXMgJXsgJFdvcmtPcmRlckRlZmluaXRpb25zeyRXb3JrT3JkZXJUZW1wbGF0ZU5hbWV9IH0gKSB7CgogICAgICAgIG5leHQgUkVRVUVTVEVEQVRUUklCVVRFIGlmICRSZXF1ZXN0ZWRBdHRyaWJ1dGUgZXEgJ0NoYW5nZUlEJzsKCiAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZUdldCgpCiAgICAgICAgbXkgJFdvcmtPcmRlckF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkV29ya09yZGVyLT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZQogICAgICAgICAgICA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKAogICAgICAgICAgICAkV29ya09yZGVyRGVmaW5pdGlvbnN7JFdvcmtPcmRlclRlbXBsYXRlTmFtZX0tPnskUmVxdWVzdGVkQXR0cmlidXRlfQogICAgICAgICAgICApOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRXb3JrT3JkZXJBdHRyaWJ1dGUsCiAgICAgICAgICAgICRSZWZlcmVuY2VBdHRyaWJ1dGUsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtICRSZXF1ZXN0ZWRBdHRyaWJ1dGUgKFdvcmtPcmRlcjogJFdvcmtPcmRlcklEKSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJFdvcmtPcmRlci0+e0NoYW5nZUlEfSwKICAgICAgICAkQ3JlYXRlZENoYW5nZUlEe1RhcmdldENoYW5nZX0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlSUQgKFdvcmtPcmRlcjogJFdvcmtPcmRlcklEKSIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKQ09ORElUSU9OVEVNUExBVEVOQU1FOgpmb3IgbXkgJENvbmRpdGlvblRlbXBsYXRlTmFtZSAoIGtleXMgJUNyZWF0ZWRDb25kaXRpb25JRCApIHsKCiAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskQ29uZGl0aW9uVGVtcGxhdGVOYW1lfTsKCiAgICBuZXh0IENPTkRJVElPTlRFTVBMQVRFTkFNRSBpZiAhJFRlbXBsYXRlSUQ7CgogICAgIyBkZXNlcmlhbGl6ZSB0ZW1wbGF0ZQogICAgbXkgJENvbmRpdGlvbklEID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlRGVTZXJpYWxpemUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBDaGFuZ2VJRCAgID0+ICRDcmVhdGVkQ2hhbmdlSUR7VGFyZ2V0Q2hhbmdlfSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgY2hhbmdlIGlkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ29uZGl0aW9uSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ3JlYXRlIGNvbmRpdGlvbiBiYXNlZCBvbiB0ZW1wbGF0ZSAoVGVtcGxhdGVJRDogJFRlbXBsYXRlSUQpIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIGdldCBuYW1lcyBvZiBDQUIgdGVtcGxhdGVzCm15IEBDQUJUZW1wbGF0ZU5hbWVzID0gZ3JlcCB7ICRUZW1wbGF0ZURlZmluaXRpb25zeyRffS0+e1R5cGV9IGVxICdDQUInIH0ga2V5cyAlVGVzdGVkVGVtcGxhdGVJRDsKCkNBQlRFTVBMQVRFTkFNRToKZm9yIG15ICRDQUJUZW1wbGF0ZU5hbWUgKEBDQUJUZW1wbGF0ZU5hbWVzKSB7CgogICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgIG15ICRUZW1wbGF0ZUlEID0gJFRlc3RlZFRlbXBsYXRlSUR7JENBQlRlbXBsYXRlTmFtZX07CgogICAgbmV4dCBDQUJURU1QTEFURU5BTUUgaWYgISRUZW1wbGF0ZUlEOwoKICAgICMgZGVzZXJpYWxpemUgdGVtcGxhdGUKICAgIG15ICRDaGFuZ2VJRCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZURlU2VyaWFsaXplKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIENoYW5nZUlEICAgPT4gJENyZWF0ZWRDaGFuZ2VJRHtUYXJnZXRDaGFuZ2V9LAogICAgKTsKCiAgICAjIGNoZWNrIGNoYW5nZSBpZAogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENoYW5nZUlELAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENyZWF0ZSBDQUIgYmFzZWQgb24gdGVtcGxhdGUgKFRlbXBsYXRlSUQ6ICRUZW1wbGF0ZUlEKSIsCiAgICApOwoKICAgICMgZ2V0IGNoYW5nZSBkYXRhCiAgICBteSAkQ2hhbmdlID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IG9yaWdpbmFsIGNoYW5nZQogICAgbXkgJE9yaWdDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ3JlYXRlZENoYW5nZUlEe0Jhc2VDaGFuZ2V9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICMgdHVybiBvZmYgYWxsIHByZXR0eSBwcmludAogICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICA9IDE7CgogICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBDaGFuZ2VHZXQoKQogICAgbXkgJENoYW5nZUF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKAogICAgICAgIFsgJENoYW5nZS0+e0NBQkFnZW50c30sICRDaGFuZ2UtPntDQUJDdXN0b21lcnN9LCBdCiAgICApOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKAogICAgICAgIFsgJE9yaWdDaGFuZ2UtPntDQUJBZ2VudHN9LCAkT3JpZ0NoYW5nZS0+e0NBQkN1c3RvbWVyc30sIF0KICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRDaGFuZ2VBdHRyaWJ1dGUsCiAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDQUIgZnJvbSB0ZW1wbGF0ZSAoQ2hhbmdlSUQ6ICRDaGFuZ2VJRCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgdGVzdCBUZW1wbGF0ZUxpc3QoKQpteSAkQ2hhbmdlVGVtcGxhdGVMaXN0ID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIFRlbXBsYXRlVHlwZSA9PiAnSVRTTUNoYW5nZScsCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCm15IEBDaGFuZ2VUZW1wbGF0ZU5hbWVzID0gZ3JlcCB7CiAgICAkVGVtcGxhdGVEZWZpbml0aW9uc3skX30tPntUeXBlfSBlcSAnSVRTTUNoYW5nZScKfSBrZXlzICVUZXN0ZWRUZW1wbGF0ZUlEOwoKZm9yIG15ICRDaGFuZ2VUZW1wbGF0ZU5hbWUgKEBDaGFuZ2VUZW1wbGF0ZU5hbWVzKSB7CiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRDaGFuZ2VUZW1wbGF0ZU5hbWV9OwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIGV4aXN0cyAkQ2hhbmdlVGVtcGxhdGVMaXN0LT57JFRlbXBsYXRlSUR9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoZWNrIENoYW5nZVRlbXBsYXRlICRUZW1wbGF0ZUlEIGluIFRlbXBsYXRlTGlzdCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKbXkgQFdvcmtPcmRlclRlbXBsYXRlTmFtZXMgPSBncmVwIHsKICAgICRUZW1wbGF0ZURlZmluaXRpb25zeyRffS0+e1R5cGV9IGVxICdJVFNNV29ya09yZGVyJwp9IGtleXMgJVRlc3RlZFRlbXBsYXRlSUQ7CgpteSAkV29ya09yZGVyVGVtcGxhdGVMaXN0ID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIFRlbXBsYXRlVHlwZSA9PiAnSVRTTVdvcmtPcmRlcicsCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCmZvciBteSAkV29ya09yZGVyVGVtcGxhdGVOYW1lIChAV29ya09yZGVyVGVtcGxhdGVOYW1lcykgewogICAgbXkgJFRlbXBsYXRlSUQgPSAkVGVzdGVkVGVtcGxhdGVJRHskV29ya09yZGVyVGVtcGxhdGVOYW1lfTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICBleGlzdHMgJFdvcmtPcmRlclRlbXBsYXRlTGlzdC0+eyRUZW1wbGF0ZUlEfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBDaGVjayBXb3JrT3JkZXJUZW1wbGF0ZSAkVGVtcGxhdGVJRCBpbiBUZW1wbGF0ZUxpc3QiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCm15IEBDb25kaXRpb25UZW1wbGF0ZU5hbWVzID0gZ3JlcCB7CiAgICAkVGVtcGxhdGVEZWZpbml0aW9uc3skX30tPntUeXBlfSBlcSAnSVRTTUNvbmRpdGlvbicKfSBrZXlzICVUZXN0ZWRUZW1wbGF0ZUlEOwoKbXkgJENvbmRpdGlvblRlbXBsYXRlTGlzdCA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICBUZW1wbGF0ZVR5cGUgPT4gJ0lUU01Db25kaXRpb24nLAogICAgVXNlcklEICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENvbmRpdGlvblRlbXBsYXRlTmFtZSAoQENvbmRpdGlvblRlbXBsYXRlTmFtZXMpIHsKICAgIG15ICRUZW1wbGF0ZUlEID0gJFRlc3RlZFRlbXBsYXRlSUR7JENvbmRpdGlvblRlbXBsYXRlTmFtZX07CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgZXhpc3RzICRDb25kaXRpb25UZW1wbGF0ZUxpc3QtPnskVGVtcGxhdGVJRH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hlY2sgQ29uZGl0aW9uVGVtcGxhdGUgJFRlbXBsYXRlSUQgaW4gVGVtcGxhdGVMaXN0IiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgpteSAkQ0FCVGVtcGxhdGVMaXN0ID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlTGlzdCgKICAgIFRlbXBsYXRlVHlwZSA9PiAnQ0FCJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKZm9yIG15ICRDQUJUZW1wbGF0ZU5hbWUgKEBDQUJUZW1wbGF0ZU5hbWVzKSB7CiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRDQUJUZW1wbGF0ZU5hbWV9OwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIGV4aXN0cyAkQ0FCVGVtcGxhdGVMaXN0LT57JFRlbXBsYXRlSUR9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIENoZWNrIENBQlRlbXBsYXRlICRUZW1wbGF0ZUlEIGluIFRlbXBsYXRlTGlzdCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyB0ZXN0IFRlbXBsYXRlU2VhcmNoKCkKCiMgdGVzdCBUZW1wbGF0ZVVwZGF0ZSgpCm15ICVOZXdWYWx1ZXM7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2xlYW4gdGhlIHN5c3RlbQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKKTsKCiMgZGVsZXRlIHRoZSB0ZXN0IHRlbXBsYXRlcwpmb3IgbXkgJFRlbXBsYXRlTmFtZSAoIGtleXMgJVRlc3RlZFRlbXBsYXRlSUQgKSB7CiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZXN0ZWRUZW1wbGF0ZUlEeyRUZW1wbGF0ZU5hbWV9OwoKICAgIG15ICREZWxldGVPayA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRGVsZXRlT2ssCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSIKICAgICk7CgogICAgIyBkb3VibGUgY2hlY2sgaWYgY2hhbmdlIGlzIHJlYWxseSBkZWxldGVkCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0tPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlRGVsZXRlKCkgLSBkb3VibGUgY2hlY2siLAogICAgKTsKfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgZGVsZXRlIHRoZSB0ZXN0IGNoYW5nZXMKZm9yIG15ICRDaGFuZ2VJRCAoIEBDaGFuZ2VJRHMsIHZhbHVlcyAlQ3JlYXRlZENoYW5nZUlEICkgewogICAgbXkgJERlbGV0ZU9rID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VEZWxldGUoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJERlbGV0ZU9rLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZURlbGV0ZSgpIgogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBpZiBjaGFuZ2UgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkQ2hhbmdlRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VEZWxldGUoKSAtIGRvdWJsZSBjaGVjayIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKc3ViIF9BY3Rpb25BZGQgewogICAgbXkgKCAkQWN0aW9uRGF0YSwgJENvbmRpdGlvbklEICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRBY3Rpb25EYXRhOwogICAgcmV0dXJuIGlmIHJlZiAkQWN0aW9uRGF0YSBuZSAnSEFTSCc7CgogICAgIyBoYXNoIGZvciBhZGRpbmcKICAgIG15ICVBY3Rpb25BZGQ7CgogICAgIyBzZXQgc3RhdGljIGZpZWxkcwogICAgbXkgQFN0YXRpY0ZpZWxkcyA9IHF3KCBTZWxlY3RvciBBY3Rpb25WYWx1ZSBVc2VySUQgQ29uZGl0aW9uSUQgKTsKCiAgICBTVEFUSUNGSUVMRDoKICAgIGZvciBteSAkU3RhdGljRmllbGQgKEBTdGF0aWNGaWVsZHMpIHsKCiAgICAgICAgIyBvbW1pdCBzdGF0aWMgZmllbGQgaWYgaXQgaXMgbm90IHNldAogICAgICAgIG5leHQgU1RBVElDRklFTEQgaWYgIWV4aXN0cyAkQWN0aW9uRGF0YS0+eyRTdGF0aWNGaWVsZH07CiAgICAgICAgbmV4dCBTVEFUSUNGSUVMRCBpZiAhZGVmaW5lZCAkQWN0aW9uRGF0YS0+eyRTdGF0aWNGaWVsZH07CgogICAgICAgICMgc2FmZSBkYXRhCiAgICAgICAgJEFjdGlvbkFkZHskU3RhdGljRmllbGR9ID0gJEFjdGlvbkRhdGEtPnskU3RhdGljRmllbGR9OwogICAgfQoKICAgICMgZ2V0IGFsbCBmaWVsZHMgZm9yIEFjdGlvbkFkZAogICAgZm9yIG15ICRBY3Rpb25BZGRWYWx1ZSAoIGtleXMgJXskQWN0aW9uRGF0YX0gKSB7CgogICAgICAgICMgb21taXQgc3RhdGljIGZpZWxkcwogICAgICAgIG5leHQgaWYgZ3JlcCB7ICRfIGVxICRBY3Rpb25BZGRWYWx1ZSB9IEBTdGF0aWNGaWVsZHM7CgogICAgICAgICMgZ2V0IHZhbHVlcyBmb3IgZmllbGRzCiAgICAgICAgZm9yIG15ICRGaWVsZFZhbHVlICgga2V5cyAleyAkQWN0aW9uRGF0YS0+eyRBY3Rpb25BZGRWYWx1ZX0gfSApIHsKCiAgICAgICAgICAgICMgc3RvcmUgZ2F0aGVyZWQgaW5mb3JtYXRpb24gaW4gaGFzaCBmb3IgYWRkaW5nCiAgICAgICAgICAgICRBY3Rpb25BZGR7JEFjdGlvbkFkZFZhbHVlfQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmRpdGlvbk9iamVjdH0tPiRGaWVsZFZhbHVlKAogICAgICAgICAgICAgICAgJXsgJEFjdGlvbkRhdGEtPnskQWN0aW9uQWRkVmFsdWV9LT57JEZpZWxkVmFsdWV9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24KICAgIG15ICRBY3Rpb25JRCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+QWN0aW9uQWRkKAogICAgICAgICVBY3Rpb25BZGQsCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgKSB8fCAwOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBY3Rpb25JRCwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkFkZCAtPiAkQWN0aW9uSUQiLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBBY3Rpb25JRAogICAgcmV0dXJuIGlmICEkQWN0aW9uSUQ7CgogICAgIyBjaGVjayB0aGUgYWRkZWQgYWN0aW9uCiAgICBteSAkQWN0aW9uR2V0ID0gJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT5BY3Rpb25HZXQoCiAgICAgICAgQWN0aW9uSUQgPT4gJEFjdGlvbklELAogICAgICAgIFVzZXJJRCAgID0+ICRBY3Rpb25BZGR7VXNlcklEfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQWN0aW9uR2V0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gQWN0aW9uQWRkKCk6IEFjdGlvbkdldCcsCiAgICApOwoKICAgICMgZGVsZXRlIFVzZXJJRCwgaXQgaXMgbm90IHJldHVybmVkCiAgICBkZWxldGUgJEFjdGlvbkFkZHtVc2VySUR9OwoKICAgICMgdGVzdCB2YWx1ZXMKICAgIGZvciBteSAkVGVzdFZhbHVlICgga2V5cyAlQWN0aW9uQWRkICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJEFjdGlvbkdldC0+eyRUZXN0VmFsdWV9LAogICAgICAgICAgICAkQWN0aW9uQWRkeyRUZXN0VmFsdWV9LAogICAgICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIiAtIEFjdGlvbkFkZCgpOiBBY3Rpb25HZXQgLT4gJFRlc3RWYWx1ZSIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEFjdGlvbklEOwp9CgpzdWIgX0V4cHJlc3Npb25BZGQgewogICAgbXkgKCAkRXhwcmVzc2lvbkRhdGEsICRDb25kaXRpb25JRCApID0gQF87CiAgICBteSAlRXhwcmVzc2lvbkFkZFNvdXJjZURhdGEgPSAleyRFeHByZXNzaW9uRGF0YX07CgogICAgbXkgJUV4cHJlc3Npb25BZGREYXRhOwoKICAgICMgc2V0IHN0YXRpYyBmaWVsZHMKICAgIG15IEBTdGF0aWNGaWVsZHMgPSBxdyggU2VsZWN0b3IgQ29tcGFyZVZhbHVlIFVzZXJJRCBDb25kaXRpb25JRCApOwoKICAgIFNUQVRJQ0ZJRUxEOgogICAgZm9yIG15ICRTdGF0aWNGaWVsZCAoQFN0YXRpY0ZpZWxkcykgewoKICAgICAgICAjIG9tbWl0IHN0YXRpYyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0CiAgICAgICAgbmV4dCBTVEFUSUNGSUVMRCBpZiAhZXhpc3RzICRFeHByZXNzaW9uQWRkU291cmNlRGF0YXskU3RhdGljRmllbGR9CiAgICAgICAgICAgICAgICB8fCAhZGVmaW5lZCAkRXhwcmVzc2lvbkFkZFNvdXJjZURhdGF7JFN0YXRpY0ZpZWxkfTsKCiAgICAgICAgIyBzYWZlIGRhdGEKICAgICAgICAkRXhwcmVzc2lvbkFkZERhdGF7JFN0YXRpY0ZpZWxkfSA9ICRFeHByZXNzaW9uQWRkU291cmNlRGF0YXskU3RhdGljRmllbGR9OwogICAgfQoKICAgICMgZ2V0IGFsbCBmaWVsZHMgZm9yIEV4cHJlc3Npb25BZGQKICAgIGZvciBteSAkRXhwcmVzc2lvbkFkZFZhbHVlICgga2V5cyAlRXhwcmVzc2lvbkFkZFNvdXJjZURhdGEgKSB7CgogICAgICAgICMgb21taXQgc3RhdGljIGZpZWxkcwogICAgICAgIG5leHQgaWYgZ3JlcCB7ICRfIGVxICRFeHByZXNzaW9uQWRkVmFsdWUgfSBAU3RhdGljRmllbGRzOwoKICAgICAgICAjIGdldCB2YWx1ZXMgZm9yIGZpZWxkcwogICAgICAgIGZvciBteSAkRmllbGRWYWx1ZSAoIGtleXMgJXsgJEV4cHJlc3Npb25BZGRTb3VyY2VEYXRheyRFeHByZXNzaW9uQWRkVmFsdWV9IH0gKSB7CgogICAgICAgICAgICAjIHN0b3JlIGdhdGhlcmVkIGluZm9ybWF0aW9uIGluIGhhc2ggZm9yIGFkZGluZwogICAgICAgICAgICAkRXhwcmVzc2lvbkFkZERhdGF7JEV4cHJlc3Npb25BZGRWYWx1ZX0gPQogICAgICAgICAgICAgICAgJFNlbGYtPntDb25kaXRpb25PYmplY3R9LT4kRmllbGRWYWx1ZSgKICAgICAgICAgICAgICAgICV7ICRFeHByZXNzaW9uQWRkU291cmNlRGF0YXskRXhwcmVzc2lvbkFkZFZhbHVlfS0+eyRGaWVsZFZhbHVlfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZXhwcmVzc2lvbgogICAgbXkgJEV4cHJlc3Npb25JRCA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbkFkZCgKICAgICAgICAlRXhwcmVzc2lvbkFkZERhdGEsCiAgICAgICAgQ29uZGl0aW9uSUQgPT4gJENvbmRpdGlvbklELAogICAgKSB8fCAwOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRFeHByZXNzaW9uSUQsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICIgLSAkRXhwcmVzc2lvbklEIiwKICAgICk7CgogICAgbmV4dCBDUkVBVEVEQVRBIGlmICEkRXhwcmVzc2lvbklEOwoKICAgICMgY2hlY2sgdGhlIGFkZGVkIGV4cHJlc3Npb24KICAgIG15ICRFeHByZXNzaW9uR2V0RGF0YSA9ICRTZWxmLT57Q29uZGl0aW9uT2JqZWN0fS0+RXhwcmVzc2lvbkdldCgKICAgICAgICBFeHByZXNzaW9uSUQgPT4gJEV4cHJlc3Npb25JRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJEV4cHJlc3Npb25BZGREYXRhe1VzZXJJRH0sCiAgICApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEV4cHJlc3Npb25HZXREYXRhLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAnIC0gRXhwcmVzc2lvbkFkZCgpOiBFeHByZXNzaW9uR2V0JywKICAgICk7CgogICAgIyB0ZXN0IHZhbHVlcwogICAgZGVsZXRlICRFeHByZXNzaW9uQWRkRGF0YXtVc2VySUR9OwogICAgZm9yIG15ICRUZXN0VmFsdWUgKCBrZXlzICVFeHByZXNzaW9uQWRkRGF0YSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRFeHByZXNzaW9uR2V0RGF0YS0+eyRUZXN0VmFsdWV9LAogICAgICAgICAgICAkRXhwcmVzc2lvbkFkZERhdGF7JFRlc3RWYWx1ZX0sCiAgICAgICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiIC0gRXhwcmVzc2lvbkFkZCgpOiBFeHByZXNzaW9uR2V0IC0+ICRUZXN0VmFsdWUiLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRFeHByZXNzaW9uSUQ7Cn0KCjE7Cg==
IyAtLQojIElUU01Xb3JrT3JkZXIudCAtIHdvcmtvcmRlciB0ZXN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTVdvcmtPcmRlci50LHYgMS4xMjkgMjAxMC8wNy8wMyAwMDozOToyNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIHF3KCRTZWxmKTsKCnVzZSBEYXRhOjpEdW1wZXI7CnVzZSBMaXN0OjpVdGlsIHF3KG1heCk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgJFRlc3RDb3VudCA9IDE7CgojIGNyZWF0ZSBjb21tb24gb2JqZWN0cwokU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57R3JvdXBPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CiRTZWxmLT57Q2hhbmdlT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2UtPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0+bmV3KCAleyRTZWxmfSApOwoKIyB0ZXN0IGlmIHdvcmtvcmRlciBvYmplY3Qgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5UcnVlKAogICAgJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LAogICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICcgLSBjb25zdHJ1Y3Rpb24gb2Ygd29ya29yZGVyIG9iamVjdCcsCik7CiRTZWxmLT5JcygKICAgIHJlZiAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0sCiAgICAnS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXInLAogICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICcgLSBjbGFzcyBvZiB3b3Jrb3JkZXIgb2JqZWN0JywKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgQFVzZXJJRHM7ICAgICAgICAgICAgICAgIyBhIGxpc3Qgb2YgZXhpc3RpbmcgYW5kIHZhbGlkIHVzZXIgaWRzCm15IEBJbnZhbGlkVXNlcklEczsgICAgICAgICMgYSBsaXN0IG9mIGV4aXN0aW5nIGJ1dCBpbnZhbGlkIHVzZXIgaWRzCm15IEBOb25FeGlzdGluZ1VzZXJJRHM7ICAgICMgYSBsaXN0IG9mIG5vbi1leGlzdGlvbiB1c2VyIGlkcwoKIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKbXkgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hlY2tFbWFpbEFkZHJlc3NlcycpOwppZiAoICFkZWZpbmVkICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnICkgewogICAgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgPSAxOwp9CiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCmZvciBteSAkQ291bnRlciAoIDEgLi4gMyApIHsKCiAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnSVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlcicgLiAkQ291bnRlciwKICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtSVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0nIC4gJENvdW50ZXIgLiBpbnQgcmFuZCAxXzAwMF8wMDAsCiAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtSVRTTUNoYW5nZTo6SVRTTVdvcmtPcmRlci0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICd2YWxpZCcgKSwKICAgICAgICBDaGFuZ2VVc2VySUQgID0+IDEsCiAgICApOwogICAgcHVzaCBAVXNlcklEcywgJFVzZXJJRDsKfQoKIyBzb3J0IHRoZSB1c2VyIGFuZCBjdXN0b21lciB1c2VyIGFycmF5cwpAVXNlcklEcyA9IHNvcnQgQFVzZXJJRHM7CgojIGNyZWF0ZSBub24gZXhpc3RpbmcgdXNlciBJRHMKZm9yICggMSAuLiAyICkgewogICAgTFBDOgogICAgZm9yIG15ICRMb29wUHJvdGVjdGlvbkNvdW50ZXIgKCAxIC4uIDEwMCApIHsKCiAgICAgICAgIyBjcmVhdGUgYSByYW5kb20gdXNlciBpZAogICAgICAgIG15ICRUZW1wTm9uRXhpc3RpbmdVc2VySUQgPSBpbnQgcmFuZCAxXzAwMF8wMDA7CgogICAgICAgICMgY2hlY2sgaWYgcmFuZG9tIHVzZXIgaWQgZXhpc3RzIGFscmVhZHkKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRUZW1wTm9uRXhpc3RpbmdVc2VySUQsCiAgICAgICAgKTsKICAgICAgICBuZXh0IExQQyBpZiAlVXNlckRhdGE7CgogICAgICAgICMgd2UgZ290IGFuIHVudXNlZCB1c2VyIElECiAgICAgICAgcHVzaCBATm9uRXhpc3RpbmdVc2VySURzLCAkVGVtcE5vbkV4aXN0aW5nVXNlcklEOwogICAgICAgIGxhc3QgTFBDOwogICAgfQp9CgojIHNldCAzcmQgdXNlciBpbnZhbGlkCiRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJVcGRhdGUoCiAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMl0sCiAgICApLAogICAgVmFsaWRJRCA9PiAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoIFZhbGlkID0+ICdpbnZhbGlkJyApLAogICAgQ2hhbmdlVXNlcklEID0+IDEsCik7CnB1c2ggQEludmFsaWRVc2VySURzLCBwb3AgQFVzZXJJRHM7CgojIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZywKKTsKCiMgdHVybiBvZmYgU2VuZE5vdGlmaWNhdGlvbnMsIGluIG9yZGVyIHRvIGF2b2lkIGEgbG90IG9mIHVzZWxlc3MgbWFpbHMKbXkgJFNlbmROb3RpZmljYXRpb25zT3JnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmNhdGlvbnMnKTsKJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnSVRTTUNoYW5nZTo6U2VuZE5vdGlmaWNhdGlvbnMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IElUU01Xb3JrT3JkZXIgQVBJCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGVmaW5lIHB1YmxpYyBpbnRlcmZhY2UgKGluIGFscGhhYmV0aWNhbCBvcmRlcikKbXkgQE9iamVjdE1ldGhvZHMgPSBxdygKICAgIFBlcm1pc3Npb24KICAgIFdvcmtPcmRlckFkZAogICAgV29ya09yZGVyQXR0YWNobWVudEFkZAogICAgV29ya09yZGVyQXR0YWNobWVudERlbGV0ZQogICAgV29ya09yZGVyQXR0YWNobWVudEV4aXN0cwogICAgV29ya09yZGVyQXR0YWNobWVudEdldAogICAgV29ya09yZGVyQXR0YWNobWVudExpc3QKICAgIFdvcmtPcmRlckNoYW5nZUVmZm9ydHNHZXQKICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQKICAgIFdvcmtPcmRlckRlbGV0ZQogICAgV29ya09yZGVyR2V0CiAgICBXb3JrT3JkZXJHZXRDb25maWd1cmVkRnJlZVRleHRGaWVsZHMKICAgIFdvcmtPcmRlckxpc3QKICAgIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0CiAgICBXb3JrT3JkZXJTZWFyY2gKICAgIFdvcmtPcmRlclN0YXRlSURzQ2hlY2sKICAgIFdvcmtPcmRlclN0YXRlTG9va3VwCiAgICBXb3JrT3JkZXJUeXBlTGlzdAogICAgV29ya09yZGVyVHlwZUxvb2t1cAogICAgV29ya09yZGVyVXBkYXRlCik7CgojIGNoZWNrIGlmIHN1YnMgYXJlIGF2YWlsYWJsZQpmb3IgbXkgJE9iamVjdE1ldGhvZCAoQE9iamVjdE1ldGhvZHMpIHsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+Y2FuKCRPYmplY3RNZXRob2QpLAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgJ2NhbiAkT2JqZWN0TWV0aG9kJyIKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBzZWFyY2ggZm9yIGRlZmF1bHQgSVRTTVdvcmtPcmRlciBTdGF0ZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBkZWZhdWx0IElUU01Xb3JrT3JkZXIgU3RhdGVzCiMgY2FuJ3QgdXNlIHF3IGR1ZSB0byBzcGFjZXMgaW4gc3RhdGVzCm15IEBEZWZhdWx0V29ya09yZGVyU3RhdGVzID0gKAogICAgJ2NyZWF0ZWQnLAogICAgJ2FjY2VwdGVkJywKICAgICdyZWFkeScsCiAgICAnaW4gcHJvZ3Jlc3MnLAogICAgJ2Nsb3NlZCcsCiAgICAnY2FuY2VsZWQnLAopOwoKIyBnZXQgaXRlbSBsaXN0IG9mIHRoZSB3b3Jrb3JkZXIgc3RhdGVzIHdpdGggc3dhcHBlZCBrZXlzIGFuZCB2YWx1ZXMKbXkgJVdvcmtPcmRlclN0YXRlSUQyTmFtZSA9ICV7CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OldvcmtPcmRlcjo6U3RhdGUnLAogICAgICAgICkgfHwge30KICAgIH07Cm15ICVXb3JrT3JkZXJTdGF0ZU5hbWUySUQgICA9IHJldmVyc2UgJVdvcmtPcmRlclN0YXRlSUQyTmFtZTsKbXkgQFNvcnRlZFdvcmtPcmRlclN0YXRlSURzID0gc29ydCBrZXlzICVXb3JrT3JkZXJTdGF0ZUlEMk5hbWU7CgojIGNoZWNrIGlmIHN0YXRlcyBhcmUgaW4gR2VuZXJhbENhdGFsb2cKZm9yIG15ICREZWZhdWx0V29ya09yZGVyU3RhdGUgKEBEZWZhdWx0V29ya09yZGVyU3RhdGVzKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkV29ya09yZGVyU3RhdGVOYW1lMklEeyREZWZhdWx0V29ya09yZGVyU3RhdGV9LAogICAgICAgICJUZXN0ICIgLiAkVGVzdENvdW50KysgLiAiIC0gY2hlY2sgc3RhdGUgJyREZWZhdWx0V29ya09yZGVyU3RhdGUnIgogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3QgdGhlIHN0YXRlIGxvb2t1cCBtZXRob2QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBpbnZlc3RpZ2F0ZSB0aGUgZGVmYXVsdCBzdGF0ZXMKZm9yIG15ICRTdGF0ZSAoQERlZmF1bHRXb3JrT3JkZXJTdGF0ZXMpIHsKCiAgICAjIGxvb2sgdXAgdGhlIHN0YXRlIG5hbWUKICAgIG15ICRMb29rZWRVcFN0YXRlSUQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclN0YXRlTG9va3VwKAogICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICRTdGF0ZSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRMb29rZWRVcFN0YXRlSUQsCiAgICAgICAgJFdvcmtPcmRlclN0YXRlTmFtZTJJRHskU3RhdGV9LAogICAgICAgICJMb29rIHVwIHN0YXRlICckU3RhdGUnIiwKICAgICk7CgogICAgIyBkbyB0aGUgcmV2ZXJzZSBsb29rdXAKICAgIG15ICRMb29rZWRVcFN0YXRlID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRMb29rZWRVcFN0YXRlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkTG9va2VkVXBTdGF0ZSwKICAgICAgICAkU3RhdGUsCiAgICAgICAgIkxvb2sgdXAgc3RhdGUgaWQgJyRMb29rZWRVcFN0YXRlSUQnIiwKICAgICk7Cn0KCiMgbm93IHNvbWUgcGFyYW0gY2hlY2tzCm15ICRMb29rdXBPSyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU3RhdGVMb29rdXAoKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPSywKICAgICdObyBwYXJhbXMgcGFzc2VkIHRvIFdvcmtPcmRlclN0YXRlTG9va3VwKCknLAopOwoKJExvb2t1cE9LID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTdGF0ZUxvb2t1cCgKICAgIFdvcmtPcmRlclN0YXRlICAgPT4gJ2FwcHJvdmVkJywKICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gMiwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRMb29rdXBPSywKICAgICdFeGNsdXNpdmUgcGFyYW1zIHBhc3NlZCB0byBXb3JrT3JkZXJTdGF0ZUxvb2t1cCgpJywKKTsKCiRMb29rdXBPSyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICBTdGF0ZSA9PiAnYXBwcm92ZWQnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJExvb2t1cE9LLAogICAgIkluY29ycmVjdCBwYXJhbSAnU3RhdGUnIHBhc3NlZCB0byBXb3JrT3JkZXJTdGF0ZUxvb2t1cCgpIiwKKTsKCiRMb29rdXBPSyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyU3RhdGVMb29rdXAoCiAgICBTdGF0ZUlEID0+IDIsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkTG9va3VwT0ssCiAgICAiSW5jb3JyZWN0IHBhcmFtICdTdGF0ZUlEJyBwYXNzZWQgdG8gV29ya09yZGVyU3RhdGVMb29rdXAoKSIsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgc2VhcmNoIGZvciBkZWZhdWx0IElUU01Xb3JrT3JkZXItdHlwZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBkZWZhdWx0IElUU01Xb3JrT3JkZXItc3RhdGVzCiMgY2FuJ3QgdXNlIHF3IGR1ZSB0byBzcGFjZXMgaW4gdHlwZXMKbXkgQERlZmF1bHRXb3JrT3JkZXJUeXBlcyA9ICgKICAgICdhcHByb3ZhbCcsCiAgICAnd29ya29yZGVyJywKICAgICdiYWNrb3V0JywKICAgICdkZWNpc2lvbicsCiAgICAncGlyJywKKTsKCiMgZ2V0IGNsYXNzIGxpc3Qgd2l0aCBzd2FwcGVkIGtleXMgYW5kIHZhbHVlcwpteSAlV29ya09yZGVyVHlwZUlEMk5hbWUgPSAlewogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlR5cGUnLAogICAgICAgICkgfHwge30KICAgIH07Cm15ICVXb3JrT3JkZXJUeXBlTmFtZTJJRCA9IHJldmVyc2UgJVdvcmtPcmRlclR5cGVJRDJOYW1lOwpteSBAU29ydGVkVHlwZUlEcyAgICAgICAgPSBzb3J0IGtleXMgJVdvcmtPcmRlclR5cGVJRDJOYW1lOwoKIyBjaGVjayBpZiB0eXBlcyBhcmUgaW4gR2VuZXJhbENhdGFsb2cKZm9yIG15ICREZWZhdWx0V29ya09yZGVyVHlwZSAoQERlZmF1bHRXb3JrT3JkZXJUeXBlcykgewogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFdvcmtPcmRlclR5cGVOYW1lMklEeyREZWZhdWx0V29ya09yZGVyVHlwZX0sCiAgICAgICAgIlRlc3QgIiAuICRUZXN0Q291bnQrKyAuICIgLSBjaGVjayB0eXBlICckRGVmYXVsdFdvcmtPcmRlclR5cGUnIgogICAgKTsKfQoKIyB0ZXN0IGxvb2t1cCBtZXRob2QKZm9yIG15ICREZWZhdWx0V29ya09yZGVyVHlwZSAoQERlZmF1bHRXb3JrT3JkZXJUeXBlcykgewogICAgbXkgJFR5cGVJRCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVHlwZUxvb2t1cCgKICAgICAgICBXb3JrT3JkZXJUeXBlID0+ICREZWZhdWx0V29ya09yZGVyVHlwZSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRUeXBlSUQsCiAgICAgICAgJFdvcmtPcmRlclR5cGVOYW1lMklEeyREZWZhdWx0V29ya09yZGVyVHlwZX0sCiAgICAgICAgIkxvb2t1cCAkRGVmYXVsdFdvcmtPcmRlclR5cGUiLAogICAgKTsKCiAgICBteSAkVHlwZU5hbWUgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclR5cGVMb29rdXAoCiAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRUeXBlSUQsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkVHlwZU5hbWUsCiAgICAgICAgJERlZmF1bHRXb3JrT3JkZXJUeXBlLAogICAgICAgICJMb29rdXAgJFR5cGVJRCIsCiAgICApOwp9CgojIHRlc3QgdGhlIG1ldGhvZCBXb3JrT3JkZXJUeXBlTGlzdCgpLiBJdCBzaG91bGQgcmV0dXJuIGEgbGlzdCBvZiBhbGwgdHlwZXMuCm15ICRUeXBlc0xpc3RVbmRlclRlc3QgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclR5cGVMaXN0KAogICAgVXNlcklEID0+IDEsCikgfHwge307CgojIGRvIHRoZSBjaGVja3MKZm9yIG15ICRUeXBlSUQgKEBTb3J0ZWRUeXBlSURzKSB7CiAgICBteSAoICRGaXJzdEhhc2hSZWYsICRTZWNvbmRIYXNoUmVmICkKICAgICAgICA9IGdyZXAgeyAkXy0+e0tleX0gPT0gJFR5cGVJRCB9IEB7JFR5cGVzTGlzdFVuZGVyVGVzdH07CgogICAgIyBhIG1hdGNoIGlzIGV4cGVjdGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRmlyc3RIYXNoUmVmLAogICAgICAgICJDaGVjayBmb3IgdHlwZSBpZCAkVHlwZUlEIiwKICAgICk7CgogICAgIyB0aGUgbmFtZSBzaG91bGQgYWxzbyBtYXRjaAogICAgJEZpcnN0SGFzaFJlZiB8fD0ge307CiAgICBteSAkVHlwZU5hbWUgPSAkV29ya09yZGVyVHlwZUlEMk5hbWV7JFR5cGVJRH07CiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEZpcnN0SGFzaFJlZi0+e1ZhbHVlfSwKICAgICAgICAkVHlwZU5hbWUsCiAgICAgICAgIkNoZWNrIGZvciB0eXBlIG5hbWUgJFR5cGVJRCIsCiAgICApOwoKICAgICMgb25seSBvbmUgbWF0Y2ggaXMgZXhwZWN0ZWQKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU2Vjb25kSGFzaFJlZiwKICAgICAgICAiQ2hlY2sgdGhhdCB0aGUgdHlwZSBpZCAkVHlwZUlEIGlzIHJldHVybmVkIG9ubHkgb25jZS4iLAogICAgKTsKCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBEZWZpbmUgdGhlIGNoYW5nZXMgdGhhdCBhcmUgbmVlZGVkIGZvciB0ZXN0aW5nIHdvcmtvcmRlcnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBzdG9yZSBjdXJyZW50IFRlc3RDb3VudCBmb3IgYmV0dGVyIHRlc3QgY2FzZSByZWNvZ25pdGlvbgpteSAkVGVzdENvdW50TWlzYyA9ICRUZXN0Q291bnQ7CgojIEFuIHVuaXF1ZSBpbmRlbnRpZmllciwgc28gdGhhdCBkYXRhIGZyb20gZGlmZmVyZW50IHRlc3QgcnVucwojIHdvbid0IGJlIG1peGVkIHVwLiBUaGUgc3RyaW5nIGlzIGZvcm1hdGVkIHRvIGEgY29uc3RhbnQgbGVuZ3RoLAojIGFzIHRoZSBjb252ZXJzaW9uIHRvIHBsYWluIHRleHQgd2l0aCBUb0FzY2lpKCkgZGVwZW5kcyBvbiB0aGUgc3RyaW5nIGxlbmd0aC4KbXkgJFVuaXF1ZVNpZ25hdHVyZSA9IHNwcmludGYgJ1VuaXRUZXN0LUlUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItJTA2ZF8lMDEwZCcsCiAgICBpbnQoIHJhbmQgMV8wMDBfMDAwICksCiAgICB0aW1lKCk7CgpteSBAQ2hhbmdlVGVzdHMgPSAoCgogICAgIyBhIGNoYW5nZSBmb3IgZ2VuZXJhbCB3b3Jrb3JkZXIgdGVzdGluZwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2UgZm9yIGdlbmVyYWwgdGVzdGluZyBvZiB3b3Jrb3JkZXJzLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NoYW5nZSAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQ2hhbmdlIDEgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYSBjaGFuZ2UgZm9yIE9yZGVyQnkgd29ya29yZGVyIHNlYXJjaGVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZSBmb3IgdGVzdGluZyBPcmRlckJ5IHdvcmtvcmRlciBzZWFyY2hlcy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2UgMiAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NoYW5nZSAyIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGEgY2hhbmdlIGZvciB0ZXN0aW5nIHN0cmluZyBzZWFyY2hlcyBpbiB0aGUgYXNzb2NpYXRlZCBjaGFuZ2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlIGZvciB0ZXN0aW5nIHN0cmluZyBzZWFyY2hlcyBpbiBjaGFuZ2UuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSAgID0+ICdDaGFuZ2UgMyAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdDaGFuZ2UgMyAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uID0+ICdDaGFuZ2UgMyAtIEp1c3RpZmljYXRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlICAgPT4gJ0NoYW5nZSAzIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0NoYW5nZSAzIC0gRGVzY3JpcHRpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gPT4gJ0NoYW5nZSAzIC0gSnVzdGlmaWNhdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYSBjaGFuZ2UgZm9yIHRlc3RpbmcgdGltZSBzZWFyY2hlcyBpbiB3b3Jrb3JkZXJzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZSBmb3IgdGVzdGluZyB0aW1lIHNlYXJjaGVzIGluIHdvcmtvcmRlcnMgLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NoYW5nZSA0IGZvciB0ZXN0aW5nIHRpbWUgc2VhcmNoZXMgaW4gd29ya29yZGVyIC0gVGl0bGUgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAnQ2hhbmdlIDQgZm9yIHRlc3RpbmcgdGltZSBzZWFyY2hlcyBpbiB3b3Jrb3JkZXIgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhIGNoYW5nZSBmb3IgdGVzdGluZyB0aGUgUGVybWlzc2lvbigpIG1ldGhvZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdDaGFuZ2UgZm9yIHRlc3RpbmcgdGhlIFBlcm1pc3Npb24oKSBtZXRob2QnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2UgNSBmb3IgdGVzdGluZyB0aGUgUGVybWlzc2lvbigpIG1ldGhvZCcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdDaGFuZ2UgNSBmb3IgdGVzdGluZyB0aGUgUGVybWlzc2lvbigpIG1ldGhvZCcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBDaGFuZ2VDQUJHZXQgPT4gewogICAgICAgICAgICAgICAgQ0FCQWdlbnRzID0+IFsKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBDQUJDdXN0b21lcnMgPT4gWwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDcmVhdGUgdGhlIGNoYW5nZXMgdGhhdCBhcmUgbmVlZGVkIGZvciB0ZXN0aW5nIHdvcmtvcmRlcnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjaGFuZ2UgaWRzIG9mIGNyZWF0ZWQgY2hhbmdlcwpteSAlVGVzdGVkQ2hhbmdlSUQ7CgpURVNUOgpmb3IgbXkgJFRlc3QgKEBDaGFuZ2VUZXN0cykgewoKICAgICMgY2hlY2sgU291cmNlRGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U291cmNlRGF0YX0gfHwgcmVmICRUZXN0LT57U291cmNlRGF0YX0gbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTm8gU291cmNlRGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0ICh0ZXN0IGNhc2U6ICIKICAgICAgICAgICAgICAgIC4gKCAkVGVzdENvdW50IC0gJFRlc3RDb3VudE1pc2MgKSAuICIpLiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgcHJpbnQgdGVzdCBjYXNlIGRlc2NyaXB0aW9uCiAgICBpZiAoICRUZXN0LT57RGVzY3JpcHRpb259ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkVGVzdC0+e0Rlc2NyaXB0aW9ufSAodGVzdCBjYXNlOiAiCiAgICAgICAgICAgICAgICAuICggJFRlc3RDb3VudCAtICRUZXN0Q291bnRNaXNjICkgLiAiKS4iLAogICAgICAgICk7CiAgICB9CgogICAgIyBleHRyYWN0IHRlc3QgZGF0YQogICAgbXkgJFNvdXJjZURhdGEgICAgPSAkVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkVGVzdC0+e1JlZmVyZW5jZURhdGF9OwoKICAgICMgdGhlIGNoYW5nZSBpZCB3aWxsIGJlIHVzZWQgZm9yIHNldmVyYWwgY2FsbHMKICAgIG15ICRDaGFuZ2VJRDsKCiAgICAjIGFkZCBhIG5ldyBjaGFuZ2UKICAgIGlmICggJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9ICkgewoKICAgICAgICAjIGFkZCB0aGUgY2hhbmdlCiAgICAgICAgJENoYW5nZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSB9CiAgICAgICAgKTsKCiAgICAgICAgIyByZW1lbWJlciBjdXJyZW50IENoYW5nZUlECiAgICAgICAgaWYgKCRDaGFuZ2VJRCkgewogICAgICAgICAgICAkVGVzdGVkQ2hhbmdlSUR7JENoYW5nZUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENoYW5nZUlELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VBZGQoKSAtIEFkZCBjaGFuZ2UuIiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGEgY2hhbmdlIGFuZCBjb21wYXJlIHRoZSByZXRyaWV2ZWQgZGF0YSB3aXRoIHRoZSByZWZlcmVuY2UKICAgIGlmICggZXhpc3RzICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlR2V0fSApIHsKCiAgICAgICAgbXkgJENoYW5nZUdldFJlZmVyZW5jZURhdGEgPSAkUmVmZXJlbmNlRGF0YS0+e0NoYW5nZUdldH07CgogICAgICAgIG15ICRDaGFuZ2VEYXRhID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VHZXQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZUdldCBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZwogICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZURhdGEtPntDaGFuZ2VHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkQ2hhbmdlRGF0YSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIEdldCBjaGFuZ2UgcmV0dXJucyB1bmRlZi4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBleGNwZWN0ZWQgdG8gZmFpbAogICAgICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRDaGFuZ2VEYXRhLAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gU2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgYWx3YXlzIGV4aXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJENoYW5nZUF0dHJpYnV0ZXMgKAogICAgICAgICAgICBxdyhDaGFuZ2VJRCBDaGFuZ2VOdW1iZXIgQ2hhbmdlQnVpbGRlcklEIENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQ2hhbmdlRGF0YS0+eyRDaGFuZ2VBdHRyaWJ1dGVzfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIGhhcyAkQ2hhbmdlQXR0cmlidXRlcy4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRSZXF1ZXN0ZWRBdHRyaWJ1dGUgKCBrZXlzICV7ICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlR2V0fSB9ICkgewoKICAgICAgICAgICAgIyB0dXJuIG9mZiBhbGwgcHJldHR5IHByaW50CiAgICAgICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICAgICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICA9IDE7CgogICAgICAgICAgICAjIGR1bXAgdGhlIGF0dHJpYnV0ZSBmcm9tIENoYW5nZUdldCgpCiAgICAgICAgICAgIG15ICRDaGFuZ2VBdHRyaWJ1dGUgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJENoYW5nZURhdGEtPnskUmVxdWVzdGVkQXR0cmlidXRlfSApOwoKICAgICAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAgICAgICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUKICAgICAgICAgICAgICAgID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoICRSZWZlcmVuY2VEYXRhLT57Q2hhbmdlR2V0fS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ2hhbmdlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgJFJlZmVyZW5jZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtICRSZWZlcmVuY2VBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgJ0NoYW5nZUdldCcKfQpjb250aW51ZSB7CgogICAgIyBpbmNyZWFzZSB0aGUgdGVzdCBjb3VudCwgZXZlbiBvbiBuZXh0CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBEZWZpbmUgdGhlIHdvcmtvcmRlciB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCm15ICgKICAgICRXb3JrT3JkZXJBZGRUZXN0SUQsICRPcmRlckJ5VGVzdElELCAkU3RyaW5nU2VhcmNoVGVzdElELAogICAgJFRpbWVTZWFyY2hUZXN0SUQsICRQZXJtaXNzaW9uVGVzdElECiAgICApCiAgICA9IHNvcnQga2V5cyAlVGVzdGVkQ2hhbmdlSUQ7CgojIHRlc3RzIHdpdGggb25seSBXb3JrT3JkZXJBZGQoKTsKbXkgQFdvcmtPcmRlclRlc3RzID0gKAoKICAgICMgVGVzdHMgd2hlcmUgdGhlIHdvcmtvcmRlciBkb2Vzbid0IGNvbnRhaW4gYWxsIGRhdGEgKHJlcXVpcmVkIGF0dHJpYnV0ZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgbm8gcGFyYW1zIGZvciBXb3JrT3JkZXJBZGQoKS4nLAogICAgICAgIEZhaWxzICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHRoaXMgdGVzdCB0byBmYWlsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4ge30sICAgICMgVXNlcklEIGFuZCBDaGFuZ2VJRCBhcmUgbWlzc2luZwogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB1bmRlZiwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBubyBVc2VySUQgZm9yIFdvcmtPcmRlckFkZCgpLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBleHBlY3QgdGhpcyB0ZXN0IHRvIGZhaWwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VySUQgaXMgbWlzc2luZwogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY29udGFpbnMgbm8gQ2hhbmdlSUQgZm9yIFdvcmtPcmRlckFkZCgpLicsCiAgICAgICAgRmFpbHMgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBleHBlY3QgdGhpcyB0ZXN0IHRvIGZhaWwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGFuZ2VJRCBpcyBtaXNzaW5nCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gdW5kZWYsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBGaXJzdCB0ZXN0IG9mIFdvcmtPcmRlckFkZCgpIHdpdGggYWxsIHJlcXVpcmVkIGFyZ3VtZW50cy4KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBDaGFuZ2VJRCBhbmQgQ2hhbmdlSUQgZm9yIFdvcmtPcmRlckFkZCgpLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMiwgOCBdLAogICAgfSwKCiAgICAjIEZpcnN0IHRlc3Qgb2YgV29ya09yZGVyQWRkKCkgd2l0aCBhbGwgcmVxdWlyZWQgYXJndW1lbnRzLCBub3QgVXNlcklEID0+IDEuCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgJ1Rlc3QgY29udGFpbnMgQ2hhbmdlSUQgYW5kIENoYW5nZUlEIGZvciBXb3JrT3JkZXJBZGQoKSwgb3RoZXIgdXNlciB0aGFuIFVzZXJJRCA9PiAxLicsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMiwgOCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1dvcmtPcmRlckFkZCgpIHdpdGggc3RyaW5nIHBhcmFtZXRlcnMuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXIgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnV29ya09yZGVyIDEgLSBJbnN0cnVjdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1dvcmtPcmRlciAxIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlciAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICAgPT4gJ1dvcmtPcmRlciAxIC0gSW5zdHJ1Y3Rpb24gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uUGxhaW4gPT4gIldvcmtPcmRlciAxIC0gSW5zdHJ1Y3Rpb24gLVxuJFVuaXF1ZVNpZ25hdHVyZVxuIiwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICAgPT4gJ1dvcmtPcmRlciAxIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnRQbGFpbiAgICAgID0+ICdXb3JrT3JkZXIgMSAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDMsIDQsIDUsIDYsIDgsIDExIF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnV29ya29yZGVyIGNvbnRhaW5zIEhUTUwgaW5zdHJ1Y3Rpb24gYW5kIHJlcG9ydCcsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiA9PiAnPGI+VGhpcyBpbnN0cnVjdGlvbiA8dT5pczwvdT4gYm9sZDwvYj4gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgID0+ICc8Yj5UaGlzIHJlcG9ydCA8dT5pczwvdT4gYm9sZDwvYj4gLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgICAgPT4gJzxiPlRoaXMgaW5zdHJ1Y3Rpb24gPHU+aXM8L3U+IGJvbGQ8L2I+IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvblBsYWluID0+ICJUaGlzIGluc3RydWN0aW9uIGlzIGJvbGQgLVxuJFVuaXF1ZVNpZ25hdHVyZVxuIiwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgICAgPT4gJzxiPlRoaXMgcmVwb3J0IDx1PmlzPC91PiBib2xkPC9iPiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUmVwb3J0UGxhaW4gICAgICA9PiAnVGhpcyByZXBvcnQgaXMgYm9sZCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbMl0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnV29ya09yZGVyQWRkKCkgd2l0aCBXb3JrT3JkZXJTdGF0ZUlELicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe3JlYWR5fSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7cmVhZHl9LAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyU3RhdGVJRCAtIFRpdGxlIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJTdGF0ZUlEIC0gSW5zdHJ1Y3Rpb24gLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUmVwb3J0ID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJTdGF0ZUlEIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMiwgOCwgMjcsIDI4IF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdXb3JrT3JkZXJBZGQoKSB3aXRoIFdvcmtPcmRlclR5cGVJRC4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgPT4gJFdvcmtPcmRlclR5cGVOYW1lMklEe2FwcHJvdmFsfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJUeXBlSUQgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCAtIEluc3RydWN0aW9uIC0gJwogICAgICAgICAgICAgICAgICAgIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFJlcG9ydCA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyVHlwZUlEIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRXb3JrT3JkZXJUeXBlTmFtZTJJRHthcHByb3ZhbH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyVHlwZUlEIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJUeXBlSUQgLSBJbnN0cnVjdGlvbiAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCAtIFJlcG9ydCAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDgsIDEzLCAyMywgMjQgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1dvcmtPcmRlckFkZCgpIHdpdGggV29ya09yZGVyVHlwZUlEIGFuZCBXb3JrT3JkZXJTdGF0ZUlELicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkV29ya09yZGVyVHlwZU5hbWUySUR7cGlyfSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjbG9zZWR9LAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4KICAgICAgICAgICAgICAgICAgICAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyVHlwZUlEIGFuZCBXb3JrT3JkZXJTdGF0ZUlEIC0gVGl0bGUgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gPT4KICAgICAgICAgICAgICAgICAgICAnV29ya09yZGVyQWRkIHdpdGggV29ya09yZGVyVHlwZUlEIGFuZCBXb3JrT3JkZXJTdGF0ZUlEIC0gSW5zdHJ1Y3Rpb24gLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgUmVwb3J0ID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQgLSBSZXBvcnQgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRXb3JrT3JkZXJUeXBlTmFtZTJJRHtwaXJ9LAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe2Nsb3NlZH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PgogICAgICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiA9PgogICAgICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQgLSBJbnN0cnVjdGlvbiAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRCAtIFJlcG9ydCAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMiwgOCwgMTMsIDIzLCAyNCwgMjcsIDI4IF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdXb3JrT3JkZXJBZGQoKSBhbmQgV29ya09yZGVyVXBkYXRlKCkgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQuJywKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFdvcmtPcmRlclR5cGVOYW1lMklEe3Bpcn0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7J2luIHByb2dyZXNzJ30sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJTdGF0ZUlEIC0gVGl0bGUgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBJbnN0cnVjdGlvbiAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBSZXBvcnQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFdvcmtPcmRlclR5cGVOYW1lMklEe2RlY2lzaW9ufSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjYW5jZWxlZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFdvcmtPcmRlclR5cGVOYW1lMklEe2RlY2lzaW9ufSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjYW5jZWxlZH0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXJBZGQgd2l0aCBXb3JrT3JkZXJTdGF0ZUlEIC0gVGl0bGUgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBJbnN0cnVjdGlvbiAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBSZXBvcnQgPT4gJ1dvcmtPcmRlckFkZCB3aXRoIFdvcmtPcmRlclN0YXRlSUQgLSBSZXBvcnQgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyLCA4IF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnV29ya09yZGVyQWRkKCkgd2l0aCBlbXB0eSBzdHJpbmcgcGFyYW1ldGVycy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDggXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBTdGF0ZXMgKG5vIGlkcykgaW4gV09BZGQoKScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyU3RhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICdjbG9zZWQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXJTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgICA9PiAnY2xvc2VkJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFdvcmtPcmRlclN0YXRlTmFtZTJJRHtjbG9zZWR9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDI3LCAyOCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIGludmFsaWQgc3RhdGUgbmFtZXMgaW4gV09BZGQoKSBhbmQgV09VcGRhdGUoKScsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2Nsb3NlZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZSA9PiAnY2FuY2VsZWQnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnV29ya09yZGVyU3RhdGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlICAgPT4gJ2Nsb3NlZCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRXb3JrT3JkZXJTdGF0ZU5hbWUySUR7Y2xvc2VkfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyNywgMjggXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB2YWxpZCBzdGF0ZSBuYW1lcyBpbiBXT0FkZCgpIGFuZCBXT1VwZGF0ZSgpJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlID0+ICdjYW5jZWxlZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdXb3JrT3JkZXJTdGF0ZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgICA9PiAnY2FuY2VsZWQnLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkV29ya09yZGVyU3RhdGVOYW1lMklEe2NhbmNlbGVkfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIFR5cGVzIChubyBpZHMpIGluIFdPQWRkKCknLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclR5cGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGUgID0+ICdwaXInLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICdXb3JrT3JkZXJUeXBlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlICAgPT4gJ3BpcicsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgPT4gJFdvcmtPcmRlclR5cGVOYW1lMklEe3Bpcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMTMsIDIzLCAyNCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIFR5cGVzIChubyBpZHMpIGluIFdPQWRkKCkgYW5kIFdPVXBkYXRlKCknLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclR5cGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGUgID0+ICdwaXInLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZSA9PiAnZGVjaXNpb24nLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1dvcmtPcmRlclR5cGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGUgICA9PiAnZGVjaXNpb24nLAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEID0+ICRXb3JrT3JkZXJUeXBlTmFtZTJJRHtkZWNpc2lvbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBXb3JrT3JkZXJVcGRhdGUoKSB3aXRoIG5vdCBhbGxvd2VkIHdvcmtvcmRlciBzdGF0ZScsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJVcGRhdGUoKSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJVcGRhdGUoKSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2NyZWF0ZWQnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAnVGVzdCBmb3IgV29ya09yZGVyVXBkYXRlKCkgd2l0aCBub3QgYWxsb3dlZCB3b3Jrb3JkZXIgc3RhdGUgYnV0IEJ5cGFzc1N0YXRlTWFjaGluZSBwYXJhbWV0ZXIuJywKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclVwZGF0ZSgpIEJ5cGFzc1N0YXRlTWFjaGluZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgICAgID0+ICdpbiBwcm9ncmVzcycsCiAgICAgICAgICAgICAgICBCeXBhc3NTdGF0ZU1hY2hpbmUgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlclVwZGF0ZSgpIEJ5cGFzc1N0YXRlTWFjaGluZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGUgPT4gJ2luIHByb2dyZXNzJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCik7CgojIHRlc3RzIGZvciBXb3JrT3JkZXJVcGRhdGUoKTsKcHVzaCBAV29ya09yZGVyVGVzdHMsICgKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjb250YWlucyBubyBwYXJhbXMgZm9yIFdvcmtPcmRlclVwZGF0ZSgpLicsCiAgICAgICAgRmFpbHMgICAgICA9PiAxLCAgICAjIHdlIGV4cGVjdCB0aGlzIHRlc3QgdG8gZmFpbAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4ge30sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4IHN0cmluZyBsZW5ndGggZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScgeCAzNzk5LAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InIHggMzc5OSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnVCcgeCAyNTAsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgID0+ICdJJyB4IDM3OTksCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvblBsYWluID0+ICdJJyB4IDM3OTkgLiAiXG4iLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgICA9PiAnUicgeCAzNzk5LAogICAgICAgICAgICAgICAgUmVwb3J0UGxhaW4gICAgICA9PiAnUicgeCAzNzk5IC4gIlxuIiwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFsgMSwgOCBdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIG1heCsxIHN0cmluZyBsZW5ndGggZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJyB4IDI1MSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdJJyB4IDM4MDAsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicgeCAzODAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDEsIDggXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMiBzdHJpbmcgbGVuZ3RoIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcgeCAyNTIsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScgeCAzODAwLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InIHggMzgwMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgY3JlYXRlX2J5IGFuZCBjaGFuZ2VfYnkgZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcgeCAyNSwKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICdJJyB4IDM4LAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InIHggMzgsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJyB4IDI1LAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ0knIHggMzgsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicgeCAzOCwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyAyLCA4IF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBjcmVhdGVfYnkgYW5kIGNoYW5nZV9ieSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJyB4IDI1LAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ0knIHggMzgsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicgeCAzOCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1QnIHggMjUsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScgeCAzOCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSJyB4IDM4LAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDIsIDggXSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIC0gdGl0bGUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1QnIHggMjUxLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ0knLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBtYXgrMSBzdHJpbmcgbGVuZ3RoIC0gSW5zdHJ1Y3Rpb24gLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1QnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ0knIHggMzgwMCwKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICdSJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgbWF4KzEgc3RyaW5nIGxlbmd0aCAtIFJlcG9ydCAtIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUicgeCAzODAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB1bmRlZiBwYXJhbSAtIFRpdGxlIC0gZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJ0knLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB1bmRlZiBwYXJhbSAtIEluc3RydWN0aW9uIC0gZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+IHVuZGVmLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1InLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB1bmRlZiBwYXJhbSAtIFJlcG9ydCAtIGZvciBXb3JrT3JkZXJVcGRhdGUuJywKICAgICAgICBVcGRhdGVGYWlscyA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVCcsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnSScsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICcnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgVGltZUNoYW5nZXMgLSBqdXN0IFBsYW5uZWRTdGFydFRpbWUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBSZXBvcnQgICA9PiAnUmVwb3J0IC0ganVzdCBQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMDMtMjAgMTM6MjU6MDknLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUmVwb3J0IC0ganVzdCBQbGFubmVkU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgIENoYW5nZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgQ3JlYXRlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciBUaW1lQ2hhbmdlcyAtIGp1c3QgUGxhbm5lZEVuZFRpbWUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgVXBkYXRlRmFpbHMgPT4gMSwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgICAgICBSZXBvcnQgICA9PiAnUmVwb3J0IC0ganVzdCBQbGFubmVkRW5kVGltZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSA9PiAnMjAwOS0wMy0yMCAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1JlcG9ydCAtIGp1c3QgUGxhbm5lZEVuZFRpbWUnLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIFRpbWVDaGFuZ2VzIC0ganVzdCBBY3R1YWxTdGFydFRpbWUgLSBmb3IgV29ya09yZGVyVXBkYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgUmVwb3J0ICAgPT4gJ1JlcG9ydCAtIGp1c3QgQWN0dWFsU3RhcnRUaW1lJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0wMy0yMCAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1Rlc3QnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICAgPT4gJ1JlcG9ydCAtIGp1c3QgQWN0dWFsU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0wMy0yMCAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIFRpbWVDaGFuZ2VzIC0ganVzdCBBY3R1YWxFbmRUaW1lIC0gZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgUmVwb3J0ICAgPT4gJ1JlcG9ydCAtIGp1c3QgQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlclVwZGF0ZSA9PiB7CiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICA9PiAnMjAwOS0wMy0yMCAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJ1JlcG9ydCAtIGp1c3QgQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAnVGVzdCBmb3IgVGltZUNoYW5nZXMgLSBBY3R1YWxTdGFydFRpbWUgPiBBY3R1YWxFbmRUaW1lIC0gZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgUmVwb3J0ICAgPT4gJ1JlcG9ydCAtIEFjdHVhbFN0YXJ0VGltZSA+IEFjdHVhbEVuZFRpbWUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgID0+ICcyMDA5LTAzLTIwIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0wMy0yMSAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1Rlc3QnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAnUmVwb3J0IC0gQWN0dWFsU3RhcnRUaW1lID4gQWN0dWFsRW5kVGltZScsCiAgICAgICAgICAgICAgICBDaGFuZ2VCeSAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIENyZWF0ZUJ5ICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAnVGVzdCBmb3IgVGltZUNoYW5nZXMgLSBBY3R1YWxTdGFydFRpbWUgPCBBY3R1YWxFbmRUaW1lIC0gZm9yIFdvcmtPcmRlclVwZGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgUmVwb3J0ICAgPT4gJ1JlcG9ydCAtIEFjdHVhbFN0YXJ0VGltZSA8IEFjdHVhbEVuZFRpbWUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgID0+ICcyMDA5LTAzLTIyIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0wMy0yMSAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJ1Rlc3QnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICA9PiAnVGVzdCcsCiAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXBvcnQgICAgICAgICAgPT4gJ1JlcG9ydCAtIEFjdHVhbFN0YXJ0VGltZSA8IEFjdHVhbEVuZFRpbWUnLAogICAgICAgICAgICAgICAgQ2hhbmdlQnkgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgPT4gJzIwMDktMDMtMjIgMTM6MjU6MDknLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIxIDEzOjI1OjA5JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlRlc3QgZm9yICcwJyBzdHJpbmcgaGFuZGxpbmcgZm9yIFdvcmtPcmRlclVwZGF0ZS4iLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICcwJywKICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICAgID0+ICcwJywKICAgICAgICAgICAgICAgIFJlcG9ydCAgICAgICAgID0+ICcwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJzAnLAogICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gICAgPT4gJzAnLAogICAgICAgICAgICAgICAgUmVwb3J0ICAgICAgICAgPT4gJzAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOF0sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IGZvciB0aXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAiICBcdCBcbiAgVGl0bGUgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICJUaXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbMzJdLAogICAgfSwKCiAgICAjIFRlc3QgdGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgZm9yIHRpdGxlIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gIlRpdGxlIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSAtICIKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUKICAgICAgICAgICAgICAgICAgICAuICIgIFx0IFxuICAiLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAiVGl0bGUgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0gIiAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFszM10sCiAgICB9LAoKICAgICMgVGVzdCB0aXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICIgIFx0IFxuICBUaXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlCiAgICAgICAgICAgICAgICAgICAgLiAiICBcdCBcbiAgIiwKICAgICAgICAgICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICJUaXRsZSB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbMzRdLAogICAgfSwKCiAgICAjIFRlc3QgdGl0bGUgd2l0aCBvbmx5IHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBmb3IgdGl0bGUgd2l0aCBvbmx5IHdoaXRlc3BhY2UnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gIiAgXHQgXG4gICIsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gW10sCiAgICB9LAoKICAgICMgdGVzdCBmb3IgYWNjb3VudGVkIHRpbWUgYW5kIHBsYW5uZWQgZWZmb3J0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgMSBmb3IgQWNjb3VudGVkVGltZSBhbmQgUGxhbm5lZEVmZm9ydCcsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1Rlc3QgMSBmb3IgQWNjb3VudGVkVGltZSBhbmQgUGxhbm5lZEVmZm9ydCcsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyVXBkYXRlID0+IHsKICAgICAgICAgICAgICAgIFBsYW5uZWRFZmZvcnQgPT4gJzUuNScsCiAgICAgICAgICAgICAgICBBY2NvdW50ZWRUaW1lID0+ICcxLjUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBQbGFubmVkRWZmb3J0ID0+ICc1LjUwJywgICAgIyBvdXRwdXQgaXMgYWx3YXlzIGZvcm1hdHRlZCB3aXRoIDIgZGVjaW1hbCBwbGFjZXMKICAgICAgICAgICAgICAgIEFjY291bnRlZFRpbWUgPT4gJzEuNTAnLCAgICAjIG91dHB1dCBpcyBhbHdheXMgZm9ybWF0dGVkIHdpdGggMiBkZWNpbWFsIHBsYWNlcwogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgIyBUZXN0cyBmb3IgV29ya29yZGVyIEZyZWVUZXh0IGZpZWxkcwogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCgogICAgIyB0ZXN0IHNvbWUgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBXb3JrT3JkZXJBZGQgYW5kIFdvcmtPcmRlclVwZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IFdvcmtPcmRlckFkZCBhbmQgV29ya09yZGVyVXBkYXRlIHdpdGggd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgd2l0aCBmcmVldGV4dCBmaWVsZHMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXkxICA9PiAnQUFBQScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDEgPT4gJ0JCQkInLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIgID0+ICdDQ0NDJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MiA9PiAnRERERCcsCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTMgID0+ICdFRUVFJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MyA9PiAnRkZGRicsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5NCAgPT4gJ0dHR0cnLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQ0ID0+ICdISEhIJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnVGVzdCBhZGQgd29ya29yZGVyIHdpdGggZnJlZXRleHQgZmllbGRzIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MSAgPT4gJ0FBQUEnLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQxID0+ICdCQkJCJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXkyICA9PiAnQ0NDQycsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDIgPT4gJ0REREQnLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTMgID0+ICdFRUVFJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MyA9PiAnRkZGRicsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5NCAgPT4gJ0dHR0cnLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQ0ID0+ICdISEhIJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA4LCAzNSBdLAogICAgfSwKCiAgICAjIHRlc3Qgc29tZSB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIFdvcmtPcmRlckFkZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IFdvcmtPcmRlckFkZCBhbmQgV29ya09yZGVyVXBkYXRlIHdpdGggd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgd2l0aCBmcmVldGV4dCBmaWVsZHMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXkxICA9PiAnQUFBQScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDEgPT4gJ0JCQkInLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIgID0+ICdDQ0NDJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MiA9PiAnRERERCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MyAgPT4gJ1hYWFgnLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQzID0+ICdZWVlZJywKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgd2l0aCBmcmVldGV4dCBmaWVsZHMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXkxICA9PiAnQUFBQScsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDEgPT4gJ0JCQkInLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIgID0+ICdDQ0NDJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MiA9PiAnRERERCcsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MyAgPT4gJ1hYWFgnLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQzID0+ICdZWVlZJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWyA4LCAzNSwgMzYgXSwKICAgIH0sCgogICAgIyB0ZXN0IHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgd2l0aCBtYXhpbXVtIGxlbmd0aAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IFdvcmtPcmRlckFkZCBmcmVldGV4dCBmaWVsZHMgd2l0aCAyNTAgY2hhcmFjdGVycy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIHdpdGggMjUwIGNoYXJhY3RlcnMgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTMwICA9PiAnQScgeCAyNTAsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDMwID0+ICdCJyB4IDI1MCwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTMwICA9PiAnQScgeCAyNTAsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDMwID0+ICdCJyB4IDI1MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCiAgICAjIHRlc3Qgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGxlbmd0aCBpbiBXb3JrT3JkZXJBZGQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVzdCBXb3JrT3JkZXJBZGQgZnJlZXRleHQgZmllbGRzIHdpdGggMjUxIGNoYXJhY3RlcnMuJywKICAgICAgICBGYWlscyAgICAgICA9PiAxLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIHdpdGggMjUxIGNoYXJhY3RlcnMgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTMwICA9PiAnQScgeCAyNTEsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlVGV4dDMwID0+ICdCJyB4IDI1MSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgICAgPT4gJFdvcmtPcmRlckFkZFRlc3RJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHVuZGVmLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGVzdCB3b3Jrb3JkZXIgZnJlZXRleHQgZmllbGRzIGxhcmdlciB0aGFuIG1heGltdW0gbGVuZ3RoIGluIFdvcmtPcmRlclVwZGF0ZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdUZXN0IFdvcmtPcmRlclVwZGF0ZSBmcmVldGV4dCBmaWVsZHMgd2l0aCAyNTEgY2hhcmFjdGVycy4nLAogICAgICAgIFVwZGF0ZUZhaWxzID0+IDEsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1Rlc3QgdXBkYXRlIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgd2l0aCAyNTEgY2hhcmFjdGVycyAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MzAgID0+ICdBJyB4IDI1MCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MzAgPT4gJ0InIHggMjUwLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQzMCA9PiAnQycgeCAyNTEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVLZXkzMCAgPT4gJ0EnIHggMjUwLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQzMCA9PiAnQicgeCAyNTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hUZXN0ID0+IFs4XSwKICAgIH0sCgogICAgIyB0ZXN0IHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMgd2l0aCB6ZXJvIGFuZCBlbXB0eSBzdHJpbmdzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1Rlc3QgV29ya09yZGVyVXBkYXRlIHdpdGggemVybyBhbmQgZW1wdHkgc3RyaW5nLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4KICAgICAgICAgICAgICAgICAgICAnVGVzdCB1cGRhdGUgd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcyB3aXRoIHplcm8gYW5kIGVtcHR5IHN0cmluZyAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJGcmVlS2V5MjAgID0+ICdBQUFBJywKICAgICAgICAgICAgICAgIFdvcmtPcmRlckZyZWVUZXh0MjAgPT4gJ0JCQkInLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICAgICA9PiAkV29ya09yZGVyQWRkVGVzdElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJVcGRhdGUgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIwICA9PiAwLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQyMCA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJHZXQgPT4gewogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIwICA9PiAwLAogICAgICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQyMCA9PiAnJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaFRlc3QgPT4gWzhdLAogICAgfSwKCik7CgojIHdvcmtvcmRlcnMgdGVzdHMgZm9yIFdvcmtPcmRlclNlYXJjaCgpIHdpdGggT3JkZXJCeQpwdXNoIEBXb3JrT3JkZXJUZXN0cywgKAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAnV29ya09yZGVyQWRkKCkgZm9yIE9yZGVyQnkgd2l0aCBXb3JrT3JkZXJUeXBlSUQgYW5kIFdvcmtPcmRlclN0YXRlSUQuJywKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJE9yZGVyQnlUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRTb3J0ZWRUeXBlSURzWzJdLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkU29ydGVkV29ya09yZGVyU3RhdGVJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdBQUEgV29ya09yZGVyQWRkKCkgZm9yIE9yZGVyQnkgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckdldCA9PiB7CiAgICAgICAgICAgICAgICBDaGFuZ2VJRCAgICAgICAgID0+ICRPcmRlckJ5VGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEICA9PiAkU29ydGVkVHlwZUlEc1syXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclN0YXRlSUQgPT4gJFNvcnRlZFdvcmtPcmRlclN0YXRlSURzWzBdLAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnQUFBIFdvcmtPcmRlckFkZCgpIGZvciBPcmRlckJ5IC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAoKICAgICAgICAjIDk5OTk5OSBpcyBhIHNwZWNpYWwgdGVzdCBjYXNlLgogICAgICAgICMgV29ya29yZGVycyB3aXRoIHNlYXJjaHRlc3QgOTk5OTk5IGFyZSB1c2VkIGluICdPcmRlckJ5JyBzZWFyY2ggdGVzdHMuCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOTk5OTk5XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRC4nLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkT3JkZXJCeVRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFNvcnRlZFR5cGVJRHNbMV0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTb3J0ZWRXb3JrT3JkZXJTdGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ0JCQiBXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJE9yZGVyQnlUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRTb3J0ZWRUeXBlSURzWzFdLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkU29ydGVkV29ya09yZGVyU3RhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdCQkIgV29ya09yZGVyQWRkKCkgZm9yIE9yZGVyQnkgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOTk5OTk5XSwKICAgIH0sCgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICdXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSB3aXRoIFdvcmtPcmRlclR5cGVJRCBhbmQgV29ya09yZGVyU3RhdGVJRC4nLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgICA9PiAkT3JkZXJCeVRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRCAgPT4gJFNvcnRlZFR5cGVJRHNbMF0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZUlEID0+ICRTb3J0ZWRXb3JrT3JkZXJTdGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgPT4gJ0NDQyBXb3JrT3JkZXJBZGQoKSBmb3IgT3JkZXJCeSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgICAgPT4gJE9yZGVyQnlUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUeXBlSUQgID0+ICRTb3J0ZWRUeXBlSURzWzBdLAogICAgICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRCA9PiAkU29ydGVkV29ya09yZGVyU3RhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgID0+ICdDQ0MgV29ya09yZGVyQWRkKCkgZm9yIE9yZGVyQnkgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbOTk5OTk5XSwKICAgIH0sCik7CgojIHdvcmtvcmRlcnMgdGVzdHMgZm9yIFdvcmtPcmRlclNlYXJjaCgpIHdpdGggc3RyaW5nIHNlYXJjaGVzIGluIGNoYW5nZQpwdXNoIEBXb3JrT3JkZXJUZXN0cywgKAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAnV29ya09yZGVyQWRkKCkgZm9yIHN0cmluZyBzZWFyY2ggaW4gY2hhbmdlLicsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2hhbmdlSUQgICAgICAgPT4gJFN0cmluZ1NlYXJjaFRlc3RJRCwKICAgICAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXJBZGQoKSBmb3Igc3RyaW5nIHNlYXJjaCBpbiBjaGFuZ2UgLSBUaXRsZSAtICcKICAgICAgICAgICAgICAgICAgICAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRTdHJpbmdTZWFyY2hUZXN0SUQsCiAgICAgICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyQWRkKCkgZm9yIHN0cmluZyBzZWFyY2ggaW4gY2hhbmdlIC0gVGl0bGUgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoVGVzdCA9PiBbIDE1LCAxNywgMTksIDIxLCAyMiBdLAogICAgfSwKKTsKCiMgd29ya29yZGVycyB0ZXN0cyBmb3IgdGVzdGluZyB0aGUgUGVybWlzc2lvbigpIG1ldGhvZApwdXNoIEBXb3JrT3JkZXJUZXN0cywgKAoKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAnV29ya09yZGVyQWRkKCkgZm9yIHRlc3RpbmcgdGhlIFBlcm1pc3Npb24oKSBtZXRob2QnLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRQZXJtaXNzaW9uVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlckFkZCgpIGZvciBQZXJtaXNzaW9uKCkgIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyR2V0ID0+IHsKICAgICAgICAgICAgICAgIENoYW5nZUlEICAgICAgID0+ICRQZXJtaXNzaW9uVGVzdElELAogICAgICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlckFkZCgpIGZvciBQZXJtaXNzaW9uKCkgIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgICAgIFdvcmtPcmRlckFnZW50SUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZXhlY3V0ZSB0aGUgd29ya29yZGVyIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICVUZXN0ZWRXb3JrT3JkZXJJRDsgICAgICAgICAgICMgaWRzIG9mIGFsbCBjcmVhdGVkIHdvcmtvcmRlcnMKbXkgJVdvcmtPcmRlcklERm9yQ2hhbmdlSUQ7ICAgICAgIyBrZWVwIHRyYWNrIG9mIHRoZSB3b3Jrb3JkZXJzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGEgY2hhbmdlCm15ICVXb3JrT3JkZXJJREZvclNlYXJjaFRlc3Q7ICAgICMgd29ya29yZGVyIGlkcyB0aGF0IGFyZSBleHBlY3RlZCB0byBiZSBmb3VuZCBpbiBhIHNlYXJjaAoKVEVTVDoKZm9yIG15ICRUZXN0IChAV29ya09yZGVyVGVzdHMpIHsKCiAgICAjIGNoZWNrIFNvdXJjZURhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZURhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZURhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZURhdGEgZm91bmQgZm9yIHRoaXMgdGVzdCAodGVzdCBjYXNlOiAiCiAgICAgICAgICAgICAgICAuICggJFRlc3RDb3VudCAtICRUZXN0Q291bnRNaXNjICkgLiAiKS4iLAogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIHByaW50IHRlc3QgY2FzZSBkZXNjcmlwdGlvbgogICAgaWYgKCAkVGVzdC0+e0Rlc2NyaXB0aW9ufSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFRlc3QtPntEZXNjcmlwdGlvbn0gKHRlc3QgY2FzZTogIgogICAgICAgICAgICAgICAgLiAoICRUZXN0Q291bnQgLSAkVGVzdENvdW50TWlzYyApIC4gIikuIiwKICAgICAgICApOwogICAgfQoKICAgICMgZXh0cmFjdCB0ZXN0IGRhdGEKICAgIG15ICRTb3VyY2VEYXRhICAgID0gJFRlc3QtPntTb3VyY2VEYXRhfTsKICAgIG15ICRSZWZlcmVuY2VEYXRhID0gJFRlc3QtPntSZWZlcmVuY2VEYXRhfTsKCiAgICAjIHRoZSBjaGFuZ2UgaWQgd2lsbCBiZSB1c2VkIGZvciBzZXZlcmFsIGNhbGxzCiAgICBteSAkV29ya09yZGVySUQ7CgogICAgIyBhZGQgYSBuZXcgQ2hhbmdlCiAgICBpZiAoICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfSApIHsKCiAgICAgICAgIyBhZGQgdGhlIHdvcmtvcmRlcgogICAgICAgICRXb3JrT3JkZXJJRCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQWRkKAogICAgICAgICAgICAleyAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gfSwKICAgICAgICApOwoKICAgICAgICAjIHJlbWVtYmVyIGN1cnJlbnQgV29ya09yZGVySUQKICAgICAgICBpZiAoJFdvcmtPcmRlcklEKSB7CiAgICAgICAgICAgIG15ICRDaGFuZ2VJRCA9ICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfS0+e0NoYW5nZUlEfTsKCiAgICAgICAgICAgICMga2VlcCB0cmFjayBvZiBhbGwgY3JlYXRlZCB3b3Jrb3JkZXJzCiAgICAgICAgICAgICRUZXN0ZWRXb3JrT3JkZXJJRHskV29ya09yZGVySUR9ID0gMTsKCiAgICAgICAgICAgICMga2VlcCB0cmFjayBvZiB0aGUgd29ya29yZGVycyBhdHRhY2hlZCB0byBhIGNoYW5nZQogICAgICAgICAgICAkV29ya09yZGVySURGb3JDaGFuZ2VJRHskQ2hhbmdlSUR9IHx8PSB7fTsKICAgICAgICAgICAgJFdvcmtPcmRlcklERm9yQ2hhbmdlSUR7JENoYW5nZUlEfS0+eyRXb3JrT3JkZXJJRH0gPSAxOwoKICAgICAgICAgICAgIyBzYXZlIHdvcmtvcmRlciBpZCBmb3IgdXNlIGluIHNlYXJjaCB0ZXN0cwogICAgICAgICAgICBpZiAoIGV4aXN0cyAkVGVzdC0+e1NlYXJjaFRlc3R9ICkgewogICAgICAgICAgICAgICAgbXkgQFNlYXJjaFRlc3RzID0gQHsgJFRlc3QtPntTZWFyY2hUZXN0fSB9OwoKICAgICAgICAgICAgICAgIGZvciBteSAkU2VhcmNoVGVzdE5yIChAU2VhcmNoVGVzdHMpIHsKICAgICAgICAgICAgICAgICAgICAkV29ya09yZGVySURGb3JTZWFyY2hUZXN0eyRTZWFyY2hUZXN0TnJ9LT57JFdvcmtPcmRlcklEfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFRlc3QtPntGYWlsc30gKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFdvcmtPcmRlckFkZCgpIC0gQWRkIHdvcmtvcmRlciBzaG91bGQgZmFpbC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJBZGQoKSAtIEFkZCB3b3Jrb3JkZXIuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9ICAgICMgZW5kIGlmICdXb3JrT3JkZXJBZGQnCgogICAgaWYgKCAkU291cmNlRGF0YS0+e1dvcmtPcmRlclVwZGF0ZX0gKSB7CgogICAgICAgICMgdXBkYXRlIHRoZSB3b3Jrb3JkZXIKICAgICAgICBteSAkV29ya09yZGVyVXBkYXRlU3VjY2VzcyA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyVXBkYXRlKAogICAgICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57V29ya09yZGVyVXBkYXRlfSB9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFRlc3QtPntGYWlsc30KICAgICAgICAgICAgfHwgJFRlc3QtPntVcGRhdGVGYWlsc30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlclVwZGF0ZVN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJVcGRhdGUoKSBpcyBleHBlY3RlZCB0byBmYWlsIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlclVwZGF0ZVN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJVcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGEgd29ya29yZGVyIGFuZCBjb21wYXJlIHRoZSByZXRyaWV2ZWQgZGF0YSB3aXRoIHRoZSByZWZlcmVuY2UKICAgIGlmICggZXhpc3RzICRSZWZlcmVuY2VEYXRhLT57V29ya09yZGVyR2V0fSApIHsKCiAgICAgICAgbXkgJFdvcmtPcmRlckdldFJlZmVyZW5jZURhdGEgPSAkUmVmZXJlbmNlRGF0YS0+e1dvcmtPcmRlckdldH07CgogICAgICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgICAgIFdvcmtPcmRlcklEID0+ICRXb3JrT3JkZXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFdvcmtPcmRlckdldCBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZwogICAgICAgIGlmICggIWRlZmluZWQgJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkV29ya09yZGVyRGF0YSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIEdldCBjaGFuZ2UgcmV0dXJucyB1bmRlZi4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBleGNwZWN0ZWQgdG8gZmFpbAogICAgICAgICAgICBpZiAoICRUZXN0LT57RmFpbHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRXb3JrT3JkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRSZWZlcmVuY2VEYXRhLT57V29ya09yZGVyRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gU2hvdWxkIGZhaWwuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBURVNUOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgYWx3YXlzIGV4aXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlckF0dHJpYnV0ZXMgKAogICAgICAgICAgICBxdyhXb3JrT3JkZXJJRCBXb3JrT3JkZXJOdW1iZXIgQ3JlYXRlVGltZSBDaGFuZ2VUaW1lKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJEYXRhLT57JFdvcmtPcmRlckF0dHJpYnV0ZXN9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gaGFzICRXb3JrT3JkZXJBdHRyaWJ1dGVzLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFJlcXVlc3RlZEF0dHJpYnV0ZSAoIGtleXMgJXsgJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJHZXR9IH0gKSB7CgogICAgICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6SW5kZW50ID0gMDsKICAgICAgICAgICAgbG9jYWwgJERhdGE6OkR1bXBlcjo6VXNlcXEgID0gMTsKCiAgICAgICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gV29ya09yZGVyR2V0KCkKICAgICAgICAgICAgbXkgJFdvcmtPcmRlckF0dHJpYnV0ZSA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCAkV29ya09yZGVyRGF0YS0+eyRSZXF1ZXN0ZWRBdHRyaWJ1dGV9ICk7CgogICAgICAgICAgICAjIGR1bXAgdGhlIHJlZmVyZW5jZSBhdHRyaWJ1dGUKICAgICAgICAgICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZQogICAgICAgICAgICAgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJHZXR9LT57JFJlcXVlc3RlZEF0dHJpYnV0ZX0gKTsKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gJFJlcXVlc3RlZEF0dHJpYnV0ZSAoV29ya09yZGVySUQ6ICRXb3JrT3JkZXJJRCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0gICAgIyBlbmQgaWYgJ1dvcmtPcmRlckdldCcKfQpjb250aW51ZSB7CgogICAgIyBpbmNyZWFzZSB0aGUgdGVzdCBjb3VudCwgZXZlbiBvbiBuZXh0CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB0ZXN0IFdvcmtPcmRlckxpc3QoKSBhbmQgQ2hhbmdlR2V0KCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBUZXN0IHdoZXRoZXIgV29ya09yZGVyTGlzdCgpIGFuZCBDaGFuZ2VHZXQoKSByZXR1cm4gdGhlIHNhbWUgd29ya29yZGVycyBhcyB3ZSBjcmVhdGVkLgpmb3IgbXkgJENoYW5nZUlEICggc29ydCBrZXlzICVXb3JrT3JkZXJJREZvckNoYW5nZUlEICkgewoKICAgICMgYXNrIHRoZSBXb3JrT3JkZXIgb2JqZWN0IGZvciBhIGxpc3Qgb2Ygd29ya29yZGVycwogICAgbXkgJExpc3RGcm9tV29ya09yZGVyT2JqZWN0ID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJMaXN0KAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgQ2hhbmdlSUQgPT4gJENoYW5nZUlELAogICAgKSB8fCBbXTsKICAgIG15ICVNYXBGcm9tV29ya09yZGVyT2JqZWN0ID0gbWFwIHsgJF8gPT4gMSB9IEB7JExpc3RGcm9tV29ya09yZGVyT2JqZWN0fTsKCiAgICAjIGFzayB0aGUgQ2hhbmdlIG9iamVjdCBmb3IgYSBsaXN0IG9mIHdvcmtvcmRlcnMKICAgIG15ICRDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICkgfHwge307CiAgICBteSAkTGlzdEZyb21DaGFuZ2VPYmplY3QgPSAkQ2hhbmdlLT57V29ya09yZGVySURzfSB8fCBbXTsKICAgIG15ICVNYXBGcm9tQ2hhbmdlT2JqZWN0ID0gbWFwIHsgJF8gPT4gMSB9IEB7JExpc3RGcm9tQ2hhbmdlT2JqZWN0fTsKCiAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIGNyZWF0ZWQgd29ya29yZGVycyB3ZXJlIGZvdW5kIGJ5IFdvcmtPcmRlckxpc3QoKQogICAgZm9yIG15ICRXb3JrT3JkZXJJRCAoIHNvcnQga2V5cyAleyAkV29ya09yZGVySURGb3JDaGFuZ2VJRHskQ2hhbmdlSUR9IH0gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRNYXBGcm9tV29ya09yZGVyT2JqZWN0eyRXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICdUZXN0ICcKICAgICAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgICAgICAuICI6IFdvcmtPcmRlckxpc3QoKSAtIFdvcmtPcmRlcklEICRXb3JrT3JkZXJJRCBpbiBsaXN0IGZyb20gV29ya09yZGVyIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRNYXBGcm9tQ2hhbmdlT2JqZWN0eyRXb3JrT3JkZXJJRH0sCiAgICAgICAgICAgICdUZXN0ICcKICAgICAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgICAgICAuICI6IENoYW5nZUdldCgpIC0gV29ya09yZGVySUQgJFdvcmtPcmRlcklEIGluIGxpc3QgZnJvbSBDaGFuZ2Ugb2JqZWN0LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBudW1iZXIgb2Ygd29ya29yZGVycyBmb3IgYSBjaGFuZ2UKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQHskTGlzdEZyb21Xb3JrT3JkZXJPYmplY3R9LAogICAgICAgIHNjYWxhciBrZXlzICV7ICRXb3JrT3JkZXJJREZvckNoYW5nZUlEeyRDaGFuZ2VJRH0gfSwKICAgICAgICAnVGVzdCAnIC4gJFRlc3RDb3VudCsrIC4gIjogV29ya09yZGVyTGlzdCgpIC0gbnVtYmVyIG9mIHdvcmtvcmRlcnMgZm9yIGEgY2hhbmdlLiIsCiAgICApOwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRMaXN0RnJvbUNoYW5nZU9iamVjdH0sCiAgICAgICAgc2NhbGFyIGtleXMgJXsgJFdvcmtPcmRlcklERm9yQ2hhbmdlSUR7JENoYW5nZUlEfSB9LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBDaGFuZ2VHZXQoKSAtIG51bWJlciBvZiB3b3Jrb3JkZXJzIGZvciBhIGNoYW5nZS4iLAogICAgKTsKCiAgICAjIHNldCBlZmZvcnRzIHRlc3QuLi4KICAgIG15ICRFZmZvcnRzRnJvbVdvcmtPcmRlck9iamVjdCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQ2hhbmdlRWZmb3J0c0dldCgKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICk7CgogICAgZm9yIG15ICRFZmZvcnRLZXkgKCBzb3J0IGtleXMgJXskRWZmb3J0c0Zyb21Xb3JrT3JkZXJPYmplY3R9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJENoYW5nZS0+eyRFZmZvcnRLZXl9LAogICAgICAgICAgICAkRWZmb3J0c0Zyb21Xb3JrT3JkZXJPYmplY3QtPnskRWZmb3J0S2V5fSwKICAgICAgICAgICAgJ1Rlc3QgJwogICAgICAgICAgICAgICAgLiAkVGVzdENvdW50KysKICAgICAgICAgICAgICAgIC4gIjogV29ya09yZGVyQ2hhbmdlRWZmb3J0c0dldCgpIGFuZCBDaGFuZ2VHZXQoKSAtICRFZmZvcnRLZXkgbWF0Y2giLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgdGltZSB0ZXN0Li4uCiAgICBteSAkVGltZUZyb21Xb3JrT3JkZXJPYmplY3QgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckNoYW5nZVRpbWVHZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICApOwoKICAgIGZvciBteSAkVGltZUtleSAoIHNvcnQga2V5cyAleyRUaW1lRnJvbVdvcmtPcmRlck9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkQ2hhbmdlLT57JFRpbWVLZXl9LAogICAgICAgICAgICAkVGltZUZyb21Xb3JrT3JkZXJPYmplY3QtPnskVGltZUtleX0sCiAgICAgICAgICAgICdUZXN0ICcKICAgICAgICAgICAgICAgIC4gJFRlc3RDb3VudCsrCiAgICAgICAgICAgICAgICAuICI6IFdvcmtPcmRlckNoYW5nZVRpbWVHZXQoKSBhbmQgQ2hhbmdlR2V0KCkgLSAkVGltZUtleSBtYXRjaCIsCiAgICAgICAgKTsKICAgIH0KCn0KCiMgY291bnQgYWxsIHRlc3RzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGFuZCBwbGFubmVkIGZvciBmYWlsCm15ICRGYWlscyA9IHNjYWxhciBncmVwIHsgJF8tPntGYWlsc30gfSBAV29ya09yZGVyVGVzdHM7Cm15ICROckNyZWF0ZVdvcmtPcmRlcnMgPSAoIHNjYWxhciBAV29ya09yZGVyVGVzdHMgKSAtICRGYWlsczsKCiMgdGVzdCBpZiB0aGUgd29ya29yZGVycyB3ZXJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgc2NhbGFyIGtleXMgJVRlc3RlZFdvcmtPcmRlcklEIHx8IDAsCiAgICAkTnJDcmVhdGVXb3JrT3JkZXJzLAogICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICc6IGFtb3VudCBvZiB3b3Jrb3JkZXIgb2JqZWN0cyBhbmQgdGVzdCBjYXNlcy4nLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHdvcmtvcmRlciBzZWFyY2ggdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFN0cmluZ1NlYXJjaFRlc3RDaGFuZ2UgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUdldCgKICAgIENoYW5nZUlEID0+ICRTdHJpbmdTZWFyY2hUZXN0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKbXkgQFdvcmtPcmRlclNlYXJjaFRlc3RzID0gKAoKICAgICMgTnIgMSAtIGEgc2ltcGxlIGNoZWNrIGlmIHRoZSBzZWFyY2ggZnVuY3Rpb25zIHRha2VzIGNhcmUgb2YgIkxpbWl0IgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdMaW1pdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBMaW1pdCA9PiAzLCAgICAjIGV4cGVjdCBvbmx5IDMgcmVzdWx0cwogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCA9PiAxLCAgICAjIGZsYWcgZm9yIGNoZWNrIHJlc3VsdCBhbW91bnQKICAgICAgICAgICAgQ291bnQgICAgID0+IDMsICAgICMgY2hlY2sgb24gMyByZXN1bHRzCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyIC0gYSBzaW1wbGUgY2hlY2sgdGhhdCBzaG91bGQgZmluZCBhbGwgd29ya29yZGVycwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdMaW1pdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwgICAgIyBmbGFnIGZvciBjaGVjayByZXN1bHRzIHRoYXQgd2VyZSBtYXJrZWQgd2l0aCAnU2VhcmNoVGVzdCcKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDMgLSBzZWFyY2ggZm9yIHRpdGxlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1dvcmtPcmRlclRpdGxlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdXb3JrT3JkZXIgMSAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNCAtIHNlYXJjaCBmb3IgaW5zdHJ1Y3Rpb24KICAgICMgTm90ZSB0aGUgZXh0cmEgbmV3bGluZXMgaW5qZWN0ZWQgYnkgVG9Bc2NpaSgpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0luc3RydWN0aW9uJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIEluc3RydWN0aW9uID0+ICJXb3JrT3JkZXIgMSAtIEluc3RydWN0aW9uIC1cbiRVbmlxdWVTaWduYXR1cmVcbiIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNSAtIHNlYXJjaCBmb3IgcmVwb3J0CiAgICAjIFRvQXNjaWkoKSBhZGRzIG5vIG5ld2xpbmVzLCBhcyB0aGUgc3RyaW5nIGxlbmd0aCBpcyBsZXNzIHRoYW4gNzguCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1JlcG9ydCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBSZXBvcnQgPT4gJ1dvcmtPcmRlciAxIC0gUmVwb3J0IC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgNiAtIHNlYXJjaCBmb3IgdGl0bGUsIGluc3RydWN0aW9uIGFuZCByZXBvcnQKICAgICMgTm90ZSB0aGUgZXh0cmEgbmV3bGluZXMgaW5qZWN0ZWQgYnkgVG9Bc2NpaSgpLgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdXb3JrT3JkZXJUaXRsZSwgSW5zdHJ1Y3Rpb24sIFJlcG9ydCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyIDEgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBJbnN0cnVjdGlvbiAgICA9PiAiV29ya09yZGVyIDEgLSBJbnN0cnVjdGlvbiAtXG4kVW5pcXVlU2lnbmF0dXJlXG4iLAogICAgICAgICAgICBSZXBvcnQgICAgICAgICA9PiAiV29ya09yZGVyIDEgLSBSZXBvcnQgLSAkVW5pcXVlU2lnbmF0dXJlIiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciA3IC0gc2VhcmNoIGZvciB0aXRsZSwgd2hpY2ggaXMgbm90IGluIGRhdGFiYXNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1dvcmtPcmRlclRpdGxlIGRvZXMgbm90IGV4aXN0JywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICdOT1QgSU4gREFUQUJBU0UgJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ID0+IDEsCiAgICAgICAgICAgIENvdW50ICAgICA9PiAwLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgOCAtIHNlYXJjaCBmb3IgQ2hhbmdlSUQKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hhbmdlSUQgZG9lcyBleGlzdCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDkgLSBzZWFyY2ggZm9yIGNoYW5nZSBpZCwgd2hpY2ggaXMgbm90IGluIGRhdGFiYXNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0FsbCBXb3JrT3JkZXJzIGZvciBDaGFuZ2UgMV8wMDBfMDAwJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyA9PiBbMV8wMDBfMDAwXSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgQ291bnQgICAgID0+IDAsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxMCAtIHNlYXJjaCBmb3Igbm9uLWV4aXN0aW5nIGNoYW5nZSBpZCBhbmQgZXhpc3RpbmcgdGl0bGUgd2hpY2ggaXMgbm90IGluIGRhdGFiYXNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0FsbCBXb3JrT3JkZXJzIGZvciBDaGFuZ2UgMV8wMDBfMDAwIGFuZCBhbiBleGlzdGluZyB0aXRsZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICA9PiBbMV8wMDBfMDAwXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ1dvcmtPcmRlciAxIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgQ291bnQgICAgID0+IDAsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxMSAtIHNlYXJjaCBmb3IgZXhpc3RpbmcgQ2hhbmdlSUQgYW5kIGV4aXN0aW5nIFdvcmtPcmRlclRpdGxlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZUlEIGRvZXMgZXhpc3QsIFdvcmtPcmRlclRpdGxlIGRvZXMgZXhpc3QnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnV29ya09yZGVyIDEgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDEyIC0gc2VhcmNoIGZvciBleGlzdGluZyBjaGFuZ2UgaWQgYW5kIGZvciB0aXRsZSwgd2hpY2ggaXMgbm90IGluIGRhdGFiYXNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoYW5nZUlEIGRvZXMgZXhpc3QsIFdvcmtPcmRlclRpdGxlIGRvZXMgbm90IGV4aXN0JywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJ05PVCBJTiBEQVRBQkFTRSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgPT4gMSwKICAgICAgICAgICAgQ291bnQgICAgID0+IDAsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxMyAtIHNlYXJjaCBmb3Igd29ya29yZGVyIHR5cGVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyIHR5cGUnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgICA9PiBbJFdvcmtPcmRlckFkZFRlc3RJRF0sCiAgICAgICAgICAgIFdvcmtPcmRlclR5cGVJRHMgPT4gWwogICAgICAgICAgICAgICAgJFdvcmtPcmRlclR5cGVOYW1lMklEe2FwcHJvdmFsfSwKICAgICAgICAgICAgICAgICRXb3JrT3JkZXJUeXBlTmFtZTJJRHtwaXJ9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTQgLSBzZWFyY2ggZm9yIG5vbmV4aXN0ZW50IGNoYW5nZSB0aXRsZQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vbmV4aXN0ZW50IGNoYW5nZSB0aXRsZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICdOT05FWElTVEVOVCBDaGFuZ2UgMyAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxNSAtIHNlYXJjaCBmb3IgY2hhbmdlIHRpdGxlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgY2hhbmdlIHRpdGxlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgID0+IFskU3RyaW5nU2VhcmNoVGVzdElEXSwKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJ0NoYW5nZSAzIC0gVGl0bGUgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDE2IC0gc2VhcmNoIGZvciBub25leGlzdGVudCBjaGFuZ2UgZGVzY3JpcHRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBub25leGlzdGVudCBjaGFuZ2UgZGVzY3JpcHRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgICAgPT4gWyRTdHJpbmdTZWFyY2hUZXN0SURdLAogICAgICAgICAgICBDaGFuZ2VEZXNjcmlwdGlvbiA9PiAnTk9ORVhJU1RFTlQgQ2hhbmdlIDMgLSBEZXNjcmlwdGlvbiAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMTcgLSBzZWFyY2ggZm9yIGNoYW5nZSBkZXNjcmlwdGlvbgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSBkZXNjcmlwdGlvbicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZURlc2NyaXB0aW9uID0+ICdDaGFuZ2UgMyAtIERlc2NyaXB0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxOCAtIHNlYXJjaCBmb3Igbm9uZXhpc3RlbnQgY2hhbmdlIGp1c3RpZmljYXRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBub25leGlzdGVudCBjaGFuZ2UganVzdGlmaWNhdGlvbicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgICAgID0+IFskU3RyaW5nU2VhcmNoVGVzdElEXSwKICAgICAgICAgICAgQ2hhbmdlSnVzdGlmaWNhdGlvbiA9PiAnTk9ORVhJU1RFTlQgQ2hhbmdlIDMgLSBKdXN0aWZpY2F0aW9uIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAxOSAtIHNlYXJjaCBmb3IgY2hhbmdlIGp1c3RpZmljYXRpb24KICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjaGFuZ2UganVzdGlmaWNhdGlvbicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgICAgID0+IFskU3RyaW5nU2VhcmNoVGVzdElEXSwKICAgICAgICAgICAgQ2hhbmdlSnVzdGlmaWNhdGlvbiA9PiAiQ2hhbmdlIDMgLSBKdXN0aWZpY2F0aW9uIC1cbiRVbmlxdWVTaWduYXR1cmVcbiIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyMCAtIHNlYXJjaCBmb3Igbm9uZXhpc3RlbnQgY2hhbmdlIG51bWJlcgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIG5vbmV4aXN0ZW50IGNoYW5nZSBudW1iZXInLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgID0+IFskU3RyaW5nU2VhcmNoVGVzdElEXSwKICAgICAgICAgICAgQ2hhbmdlTnVtYmVyID0+ICdOT05FWElTVEVOVCAnIC4gJFN0cmluZ1NlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMjEgLSBzZWFyY2ggZm9yIGNoYW5nZSBudW1iZXIKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBjaGFuZ2UgbnVtYmVyJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZU51bWJlciA9PiAkU3RyaW5nU2VhcmNoVGVzdENoYW5nZS0+e0NoYW5nZU51bWJlcn0sCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyMiAtIHNlYXJjaCBmb3IgY2hhbmdlIHRpdGxlLCBjaGFuZ2UgbnVtYmVyLCBkZXNjcmlwdGlvbiBhbmQganVzdGlmaWNhdGlvbgogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGNoYW5nZSB0aXRsZSwgY2hhbmdlIG51bWJlciwgZGVzY3JpcHRpb24gYW5kIGp1c3RpZmljYXRpb24nLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgICAgICA9PiBbJFN0cmluZ1NlYXJjaFRlc3RJRF0sCiAgICAgICAgICAgIENoYW5nZU51bWJlciAgICAgICAgPT4gJFN0cmluZ1NlYXJjaFRlc3RDaGFuZ2UtPntDaGFuZ2VOdW1iZXJ9LAogICAgICAgICAgICBDaGFuZ2VUaXRsZSAgICAgICAgID0+ICdDaGFuZ2UgMyAtIFRpdGxlIC0gJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIENoYW5nZURlc2NyaXB0aW9uICAgPT4gIkNoYW5nZSAzIC0gRGVzY3JpcHRpb24gLSAkVW5pcXVlU2lnbmF0dXJlIiwKICAgICAgICAgICAgQ2hhbmdlSnVzdGlmaWNhdGlvbiA9PiAiQ2hhbmdlIDMgLSBKdXN0aWZpY2F0aW9uIC1cbiRVbmlxdWVTaWduYXR1cmVcbiIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyMyAtIHNlYXJjaCBmb3Igd29ya29yZGVyIHR5cGVzICJhcHByb3ZhbCIgYW5kICJwaXIiJywKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBXb3JrT3JkZXIgdHlwZXMgImFwcHJvdmFsIiBhbmQgInBpciInLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlSURzICAgICAgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgICAgICBXb3JrT3JkZXJUeXBlcyA9PiBbICdhcHByb3ZhbCcsICdwaXInIF0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyNCAtIHNlYXJjaCBmb3Igd29ya29yZGVyIHR5cGVzIChzYW1lIHR5cGVzIHNldmVyYWwgdGltZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyIHR5cGVzIChzYW1lIHR5cGVzIHNldmVyYWwgdGltZXMpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyVHlwZXMgPT4gWyAnYXBwcm92YWwnLCAncGlyJywgJ2FwcHJvdmFsJywgJ3BpcicgXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDI1IC0gc2VhcmNoIGZvciB3b3Jrb3JkZXIgdHlwZXMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBXb3JrT3JkZXIgdHlwZSAobm9uLWV4aXN0ZW50IHR5cGUpJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyVHlwZXMgPT4gWyAnYXBwcm92YWwnLCAncGlyJywgJ25vbi1leGlzdGVudCcgXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFNlYXJjaEZhaWxzID0+IDEsCiAgICB9LAoKICAgICMgTnIgMjYgLSBzZWFyY2ggZm9yIHdvcmtvcmRlciBzdGF0ZSAobm9uLWV4aXN0ZW50IHN0YXRlKQogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFdvcmtPcmRlciBzdGF0ZSAobm9uLWV4aXN0ZW50IHN0YXRlKScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgPT4gWydub24tZXhpc3RlbnQnXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDI3IC0gc2VhcmNoIGZvciB3b3Jrb3JkZXIgc3RhdGVzCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyIHN0YXRlcyAiY2xvc2VkIiBhbmQgInJlYWR5IicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgPT4gWyAnY2xvc2VkJywgJ3JlYWR5JyBdLAogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSAgPT4gJyUnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDI4IC0gU2VhcmNoIGZvciBXb3JrT3JkZXIgc3RhdGVzICJjbG9zZWQiIGFuZCAicmVhZHkiICh0d28gdGltZXMpCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgV29ya09yZGVyIHN0YXRlcyAiY2xvc2VkIiBhbmQgInJlYWR5IiAodHdvIHRpbWVzKScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgPT4gWyAnY2xvc2VkJywgJ3JlYWR5JywgJ2Nsb3NlZCcsICdyZWFkeScgXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAyOSAtIFNlYXJjaCBmb3IgV29ya09yZGVyIHN0YXRlcyAiY2xvc2VkIiwgInJlYWR5IiBhbmQgIm5vbi1leGlzdGVudCIKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBXb3JrT3JkZXIgc3RhdGVzICJjbG9zZWQiLCAicmVhZHkiIGFuZCAibm9uLWV4aXN0ZW50IicsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgPT4gWyRXb3JrT3JkZXJBZGRUZXN0SURdLAogICAgICAgICAgICBXb3JrT3JkZXJTdGF0ZXMgPT4gWyAnY2xvc2VkJywgJ3JlYWR5JywgJ25vbi1leGlzdGVudCcgXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDMwIC0gU2VhcmNoIGZvciBhbiBpbnZhbGlkIFdvcmtPcmRlciBzdGF0ZSBpZAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIGFuIGludmFsaWQgV29ya09yZGVyIHN0YXRlIGlkJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUlEcyAgICAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyU3RhdGVJRHMgPT4gWy0xMV0sCiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlICAgID0+ICclJyAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgfSwKICAgICAgICBTZWFyY2hGYWlscyA9PiAxLAogICAgfSwKCiAgICAjIE5yIDMxIC0gU2VhcmNoIGZvciBhbiBpbnZhbGlkIFdvcmtPcmRlciB0eXBlIGlkCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgYW4gaW52YWxpZCBXb3JrT3JkZXIgdHlwZSBpZCcsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VJRHMgICAgICAgID0+IFskV29ya09yZGVyQWRkVGVzdElEXSwKICAgICAgICAgICAgV29ya09yZGVyVHlwZUlEcyA9PiBbLTExXSwKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnJScgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIH0sCiAgICAgICAgU2VhcmNoRmFpbHMgPT4gMSwKICAgIH0sCgogICAgIyBOciAzMiAtIFNlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICJUaXRsZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZSAtICIgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAwLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgIFRlc3RFeGlzdGVuY2UgPT4gMSwKICAgICAgICAgICAgVGVzdENvdW50ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgTnIgMzMgLSBTZWFyY2ggZm9yIG5vcm1hbGl6ZWQgdGl0bGUsIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBub3JtYWxpemVkIHRpdGxlLCB0cmFpbGluZyB3aGl0ZXNwYWNlJywKICAgICAgICBTZWFyY2hEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclRpdGxlID0+ICJUaXRsZSB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UgLSAiIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICBUZXN0RXhpc3RlbmNlID0+IDEsCiAgICAgICAgICAgIFRlc3RDb3VudCAgICAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIE5yIDM0IC0gU2VhcmNoIGZvciBub3JtYWxpemVkIHRpdGxlLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3Igbm9ybWFsaXplZCB0aXRsZSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZScsCiAgICAgICAgU2VhcmNoRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJUaXRsZSA9PiAiVGl0bGUgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0gIiAuICRVbmlxdWVTaWduYXR1cmUsCiAgICAgICAgICAgIFVzaW5nV2lsZGNhcmRzID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzNSAtIFNlYXJjaCBmb3Igd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTEgID0+ICdBQUFBJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQxID0+ICdCQkJCJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIgID0+ICdDQ0NDJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQyID0+ICdEREREJywKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgICAgID0+IDAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBOciAzNiAtIFNlYXJjaCBmb3Igd29ya29yZGVyIGZyZWV0ZXh0IGZpZWxkcwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIHdvcmtvcmRlciBmcmVldGV4dCBmaWVsZHMnLAogICAgICAgIFNlYXJjaERhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyVGl0bGUgICAgID0+ICdUZXN0IGFkZCB3b3Jrb3JkZXIgd2l0aCBmcmVldGV4dCBmaWVsZHMgLSAnIC4gJFVuaXF1ZVNpZ25hdHVyZSwKICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTEgID0+ICdBQUFBJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQxID0+ICdCQkJCJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTIgID0+ICdDQ0NDJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQyID0+ICdEREREJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZUtleTMgID0+ICdYWFhYJywKICAgICAgICAgICAgV29ya09yZGVyRnJlZVRleHQzID0+ICdZWVlZJywKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgVGVzdEV4aXN0ZW5jZSA9PiAxLAogICAgICAgICAgICBUZXN0Q291bnQgICAgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgopOwoKbXkgJFNlYXJjaFRlc3RDb3VudCA9IDE7CgpURVNUOgpmb3IgbXkgJFRlc3QgKEBXb3JrT3JkZXJTZWFyY2hUZXN0cykgewoKICAgICMgY2hlY2sgU2VhcmNoRGF0YSBhdHRyaWJ1dGUKICAgIGlmICggISRUZXN0LT57U2VhcmNoRGF0YX0gfHwgcmVmKCAkVGVzdC0+e1NlYXJjaERhdGF9ICkgbmUgJ0hBU0gnICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogU2VhcmNoRGF0YSBmb3VuZCBmb3IgdGhpcyB0ZXN0LiIsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgJ2NhbGwgV29ya09yZGVyU2VhcmNoIHdpdGggcGFyYW1zOiAnCiAgICAgICAgICAgIC4gJFRlc3QtPntEZXNjcmlwdGlvbn0KICAgICAgICAgICAgLiAiIChTZWFyY2hUZXN0Q2FzZTogJFNlYXJjaFRlc3RDb3VudCkiLAogICAgKTsKCiAgICAjIGdldCBhIHJlZiB0byBhbiBhcnJheSBvZiBmb3VuZCBpZHMKICAgIG15ICRXb3JrT3JkZXJJRHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAleyAkVGVzdC0+e1NlYXJjaERhdGF9IH0sCiAgICAgICAgUmVzdWx0ICAgPT4gJ0FSUkFZJywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICApOwoKICAgICMgZ2V0IGEgY291bnQgb2YgZm91bmQgaWRzCiAgICBteSAkQ291bnRXb3JrT3JkZXJJRHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAleyAkVGVzdC0+e1NlYXJjaERhdGF9IH0sCiAgICAgICAgUmVzdWx0ICAgPT4gJ0NPVU5UJywKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENoYW5nZUlEID0+ICRXb3JrT3JkZXJBZGRUZXN0SUQsCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTZWFyY2hGYWlsc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkKCRXb3JrT3JkZXJJRHMpLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJTZWFyY2goKSBpcyBleHBlY3RlZCB0byBmYWlsIChSZXN1bHQgPT4gJ0FSUkFZJykiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkKCRDb3VudFdvcmtPcmRlcklEcyksCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFdvcmtPcmRlclNlYXJjaCgpIGlzIGV4cGVjdGVkIHRvIGZhaWwgKFJlc3VsdCA9PiAnQ09VTlQnKSIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBkZWZpbmVkKCRXb3JrT3JkZXJJRHMpICYmIHJlZigkV29ya09yZGVySURzKSBlcSAnQVJSQVknLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBhcnJheSByZWZlcmVuY2UgZm9yIFdvcmtPcmRlcklEcy4iLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGRlZmluZWQoJENvdW50V29ya09yZGVySURzKSAmJiByZWYgJENvdW50V29ya09yZGVySURzIGVxICcnLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBzY2FsYXIgZm9yIENvdW50V29ya09yZGVySURzLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAkV29ya09yZGVySURzIHx8PSBbXTsKICAgICRDb3VudFdvcmtPcmRlcklEcyB8fD0gMDsKCiAgICBpZiAoICRUZXN0LT57UmVzdWx0RGF0YX0tPntUZXN0Q291bnR9ICkgewoKICAgICAgICAjIGdldCBudW1iZXIgb2Ygd29ya29yZGVyIGlkcyBXb3JrT3JkZXJTZWFyY2ggc2hvdWxkIHJldHVybgogICAgICAgIG15ICRFeHBlY3RlZENvdW50ID0gc2NhbGFyIGtleXMgJXsgJFdvcmtPcmRlcklERm9yU2VhcmNoVGVzdHskU2VhcmNoVGVzdENvdW50fSB9OwoKICAgICAgICAjIGdldCBkZWZpbmVkIGV4cGVjdGVkIHJlc3VsdCBjb3VudCAoZGVmaW5lZCBpbiBzZWFyY2ggdGVzdCBjYXNlISkKICAgICAgICBpZiAoIGV4aXN0cyAkVGVzdC0+e1Jlc3VsdERhdGF9LT57Q291bnR9ICkgewogICAgICAgICAgICAkRXhwZWN0ZWRDb3VudCA9ICRUZXN0LT57UmVzdWx0RGF0YX0tPntDb3VudH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG51bWJlciBvZiBJRHMgaW4gdGhlIHJldHVybmVkIGFycmF5cmVmCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQHskV29ya09yZGVySURzfSwKICAgICAgICAgICAgJEV4cGVjdGVkQ291bnQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIE51bWJlciBvZiBmb3VuZCB3b3Jrb3JkZXJzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBXaGVuIGEgJ0xpbWl0JyBoYXMgYmVlbiBwYXNzZWQsIHRoZW4gdGhlIHJldHVybmVkIGNvdW50IG5vdCBuZWNlc3NhcmlseSBtYXRjaGVzCiAgICAgICAgIyB0aGUgbnVtYmVyIG9mIElEcyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuIEluIHRoYXQgY2FzZSB0ZXN0aW5nIGlzIGZ1dGlsZS4KICAgICAgICBpZiAoICEkVGVzdC0+e1NlYXJjaERhdGF9LT57TGltaXR9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQ291bnRXb3JrT3JkZXJJRHMsCiAgICAgICAgICAgICAgICAkRXhwZWN0ZWRDb3VudCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIE51bWJlciBvZiBmb3VuZCB3b3Jrb3JkZXJzIChSZXN1bHQgPT4gJ0NPVU5UJykuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkVGVzdC0+e1Jlc3VsdERhdGF9LT57VGVzdEV4aXN0ZW5jZX0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgYWxsIGlkcyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBzZWFyY2h0ZXN0IGFyZSByZXR1cm5lZAogICAgICAgIG15IEBXb3JrT3JkZXJJRHMgPSBrZXlzICV7ICRXb3JrT3JkZXJJREZvclNlYXJjaFRlc3R7JFNlYXJjaFRlc3RDb3VudH0gfTsKCiAgICAgICAgbXkgJVJldHVybmVkV29ya09yZGVySUQgPSBtYXAgeyAkXyA9PiAxIH0gQHskV29ya09yZGVySURzfTsKICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEIChAV29ya09yZGVySURzKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFJldHVybmVkV29ya09yZGVySUR7JFdvcmtPcmRlcklEfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlcklEICRXb3JrT3JkZXJJRCBmb3VuZCBpbiByZXR1cm5lZCBsaXN0LiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKICAgICRTZWFyY2hUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSB3b3Jrb3JkZXIgc2VhcmNoIHRlc3RzIGZvciAnT3JkZXJCeScgc2VhcmNoZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGhyZWUgY2hhbmdlIGlkcy4gVGhlbiBnZXQgdGhlIGRhdGEuIFRoYXQgaXMgbmVlZGVkIGZvciBzb3J0aW5nCm15IEBXb3JrT3JkZXJJRHNGb3JPcmRlckJ5VGVzdHMgPSBrZXlzICV7ICRXb3JrT3JkZXJJREZvclNlYXJjaFRlc3R7OTk5OTk5fSB9OwpteSBAV29ya09yZGVyc0Zvck9yZGVyQnlUZXN0czsKCmZvciBteSAkV29ya09yZGVySURGb3JPcmRlckJ5VGVzdHMgKEBXb3JrT3JkZXJJRHNGb3JPcmRlckJ5VGVzdHMpIHsKICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yT3JkZXJCeVRlc3RzLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICMgY29udmVydCB0aW1lIHN0cmluZyB0byBudW1iZXJzIC0gdGhhdCdzIGJldHRlciBmb3IgdGhlIGNvbXBhcmlzb25zCiAgICBmb3IgbXkgJFRpbWVDb2x1bW4gKHF3KENyZWF0ZVRpbWUgQ2hhbmdlVGltZSkpIHsKICAgICAgICAkV29ya09yZGVyRGF0YS0+eyRUaW1lQ29sdW1ufSA9fiBzeyBcRCB9e314bXNnOwogICAgfQoKICAgIHB1c2ggQFdvcmtPcmRlcnNGb3JPcmRlckJ5VGVzdHMsICRXb3JrT3JkZXJEYXRhOwp9CgpteSBAT3JkZXJCeUNvbHVtbnMgPSBxdygKICAgIFdvcmtPcmRlcklECiAgICBXb3JrT3JkZXJOdW1iZXIKICAgIFdvcmtPcmRlclRpdGxlCiAgICBXb3JrT3JkZXJTdGF0ZUlECiAgICBXb3JrT3JkZXJUeXBlSUQKICAgIENyZWF0ZUJ5CiAgICBDaGFuZ2VCeQogICAgQ3JlYXRlVGltZQogICAgQ2hhbmdlVGltZQopOwoKZm9yIG15ICRPcmRlckJ5Q29sdW1uIChAT3JkZXJCeUNvbHVtbnMpIHsKCiAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICMgV29ya09yZGVyU2VhcmNoKCkgc29ydHMgdGhlIElELUZpZWxkcyBudW1lcmljYWxseSwgdGhlIHN0cmluZyBmaWVsZHMgYWxwaGFiZXRpY2FsbHkuCiAgICAjIHRoZSBzb3J0aW5nIGlzIGNvbXBsZXRlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2Vjb25kIGNvbXBhcmlzb24KICAgIG15IEBTb3J0ZWRXb3JrT3JkZXJzOwogICAgaWYgKCAkT3JkZXJCeUNvbHVtbiBlcSAnV29ya09yZGVyVGl0bGUnICkgewogICAgICAgIEBTb3J0ZWRXb3JrT3JkZXJzID0gc29ydCB7CiAgICAgICAgICAgICRhLT57JE9yZGVyQnlDb2x1bW59IGNtcCAkYi0+eyRPcmRlckJ5Q29sdW1ufQogICAgICAgICAgICAgICAgfHwgJGItPntXb3JrT3JkZXJJRH0gPD0+ICRhLT57V29ya09yZGVySUR9CiAgICAgICAgfSBAV29ya09yZGVyc0Zvck9yZGVyQnlUZXN0czsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBTb3J0ZWRXb3JrT3JkZXJzID0gc29ydCB7CiAgICAgICAgICAgICRhLT57JE9yZGVyQnlDb2x1bW59IDw9PiAkYi0+eyRPcmRlckJ5Q29sdW1ufQogICAgICAgICAgICAgICAgfHwgJGItPntXb3JrT3JkZXJJRH0gPD0+ICRhLT57V29ya09yZGVySUR9CiAgICAgICAgfSBAV29ya09yZGVyc0Zvck9yZGVyQnlUZXN0czsKICAgIH0KICAgIG15IEBTb3J0ZWRJRHMgPSBtYXAgeyAkXy0+e1dvcmtPcmRlcklEfSB9IEBTb3J0ZWRXb3JrT3JkZXJzOwoKICAgICMgZHVtcCB0aGUgcmVmZXJlbmNlIGF0dHJpYnV0ZQogICAgbXkgJFJlZmVyZW5jZUxpc3QgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHMgKTsKCiAgICBteSAkU2VhcmNoUmVzdWx0ID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgQ2hhbmdlSURzICAgICAgICA9PiBbJE9yZGVyQnlUZXN0SURdLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyRPcmRlckJ5Q29sdW1uXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsnVXAnXSwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gV29ya09yZGVyR2V0KCkKICAgIG15ICRTZWFyY2hMaXN0ID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdCk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRTZWFyY2hMaXN0LAogICAgICAgICRSZWZlcmVuY2VMaXN0LAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBXb3JrT3JkZXJTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChVcCkuIgogICAgKTsKCiAgICAjIHNvcnQgaW4gdGhlIG90aGVyIGRpcmVjdGlvbgoKICAgICMgV29ya09yZGVyU2VhcmNoKCkgc29ydHMgdGhlIElELUZpZWxkcyBudW1lcmljYWxseSwgdGhlIHN0cmluZyBmaWVsZHMgYWxwaGFiZXRpY2FsbHkuCiAgICAjIHRoZSBzb3J0aW5nIGlzIGNvbXBsZXRlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2Vjb25kIGNvbXBhcmlzb24KICAgIGlmICggJE9yZGVyQnlDb2x1bW4gZXEgJ1dvcmtPcmRlclRpdGxlJyApIHsKICAgICAgICBAU29ydGVkV29ya09yZGVycyA9IHNvcnQgewogICAgICAgICAgICAkYi0+eyRPcmRlckJ5Q29sdW1ufSBjbXAgJGEtPnskT3JkZXJCeUNvbHVtbn0KICAgICAgICAgICAgICAgIHx8ICRiLT57V29ya09yZGVySUR9IDw9PiAkYS0+e1dvcmtPcmRlcklEfQogICAgICAgIH0gQFdvcmtPcmRlcnNGb3JPcmRlckJ5VGVzdHM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAU29ydGVkV29ya09yZGVycyA9IHNvcnQgewogICAgICAgICAgICAkYi0+eyRPcmRlckJ5Q29sdW1ufSA8PT4gJGEtPnskT3JkZXJCeUNvbHVtbn0KICAgICAgICAgICAgICAgIHx8ICRiLT57V29ya09yZGVySUR9IDw9PiAkYS0+e1dvcmtPcmRlcklEfQogICAgICAgIH0gQFdvcmtPcmRlcnNGb3JPcmRlckJ5VGVzdHM7CiAgICB9CiAgICBteSBAU29ydGVkSURzRG93biA9IG1hcCB7ICRfLT57V29ya09yZGVySUR9IH0gQFNvcnRlZFdvcmtPcmRlcnM7CgogICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICBteSAkUmVmZXJlbmNlTGlzdERvd24gPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBTb3J0ZWRJRHNEb3duICk7CgogICAgbXkgJFNlYXJjaFJlc3VsdERvd24gPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclNlYXJjaCgKICAgICAgICBDaGFuZ2VJRHMgPT4gWyRPcmRlckJ5VGVzdElEXSwKICAgICAgICBPcmRlckJ5ICAgPT4gWyRPcmRlckJ5Q29sdW1uXSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBkdW1wIHRoZSBhdHRyaWJ1dGUgZnJvbSBXb3JrT3JkZXJHZXQoKQogICAgbXkgJFNlYXJjaExpc3REb3duID0gRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdERvd24pOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkU2VhcmNoTGlzdERvd24sCiAgICAgICAgJFJlZmVyZW5jZUxpc3REb3duLAogICAgICAgICdUZXN0ICcgLiAkVGVzdENvdW50KysgLiAiOiBXb3JrT3JkZXJTZWFyY2goKSBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChEb3duKS4iCiAgICApOwoKICAgICMgY2hlY2sgaWYgV29ya09yZGVyLnBtIGhhbmRsZXMgbm9uLWV4aXN0ZW50IE9yZGVyQnlEaXJlY3Rpb24gY3JpdGVyaWEgY29ycmVjdAogICAgbXkgJFNlYXJjaFJlc3VsdFNpZGV3YXlzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJTZWFyY2goCiAgICAgICAgV29ya09yZGVyVGl0bGUgICA9PiAnV29ya09yZGVyQWRkKCkgZm9yIE9yZGVyQnkgLSBUaXRsZSAtICcgLiAkVW5pcXVlU2lnbmF0dXJlLAogICAgICAgIE9yZGVyQnkgICAgICAgICAgPT4gWyRPcmRlckJ5Q29sdW1uXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsnU2lkZXdheXMnXSwKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkU2VhcmNoUmVzdWx0U2lkZXdheXMsCiAgICAgICAgdW5kZWYsCiAgICAgICAgJ1Rlc3QgJyAuICRUZXN0Q291bnQrKyAuICI6IFdvcmtPcmRlclNlYXJjaCgpIE9yZGVyQnkgJE9yZGVyQnlDb2x1bW4gKFNpZGV3YXlzKS4iCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBzb3J0aW5nIG9mIGNoYW5nZXMgKHNvbWUgaGF2ZSBubyB3b3Jrb3JkZXIsIG90aGVycyBoYXZlIHNldmVyZWwgd29ya29yZGVycykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwpteSAlSURzVG9EZWxldGUgPSAoCiAgICBDaGFuZ2UgICAgPT4gW10sCiAgICBXb3JrT3JkZXIgPT4gW10sCik7Cm15ICRDaGFuZ2VzVGl0bGUgICAgICAgPSAnQ2hhbmdlU2VhcmNoT3JkZXJCeVRpbWVzIC0gJyAuICRVbmlxdWVTaWduYXR1cmU7Cm15IEBDaGFuZ2VzRm9yU29ydFRlc3QgPSAoCiAgICB7CiAgICAgICAgQ2hhbmdlID0+IHsKICAgICAgICAgICAgQ2hhbmdlVGl0bGUgPT4gJENoYW5nZXNUaXRsZSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFdvcmtvcmRlcnMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgPT4gJzIwMDktMDYtMzAgMDk6MzM6MTInLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgID0+ICcyMDA5LTA5LTAxIDAxOjEyOjU1JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIENoYW5nZSA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRDaGFuZ2VzVGl0bGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBXb3Jrb3JkZXJzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0wMi0yMSAxMzoyNTowOScsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTEzIDIyOjE1OjU2JywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzIwMDktMDUtMzEgMDk6MzM6MTInLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnMjAwOS0xMC0wMSAwMToxMjo1NScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMDMtMjUgMTM6MjU6MDknLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0wOS0xMyAyMjoxNTo1NicsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTA2LTAxIDA5OjMzOjEyJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMTEtMDEgMDE6MTI6NTUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIENoYW5nZSA9PiB7CiAgICAgICAgICAgIENoYW5nZVRpdGxlID0+ICRDaGFuZ2VzVGl0bGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBXb3Jrb3JkZXJzID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBDaGFuZ2UgPT4gewogICAgICAgICAgICBDaGFuZ2VUaXRsZSA9PiAkQ2hhbmdlc1RpdGxlLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgV29ya29yZGVycyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMDMtMjEgMTM6MjU6MDknLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0xMyAyMjoxNTo1NicsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTA2LTMwIDA5OjMzOjEyJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMDktMDEgMDE6MTI6NTUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIwIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMDktMTAtMTIgMjI6MTU6NTYnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTAzLTIyIDEzOjI1OjA5JywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMDktMTAtMTEgMjI6MTU6NTYnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAopOwoKbXkgQENoYW5nZUlEc0ZvclNvcnRUZXN0Owpmb3IgbXkgJENoYW5nZSAoQENoYW5nZXNGb3JTb3J0VGVzdCkgewoKICAgICMgY3JlYXRlIGNoYW5nZQogICAgbXkgJENoYW5nZUlEID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBZGQoICV7ICRDaGFuZ2UtPntDaGFuZ2V9IH0gKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ2hhbmdlSUQsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlIGZvciBzb3J0IHRlc3QgY3JlYXRlZCIsCiAgICApOwoKICAgICMgc3RvcmUgQ2hhbmdlSUQKICAgIHB1c2ggQENoYW5nZUlEc0ZvclNvcnRUZXN0LCAkQ2hhbmdlSUQ7CiAgICBwdXNoIEB7ICRJRHNUb0RlbGV0ZXtDaGFuZ2V9IH0sICRDaGFuZ2VJRDsKCiAgICAjIGFkZCB0aGUgd29ya29yZGVycyBmb3IgdGhlIGNoYW5nZQogICAgbXkgJFdvcmtPcmRlckNvdW50ID0gMTsKICAgIGZvciBteSAkV29ya09yZGVyICggQHsgJENoYW5nZS0+e1dvcmtvcmRlcnN9IH0gKSB7CiAgICAgICAgbXkgJFdvcmtPcmRlcklEID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgJXskV29ya09yZGVyfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXIgJFdvcmtPcmRlckNvdW50IGZvciBDaGFuZ2UgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAeyAkSURzVG9EZWxldGV7V29ya09yZGVyfSB9LCAkV29ya09yZGVySUQ7CgogICAgICAgICRXb3JrT3JkZXJDb3VudCsrOwogICAgfQoKICAgICMgY2hlY2sgd2hldGhlciB0aGUgd29ya29yZGVycyB3ZXJlIGFkZGVkCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkQ2hhbmdlRGF0YS0+e1dvcmtPcmRlckNvdW50fSwKICAgICAgICBzY2FsYXIgQHsgJENoYW5nZS0+e1dvcmtvcmRlcnN9IH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlR2V0KCk6IHdvcmtvcmRlcnMgd2VyZSBhZGRlZCIKICAgICk7Cn0KY29udGludWUgewogICAgJFRlc3RDb3VudCsrOwp9CgpteSBAVGVzdHBsYW4gPSAoCiAgICBbIDAsIDMsIDEsIDIgXSwgICAgIyBpbmRleCBvZiBjaGFuZ2VzIGluIEBDaGFuZ2VJRHNGb3JTb3J0VGVzdAogICAgWyAwLCAxLCAzLCAyIF0sCiAgICBbIDAsIDMsIDEsIDIgXSwKICAgIFsgMywgMSwgMCwgMiBdLAopOwoKIyBEbyB0aGUgdGVzdGluZwpteSAkT3JkZXJCeVRlc3RDb3VudCA9IDA7CmZvciBteSAkT3JkZXJCeUNvbHVtbiAocXcoUGxhbm5lZFN0YXJ0VGltZSBQbGFubmVkRW5kVGltZSBBY3R1YWxTdGFydFRpbWUgQWN0dWFsRW5kVGltZSkpIHsKCiAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OkluZGVudCA9IDA7CiAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpVc2VxcSAgPSAxOwoKICAgICMgZ2V0IHRoZSBjdXJyZW50IHJlZmVyZW5jZSBhcnJheQogICAgbXkgQFRlc3RwbGFuQWx0ZXJuYXRpdmUgPSBAeyAkVGVzdHBsYW5bJE9yZGVyQnlUZXN0Q291bnRdIH07CgogICAgIyBwbGFjZSB0aGUgbGFzdCBlbGVtZW50IGF0IGZyb250IG9mIHRoZSBhcnJheQogICAgIyBzb21lIERCcyBzb3J0IHRoZSBOVUxMcyB2YWx1ZXMgYXQgZnJvbnQgb2YgdGhlIHJlc3VsdCBzZXQKICAgIG15ICRMYXN0ID0gcG9wIEBUZXN0cGxhbkFsdGVybmF0aXZlOwogICAgdW5zaGlmdCBAVGVzdHBsYW5BbHRlcm5hdGl2ZSwgJExhc3Q7CgogICAgIyByZXN1bHQgd2hhdCB3ZSBleHBlY3QKICAgIG15IEBSZXN1bHRSZWZlcmVuY2UgPSBtYXAgeyAkQ2hhbmdlSURzRm9yU29ydFRlc3RbJF9dIH0gQHsgJFRlc3RwbGFuWyRPcmRlckJ5VGVzdENvdW50XSB9OwogICAgbXkgQFJlc3VsdFJlZmVyZW5jZUFsdGVybmF0aXZlID0gbWFwIHsgJENoYW5nZUlEc0ZvclNvcnRUZXN0WyRfXSB9IEBUZXN0cGxhbkFsdGVybmF0aXZlOwoKICAgICMgc2VhcmNoIHdpdGggZGlyZWN0aW9uICdET1dOJwogICAgbXkgJFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJENoYW5nZXNUaXRsZSwKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFsgJE9yZGVyQnlDb2x1bW4sICdDaGFuZ2VJRCcgXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ0Rvd24nLCAnVXAnIF0sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdCkKICAgICAgICBlcSBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBSZXN1bHRSZWZlcmVuY2UgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHQpLAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBSZXN1bHRSZWZlcmVuY2UgKSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlU2VhcmNoIE9yZGVyQnkgJE9yZGVyQnlDb2x1bW4gKERvd24pIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKAogICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHQpCiAgICAgICAgZXEgRGF0YTo6RHVtcGVyOjpEdW1wZXIoIFxAUmVzdWx0UmVmZXJlbmNlQWx0ZXJuYXRpdmUgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHQpLAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlciggXEBSZXN1bHRSZWZlcmVuY2VBbHRlcm5hdGl2ZSApLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2ggT3JkZXJCeSAkT3JkZXJCeUNvbHVtbiAoRG93bikiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHQpLAogICAgICAgICAgICB1bmRlZiwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2hhbmdlU2VhcmNoIE9yZGVyQnkgJE9yZGVyQnlDb2x1bW4gKERvd24pIiwKICAgICAgICApOwogICAgfQoKICAgICMgc2VhcmNoIHdpdGggZGlyZWN0aW9uICdVUCcKICAgIG15ICRTZWFyY2hSZXN1bHRVcCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlU2VhcmNoKAogICAgICAgIENoYW5nZVRpdGxlICAgICAgPT4gJENoYW5nZXNUaXRsZSwKICAgICAgICBPcmRlckJ5ICAgICAgICAgID0+IFsgJE9yZGVyQnlDb2x1bW4sICdDaGFuZ2VJRCcgXSwKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ1VwJywgJ0Rvd24nIF0sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgRGF0YTo6RHVtcGVyOjpEdW1wZXIoJFNlYXJjaFJlc3VsdFVwKQogICAgICAgIGVxIERhdGE6OkR1bXBlcjo6RHVtcGVyKCBbIHJldmVyc2UgQFJlc3VsdFJlZmVyZW5jZSBdICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0VXApLAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlciggWyByZXZlcnNlIEBSZXN1bHRSZWZlcmVuY2UgXSApLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2ggT3JkZXJCeSAkT3JkZXJCeUNvbHVtbiAoVXApIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKAogICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHRVcCkKICAgICAgICBlcSBEYXRhOjpEdW1wZXI6OkR1bXBlciggWyByZXZlcnNlIEBSZXN1bHRSZWZlcmVuY2VBbHRlcm5hdGl2ZSBdICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlcigkU2VhcmNoUmVzdWx0VXApLAogICAgICAgICAgICBEYXRhOjpEdW1wZXI6OkR1bXBlciggWyByZXZlcnNlIEBSZXN1bHRSZWZlcmVuY2VBbHRlcm5hdGl2ZSBdICksCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENoYW5nZVNlYXJjaCBPcmRlckJ5ICRPcmRlckJ5Q29sdW1uIChVcCkiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIERhdGE6OkR1bXBlcjo6RHVtcGVyKCRTZWFyY2hSZXN1bHRVcCksCiAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDaGFuZ2VTZWFyY2ggT3JkZXJCeSAkT3JkZXJCeUNvbHVtbiAoVXApIiwKICAgICAgICApOwogICAgfQoKICAgICRPcmRlckJ5VGVzdENvdW50Kys7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBhZHZhbmNlZCBzZWFyY2ggYnkgdGVzdHMgZm9yIHRpbWVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15IEBUaW1lU2VhcmNoVGVzdHMgPSAoCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0ZpcnN0IHdvcmtvcmRlciBpbiB0aGUgMTl0aCBjZW50dXJ5LicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMTkwOS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcxOTA5LTAxLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzE5MDktMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnMTkwOS0wMS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlY29uZCB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMTkwOS0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcxOTA5LTAxLTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzE5MDktMDEtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnMTkwOS0wMS0xOSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoaXJkIGNoYW5nZSB3aXRoIG9uZSB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMTkwOS0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcxOTA5LTAyLTI3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzE5MDktMDItMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnMTkwOS0wMi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0ZvdXJ0aCB3b3Jrb3JkZXIgaW4gdGhlIDE5dGggY2VudHVyeS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMTkwOS0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcxOTA5LTA0LTA3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzE5MDktMDItMjAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnMTkwOS0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgdGVzdCBmb3IgcGxhbm5lZCBzdGFydCB0aW1lCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMiwgMywgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZFN0YXJ0VGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDAsIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRTdGFydFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgdGVzdCBmb3IgcGxhbm5lZCBlbmQgdGltZQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSBhbmQgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDEtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA4LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTI3IDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMSwgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMDEtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgUGxhbm5lZEVuZFRpbWVOZXdlckRhdGUgYW5kIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiAgICAjIHRlc3QgZm9yIGFjdHVhbCBzdGFydCB0aW1lCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA5LTAxLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gWyAyLCAzLCBdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxTdGFydFRpbWVOZXdlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU9sZGVyRGF0ZSA9PiAnMTkwOS0wMS0xMiAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMCwgMSwgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lT2xkZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMDEtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsU3RhcnRUaW1lTmV3ZXJEYXRlIGFuZCBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0xMi0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKICAgICMgdGVzdCBmb3IgYWN0dWFsIGVuZCB0aW1lCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgYW5kIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTAxLTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSBhbmQgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDgtMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZSA9PiAnMTkwOC0xMi0zMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2VhcmNoIGZvciBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlLicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJTZWFyY2ggPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZSA9PiAnMTkwOS0wMi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IFsgMiwgMywgXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU5ld2VyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgPT4gJzE5MDktMTItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1NlYXJjaCBmb3IgQWN0dWFsRW5kVGltZU9sZGVyRGF0ZS4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgV29ya09yZGVyU2VhcmNoID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDktMDEtMjkgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbIDAsIDEsIF0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lT2xkZXJEYXRlID0+ICcxOTA4LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gW10sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdTZWFyY2ggZm9yIEFjdHVhbEVuZFRpbWVOZXdlckRhdGUgYW5kIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUuJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlclNlYXJjaCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lTmV3ZXJEYXRlID0+ICcxOTA5LTEyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWVPbGRlckRhdGUgPT4gJzE5MDgtMTItMzEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiBbXSwKICAgIH0sCgopOwoKbXkgJFRTVENvdW50ZXIgPSAxOwpteSBAVFNUV29ya09yZGVySURzOwpUU1RFU1Q6CmZvciBteSAkVFNUZXN0IChAVGltZVNlYXJjaFRlc3RzKSB7CiAgICBteSAkU291cmNlRGF0YSAgICA9ICRUU1Rlc3QtPntTb3VyY2VEYXRhfTsKICAgIG15ICRSZWZlcmVuY2VEYXRhID0gJFRTVGVzdC0+e1JlZmVyZW5jZURhdGF9OwoKICAgIG15ICRXb3JrT3JkZXJJRDsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6ICRUU1Rlc3QtPntEZXNjcmlwdGlvbn0gKFRTVGVzdCBjYXNlOiAkVFNUQ291bnRlcikiLAogICAgKTsKCiAgICBpZiAoICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfSApIHsKICAgICAgICAkV29ya09yZGVySUQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJBZGR9IH0sCiAgICAgICAgICAgIENoYW5nZUlEID0+ICRUaW1lU2VhcmNoVGVzdElELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV29ya09yZGVySUQsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlckFkZCIsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVFNUV29ya09yZGVySURzLCAkV29ya09yZGVySUQ7CiAgICAgICAgcHVzaCBAeyAkSURzVG9EZWxldGV7V29ya09yZGVyfSB9LCAkV29ya09yZGVySUQ7CiAgICB9CgogICAgbXkgJFNlYXJjaFJlc3VsdDsKICAgIGlmICggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJTZWFyY2h9ICkgewogICAgICAgICRTZWFyY2hSZXN1bHQgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclNlYXJjaCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntXb3JrT3JkZXJTZWFyY2h9IH0sCiAgICAgICAgICAgIENoYW5nZUlEcyA9PiBbJFRpbWVTZWFyY2hUZXN0SURdLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VhcmNoUmVzdWx0ICYmIHJlZiAkU2VhcmNoUmVzdWx0IGVxICdBUlJBWScsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFdvcmtPcmRlclNlYXJjaCgpIC0gTGlzdCBpcyBhbiBhcnJheSByZWZlcmVuY2UuIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRTVEVTVCBpZiAhJFNlYXJjaFJlc3VsdDsKCiAgICAgICAgIyBjaGVjayBudW1iZXIgb2YgZm91bmRlZCBjaGFuZ2UKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRTZWFyY2hSZXN1bHR9LAogICAgICAgICAgICBzY2FsYXIgQHskUmVmZXJlbmNlRGF0YX0sCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFdvcmtPcmRlclNlYXJjaCgpIC0gY29ycmVjdCBudW1iZXIgb2YgZm91bmQgY2hhbmdlcyIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYXAgYXJyYXkgaW5kZXggdG8gV29ya09yZGVySUQKICAgICAgICBteSBAUmVzdWx0V29ya09yZGVySURzOwogICAgICAgIGZvciBteSAkUmVzdWx0V29ya09yZGVySUQgKCBAeyRSZWZlcmVuY2VEYXRhfSApIHsKICAgICAgICAgICAgcHVzaCBAUmVzdWx0V29ya09yZGVySURzLCAkVFNUV29ya09yZGVySURzWyRSZXN1bHRXb3JrT3JkZXJJRF07CiAgICAgICAgfQoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCBwcmV0dHkgcHJpbnQKICAgICAgICBsb2NhbCAkRGF0YTo6RHVtcGVyOjpJbmRlbnQgPSAwOwogICAgICAgIGxvY2FsICREYXRhOjpEdW1wZXI6OlVzZXFxICA9IDE7CgogICAgICAgICMgZHVtcCB0aGUgYXR0cmlidXRlIGZyb20gV29ya09yZGVyU2VhcmNoKCkKICAgICAgICBteSAkU2VhcmNoUmVzdWx0RHVtcCA9IERhdGE6OkR1bXBlcjo6RHVtcGVyKCBzb3J0IEB7JFNlYXJjaFJlc3VsdH0gKTsKCiAgICAgICAgIyBkdW1wIHRoZSByZWZlcmVuY2UgYXR0cmlidXRlCiAgICAgICAgbXkgJFJlZmVyZW5jZUR1bXAKICAgICAgICAgICAgPSBEYXRhOjpEdW1wZXI6OkR1bXBlciggc29ydCBAUmVzdWx0V29ya09yZGVySURzICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlYXJjaFJlc3VsdER1bXAsCiAgICAgICAgICAgICRSZWZlcmVuY2VEdW1wLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiB8LSBXb3JrT3JkZXJTZWFyY2goKTogIgogICAgICAgICAgICAgICAgLiBEYXRhOjpEdW1wZXI6OkR1bXBlciggJFNvdXJjZURhdGEtPntXb3JrT3JkZXJTZWFyY2h9ICkKICAgICAgICAgICAgICAgIC4gJFNlYXJjaFJlc3VsdER1bXAsCiAgICAgICAgKTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7CiAgICAkVFNUQ291bnRlcisrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdCBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKbXkgQFdPQ1RHVGVzdHMgPSAoCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgd2l0aG91dCB0aW1lcy4nLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHdpdGggYWxsIHRpbWVzJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMiAyMzo1OTo1OScsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTEwLTAxIDAwOjA4OjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMTAtMDIgMDA6MTg6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJzIwMDktMTAtMDIgMjM6NTk6NTknLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnMjAwOS0xMC0wMSAwMDowODowMCcsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcyMDA5LTEwLTAyIDAwOjE4OjAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIHBsYW5uZWQgdGltZXMnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggcGxhbm5lZCB0aW1lcyBQbGFubmVkU3RhcnRUaW1lID0gUGxhbm5lZEVuZFRpbWUnLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzIwMDktMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IG9ubHkgd2l0aCBwbGFubmVkIHRpbWVzIFBsYW5uZWRTdGFydFRpbWUgPiBQbGFubmVkRW5kVGltZScsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowMDowMScsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbFN0YXJ0VGltZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxFbmRUaW1lJyAgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIFBsYW5uZWRTdGFydFRpbWUnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGRGYWlscyA9PiAxLAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgICAgICA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbFN0YXJ0VGltZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxFbmRUaW1lJyAgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIFBsYW5uZWRFbmRUaW1lJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbFN0YXJ0VGltZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxFbmRUaW1lJyAgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIEFjdHVhbFN0YXJ0VGltZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowODowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnMjAwOS0xMC0wMSAwMDowODowMCcsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggQWN0dWFsRW5kVGltZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgPT4gJzIwMDktMTAtMDEgMDA6MDg6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggYWN0dWFsIHRpbWVzJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMiAyMzo1OTo1OScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcyMDA5LTEwLTAyIDIzOjU5OjU5JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Rlc3QgZm9yIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgb25seSB3aXRoIEFjdHVhbFN0YXJ0VGltZSA9IEFjdHVhbEVuZFRpbWUnLAogICAgICAgIFNvdXJjZURhdGEgID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGRGYWlscyA9PiAxLAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgICAgICA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgPT4gJzIwMDktMTAtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCBvbmx5IHdpdGggQWN0dWFsU3RhcnRUaW1lID4gQWN0dWFsRW5kVGltZScsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lID0+ICcyMDA5LTEwLTAxIDAwOjAwOjAxJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICA9PiAnMjAwOS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHdpdGggYWxsIHRpbWVzICh3aXRoIHJlc2VydmVkIHRpbWUgUGxhbm5lZFN0YXJ0VGltZSknLAogICAgICAgIFNvdXJjZURhdGEgPT4gewogICAgICAgICAgICBDaGFuZ2VBZGQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFdvcmtPcmRlckFkZEZhaWxzID0+IDEsCiAgICAgICAgICAgIFdvcmtPcmRlckFkZCAgICAgID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFBsYW5uZWRTdGFydFRpbWUgPT4gJzk5OTktMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnOTk5OS0wMS0wMSAwMDowMDowMScsCiAgICAgICAgICAgICAgICBBY3R1YWxTdGFydFRpbWUgID0+ICcyMDA5LTEwLTAxIDAwOjA4OjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbEVuZFRpbWUgICAgPT4gJzIwMDktMTAtMDIgMDA6MTg6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCB3aXRoIGFsbCB0aW1lcyAod2l0aCByZXNlcnZlZCB0aW1lIFBsYW5uZWRFbmRUaW1lKScsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMTowMTowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICc5OTk5LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzIwMDktMTAtMDEgMDA6MDg6MDAnLAogICAgICAgICAgICAgICAgQWN0dWFsRW5kVGltZSAgICA9PiAnMjAwOS0xMC0wMiAwMDoxODowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgV29ya09yZGVyQ2hhbmdlVGltZUdldCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBSZXN1bHREYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZFN0YXJ0VGltZScgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRFbmRUaW1lJyAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxTdGFydFRpbWUnICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsRW5kVGltZScgICAgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+CiAgICAgICAgICAgICd0ZXN0IGZvciBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0IHdpdGggYWxsIHRpbWVzICh3aXRoIHJlc2VydmVkIHRpbWUgQWN0dWFsU3RhcnRUaW1lKScsCiAgICAgICAgU291cmNlRGF0YSA9PiB7CiAgICAgICAgICAgIENoYW5nZUFkZCA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgV29ya09yZGVyQWRkRmFpbHMgPT4gMSwKICAgICAgICAgICAgV29ya09yZGVyQWRkICAgICAgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUGxhbm5lZFN0YXJ0VGltZSA9PiAnMjAwOS0xMC0wMSAwMTowMTowMCcsCiAgICAgICAgICAgICAgICBQbGFubmVkRW5kVGltZSAgID0+ICcyMDA5LTEwLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgICAgIEFjdHVhbFN0YXJ0VGltZSAgPT4gJzk5OTktMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQgPT4gewogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICAgICAgICAgUmVzdWx0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ1BsYW5uZWRTdGFydFRpbWUnID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdQbGFubmVkRW5kVGltZScgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnQWN0dWFsU3RhcnRUaW1lJyAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbEVuZFRpbWUnICAgID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PgogICAgICAgICAgICAndGVzdCBmb3IgV29ya09yZGVyQ2hhbmdlVGltZUdldCB3aXRoIGFsbCB0aW1lcyAod2l0aCByZXNlcnZlZCB0aW1lIEFjdHVhbEVuZFRpbWUpJywKICAgICAgICBTb3VyY2VEYXRhID0+IHsKICAgICAgICAgICAgQ2hhbmdlQWRkID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBXb3JrT3JkZXJBZGRGYWlscyA9PiAxLAogICAgICAgICAgICBXb3JrT3JkZXJBZGQgICAgICA9PiB7CiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQbGFubmVkU3RhcnRUaW1lID0+ICcyMDA5LTEwLTAxIDAxOjAxOjAwJywKICAgICAgICAgICAgICAgIFBsYW5uZWRFbmRUaW1lICAgPT4gJzIwMDktMTAtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICAgICAgQWN0dWFsU3RhcnRUaW1lICA9PiAnMjAwOS0xMC0wMSAwMTowMTowMCcsCiAgICAgICAgICAgICAgICBBY3R1YWxFbmRUaW1lICAgID0+ICc5OTk5LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFJlc3VsdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICdQbGFubmVkU3RhcnRUaW1lJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICAnUGxhbm5lZEVuZFRpbWUnICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbFN0YXJ0VGltZScgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICdBY3R1YWxFbmRUaW1lJyAgICA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCik7CgpteSAkV09DVEdUZXN0Q291bnQgPSAxOwpmb3IgbXkgJFdPQ1RHVGVzdCAoQFdPQ1RHVGVzdHMpIHsKICAgIG15ICRTb3VyY2VEYXRhICAgID0gJFdPQ1RHVGVzdC0+e1NvdXJjZURhdGF9OwogICAgbXkgJFJlZmVyZW5jZURhdGEgPSAkV09DVEdUZXN0LT57UmVmZXJlbmNlRGF0YX07CgogICAgbXkgJENoYW5nZUlEOwogICAgbXkgJFdvcmtPcmRlcklEOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogJFdPQ1RHVGVzdC0+e0Rlc2NyaXB0aW9ufSAoV09DVEdUZXN0IGNhc2U6ICRXT0NUR1Rlc3RDb3VudCkiLAogICAgKTsKCiAgICBpZiAoICRTb3VyY2VEYXRhLT57Q2hhbmdlQWRkfSApIHsKICAgICAgICAkQ2hhbmdlSUQgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZUFkZCgKICAgICAgICAgICAgJXsgJFNvdXJjZURhdGEtPntDaGFuZ2VBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDaGFuZ2VJRCwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gQ2hhbmdlQWRkIiwKICAgICAgICApOwoKICAgICAgICBpZiAoJENoYW5nZUlEKSB7CiAgICAgICAgICAgICRUZXN0ZWRDaGFuZ2VJRHskQ2hhbmdlSUR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZH0gKSB7CiAgICAgICAgJFdvcmtPcmRlcklEID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBZGQoCiAgICAgICAgICAgICV7ICRTb3VyY2VEYXRhLT57V29ya09yZGVyQWRkfSB9LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU291cmNlRGF0YS0+e1dvcmtPcmRlckFkZEZhaWxzfSApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gV29ya09yZGVyQWRkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gV29ya09yZGVyQWRkIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAeyAkSURzVG9EZWxldGV7V29ya09yZGVyfSB9LCAkV29ya09yZGVySUQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0fSApIHsKICAgICAgICBteSAkVGltZSA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQ2hhbmdlVGltZUdldCgKICAgICAgICAgICAgJXsgJFJlZmVyZW5jZURhdGEtPntXb3JrT3JkZXJDaGFuZ2VUaW1lR2V0fSB9LAogICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICByZWYgJFRpbWUsCiAgICAgICAgICAgICdIQVNIJywKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogfC0gV29ya09yZGVyQ2hhbmdlVGltZUdldCgpIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgcmVmICRUaW1lIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICYmICV7JFRpbWV9CiAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIFdvcmtPcmRlckNoYW5nZVRpbWVHZXQoKSAtIEhhc2hSZWYgd2l0aCBjb250ZW50IiwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgIHJlZiAkVGltZSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJXskVGltZX0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgVGVzdCBmb3IgcmlnaHQgdmFsdWVzIGluIHJlc3VsdAogICAgICAgICAgICBUSU1FVkFMVUU6CiAgICAgICAgICAgIGZvciBteSAkVGltZVR5cGUgKCBrZXlzICV7JFRpbWV9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRUaW1lLT57JFRpbWVUeXBlfSwKICAgICAgICAgICAgICAgICAgICAkUmVmZXJlbmNlRGF0YS0+e1dvcmtPcmRlckNoYW5nZVRpbWVHZXR9LT57UmVzdWx0RGF0YX0tPnskVGltZVR5cGV9LAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IHwtIGNoZWNrIFRpbWVSZXN1bHQgKCRUaW1lVHlwZSkiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkVGVzdENvdW50Kys7CiAgICAkV09DVEdUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHRlc3RpbmcgdGhlIG1ldGhvZCBQZXJtaXNzaW9uKCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgKCRQZXJtaXNzaW9uVGVzdFdvcmtPcmRlcklEKSA9IGtleXMgJXsgJFdvcmtPcmRlcklERm9yQ2hhbmdlSUR7JFBlcm1pc3Npb25UZXN0SUR9IH07CgojIGdldCBtYXBwaW5nIG9mIHRoZSBncm91cCBuYW1lIHRvIHRoZSBncm91cCBpZApteSAlR3JvdXBOYW1lMklEID0gcmV2ZXJzZSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICk7CgpteSBAUGVybWlzc2lvblRlc3RzID0gKAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiAxCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0luaXRpYWxseSBubyBwcml2IGluIGFueSBncm91cCcsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFBlcm1pc3Npb25zID0+IHsKICAgICAgICAgICAgICAgIDAgPT4geyBybyA9PiAwLCBydyA9PiAwIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiAyCiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3JvIGluIGl0c20tY2hhbmdlJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMSwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDEsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gMwogICAgIyBUaGUgdHlwZSAncncnIGltcGxpZXMgYWxsIG90aGVyIHR5cGVzLiBTZWUgS2VybmVsOjpTeXN0ZW06Okdyb3VwX0dldFR5cGVTdHJpbmcoKQogICAgIyBUaGVyZWZvcmUgVXNlcjEgZWZmZWN0aXZlbHkgaGFzICdybycgaW4gJ2l0c20tY2hhbmdlJyBhbmQKICAgICMgdGhlIENoYW5nZUFnZW50Q2hlY2sgUGVybWlzc2lvbiBtb2R1bGUgZ2l2ZXMgJ3JvJyBhY2Nlc3MuCiAgICAjIE5vdGUgdGhhdCBXb3JrT3JkZXJBZ2VudENoZWNrIGdpdmVzICdydycgYWNjZXNzIG9ubHkgdG8gdGhlIHdvcmtvcmRlciBhZ2VudC4KICAgIHsKCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3J3IGluIGl0c20tY2hhbmdlIGdyYW50cyBybywgZ3JhbnRzIHJ3IHRvIHdvcmtvcmRlciBhZ2VudCcsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDAsIHJ3ID0+IDEsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UnfSwKICAgICAgICAgICAgICAgICAgICBVSUQgICAgICAgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4geyBybyA9PiAwLCBydyA9PiAxLCB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURhdGEgPT4gewogICAgICAgICAgICBQZXJtaXNzaW9ucyA9PiB7CiAgICAgICAgICAgICAgICAwID0+IHsgcm8gPT4gMSwgcncgPT4gMSwgfSwKICAgICAgICAgICAgICAgIDEgPT4geyBybyA9PiAxLCBydyA9PiAwLCB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgUGVybWlzc2lvbiB0ZXN0IE5vLiA0CiAgICAjIHJlc2V0IFVzZXIxIGFmdGVyIHRoZSBwcmV2aW91cyB0ZXN0CiAgICB7CiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ3Jldm9rZSBwcml2cyBmb3IgdXNlciAxJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDUKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncm8gaW4gaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtbWFuYWdlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDEsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFBlcm1pc3Npb25zID0+IHsKICAgICAgICAgICAgICAgIDAgPT4geyBybyA9PiAxLCBydyA9PiAwLCB9LAogICAgICAgICAgICAgICAgMSA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDYKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncncgaW4gaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtbWFuYWdlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDEsIHJ3ID0+IDEsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFBlcm1pc3Npb25zID0+IHsKICAgICAgICAgICAgICAgIDAgPT4geyBybyA9PiAxLCBydyA9PiAxLCB9LAogICAgICAgICAgICAgICAgMSA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDcKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAncm8gaW4gaXRzbS1jaGFuZ2UtYnVpbGRlciwgVXNlciAwIGlzIHRoZSBidWlsZGVyJywKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMSwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDEsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gOAogICAgewogICAgICAgIERlc2NyaXB0aW9uID0+ICdydyBpbiBpdHNtLWNoYW5nZS1idWlsZGVyLCBBZ2VudCBpcyB0aGUgYnVpbGRlcicsCiAgICAgICAgU291cmNlRGF0YSAgPT4gewogICAgICAgICAgICBHcm91cE1lbWJlckFkZCA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZSd9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtbWFuYWdlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdJRCAgICAgICAgPT4gJEdyb3VwTmFtZTJJRHsnaXRzbS1jaGFuZ2UtYnVpbGRlcid9LAogICAgICAgICAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7IHJvID0+IDAsIHJ3ID0+IDEsIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGF0YSA9PiB7CiAgICAgICAgICAgIFBlcm1pc3Npb25zID0+IHsKICAgICAgICAgICAgICAgIDAgPT4geyBybyA9PiAxLCBydyA9PiAxLCB9LAogICAgICAgICAgICAgICAgMSA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBQZXJtaXNzaW9uIHRlc3QgTm8uIDkKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAicm8gaW4gaXRzbS1jaGFuZ2UtYnVpbGRlciwgdXNlciAxIGlzbid0IHRoZSBidWlsZGVyIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMSwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIFBlcm1pc3Npb24gdGVzdCBOby4gMTAKICAgIHsKICAgICAgICBEZXNjcmlwdGlvbiA9PiAicncgaW4gaXRzbS1jaGFuZ2UtYnVpbGRlciwgdXNlciAxIGlzbid0IHRoZSBidWlsZGVyIiwKICAgICAgICBTb3VyY2VEYXRhICA9PiB7CiAgICAgICAgICAgIEdyb3VwTWVtYmVyQWRkID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cE5hbWUySUR7J2l0c20tY2hhbmdlJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1tYW5hZ2VyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBOYW1lMklEeydpdHNtLWNoYW5nZS1idWlsZGVyJ30sCiAgICAgICAgICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEYXRhID0+IHsKICAgICAgICAgICAgUGVybWlzc2lvbnMgPT4gewogICAgICAgICAgICAgICAgMCA9PiB7IHJvID0+IDAsIHJ3ID0+IDAsIH0sCiAgICAgICAgICAgICAgICAxID0+IHsgcm8gPT4gMCwgcncgPT4gMCwgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCik7CgpteSAkUGVybWlzc2lvblRlc3RDb3VudGVyID0gMTsKZm9yIG15ICRUZXN0IChAUGVybWlzc2lvblRlc3RzKSB7CiAgICBteSAkU291cmNlRGF0YSAgICA9ICRUZXN0LT57U291cmNlRGF0YX07CiAgICBteSAkUmVmZXJlbmNlRGF0YSA9ICRUZXN0LT57UmVmZXJlbmNlRGF0YX07CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiAkVGVzdC0+e0Rlc2NyaXB0aW9ufSAoUGVybWlzc2lvbiBUZXN0IGNhc2U6ICRQZXJtaXNzaW9uVGVzdENvdW50ZXIpIiwKICAgICk7CgogICAgIyBleGVjdXRlIHRoZSBzb3VyY2UgbW9kaWZpY2F0aW9ucwogICAgJFNvdXJjZURhdGEtPntHcm91cE1lbWJlckFkZH0gfHw9IFtdOwogICAgZm9yIG15ICRQYXJhbXMgKCBAeyAkU291cmNlRGF0YS0+e0dyb3VwTWVtYmVyQWRkfSB9ICkgewoKICAgICAgICAjIG1vZGlmeSB0aGUgZ3JvdXAgbWVtYmVyc2hpcAogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyQWRkKAogICAgICAgICAgICAleyRQYXJhbXN9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKCAkU3VjY2VzcywgIlBlcm1pc3Npb24gdGVzdCAkUGVybWlzc2lvblRlc3RDb3VudGVyOiBHcm91cE1lbWJlckFkZCgpIiwgKTsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSByZXN1bHQKICAgIGlmICggJFJlZmVyZW5jZURhdGEtPntQZXJtaXNzaW9uc30gKSB7CiAgICAgICAgZm9yIG15ICRVc2VySW5kZXggKCBzb3J0IGtleXMgJXsgJFJlZmVyZW5jZURhdGEtPntQZXJtaXNzaW9uc30gfSApIHsKICAgICAgICAgICAgbXkgJFByaXZzID0gJFJlZmVyZW5jZURhdGEtPntQZXJtaXNzaW9uc30tPnskVXNlckluZGV4fTsKICAgICAgICAgICAgZm9yIG15ICRUeXBlICgga2V5cyAleyRQcml2c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPntEZWJ1Z30gPSAxMDsKICAgICAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgV29ya09yZGVySUQgPT4gJFBlcm1pc3Npb25UZXN0V29ya09yZGVySUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRHNbJFVzZXJJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgQ2FjaGVkICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQcml2cy0+eyRUeXBlfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gdGVzdCAkUGVybWlzc2lvblRlc3RDb3VudGVyOiBVc2VyICRVc2VySW5kZXgsIHdpdGggVXNlclVEICRVc2VySURzWyRVc2VySW5kZXhdLCBoYXMgJFR5cGUgYWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAiUGVybWlzc2lvbiB0ZXN0ICRQZXJtaXNzaW9uVGVzdENvdW50ZXI6IFVzZXIgJFVzZXJJbmRleCwgd2l0aCBVc2VySUQgJFVzZXJJRHNbJFVzZXJJbmRleF0sIGhhcyBubyAkVHlwZSBhY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewogICAgJFBlcm1pc3Npb25UZXN0Q291bnRlcisrOwogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdGluZyB0aGUgbWV0aG9kIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgY2hhbmdlIGZvciB0aGlzIHRlc3QKbXkgJENoYW5nZUlERm9yUG9zc2libGVTdGF0ZXNUZXN0ID0gJFNlbGYtPntDaGFuZ2VPYmplY3R9LT5DaGFuZ2VBZGQoCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgY3JlYXRlIHdvcmtvcmRlciBmb3IgdGhpcyB0ZXN0Cm15ICRXb3JrT3JkZXJJREZvclBvc3NpYmxlU3RhdGVzVGVzdCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQWRkKAogICAgQ2hhbmdlSUQgICAgICAgPT4gJENoYW5nZUlERm9yUG9zc2libGVTdGF0ZXNUZXN0LAogICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgIFdvcmtPcmRlclN0YXRlID0+ICdhY2NlcHRlZCcsCik7CgojIFdoZW4gbm8gV29ya09yZGVySUQgaXMgZ2l2ZW4gV29ya09yZGVyUG9zc2libGVTdGF0ZXNHZXQoKSByZXR1cm5zIGEgbGlzdCBvZiBhbGwgc3RhdGVzLgpteSAkUG9zc2libGVTdGF0ZXMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KAoKICAgICMgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yUG9zc2libGVTdGF0ZXNUZXN0LAogICAgVXNlcklEID0+IDEsCikgfHwge307CgojIGRvIHRoZSBjaGVja3MKbXkgQFBvc3NpYmxlU3RhdGVJRHNSZWZlcmVuY2UgPSBAU29ydGVkV29ya09yZGVyU3RhdGVJRHM7CmZvciBteSAkUG9zc2libGVTdGF0ZUlEIChAUG9zc2libGVTdGF0ZUlEc1JlZmVyZW5jZSkgewogICAgbXkgKCAkRmlyc3RIYXNoUmVmLCAkU2Vjb25kSGFzaFJlZiApCiAgICAgICAgPSBncmVwIHsgJF8tPntLZXl9ID09ICRQb3NzaWJsZVN0YXRlSUQgfSBAeyRQb3NzaWJsZVN0YXRlc307CgogICAgIyBhIG1hdGNoIGlzIGV4cGVjdGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRmlyc3RIYXNoUmVmLAogICAgICAgICJDaGVjayBmb3IgcG9zc2libGUgc3RhdGUgaWQgJFBvc3NpYmxlU3RhdGVJRCIsCiAgICApOwoKICAgICMgdGhlIG5hbWUgc2hvdWxkIGFsc28gbWF0Y2gKICAgICRGaXJzdEhhc2hSZWYgfHw9IHt9OwogICAgbXkgJFBvc3NpYmxlU3RhdGVOYW1lID0gJFdvcmtPcmRlclN0YXRlSUQyTmFtZXskUG9zc2libGVTdGF0ZUlEfTsKICAgICRTZWxmLT5JcygKICAgICAgICAkRmlyc3RIYXNoUmVmLT57VmFsdWV9LAogICAgICAgICRQb3NzaWJsZVN0YXRlTmFtZSwKICAgICAgICAiQ2hlY2sgZm9yIHBvc3NpYmxlIHN0YXRlIG5hbWUgJFBvc3NpYmxlU3RhdGVJRCIsCiAgICApOwoKICAgICMgb25seSBvbmUgbWF0Y2ggaXMgZXhwZWN0ZWQKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU2Vjb25kSGFzaFJlZiwKICAgICAgICAiQ2hlY2sgdGhhdCB0aGUgc3RhdGUgaWQgJFBvc3NpYmxlU3RhdGVJRCBpcyByZXR1cm5lZCBvbmx5IG9uY2UuIiwKICAgICk7Cgp9CgojIHRoZXNlIG9iamVjdHMgc2hvdWxkIGJlIGRlbGV0ZWQKcHVzaCBAeyAkSURzVG9EZWxldGV7Q2hhbmdlfSB9LCAgICAkQ2hhbmdlSURGb3JQb3NzaWJsZVN0YXRlc1Rlc3Q7CnB1c2ggQHsgJElEc1RvRGVsZXRle1dvcmtPcmRlcn0gfSwgJFdvcmtPcmRlcklERm9yUG9zc2libGVTdGF0ZXNUZXN0OwoKIyBUT0RPOiBhZGQgdGVzdHMgZm9yIFdvcmtPcmRlclBvc3NpYmxlU3RhdGVzR2V0KCkgd2l0aCBhIFdvcmtPcmRlcklEIGFzIGFyZ3VtZW50CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgdGVzdGluZyBzdXBwb3J0IGZvciBhdHRhY2htZW50cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBjaGFuZ2UgZm9yIHRoaXMgdGVzdApteSAkQ2hhbmdlSURGb3JBdHRhY2htZW50VGVzdCA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlQWRkKAogICAgVXNlcklEID0+IDEsCik7CgojIGNyZWF0ZSB3b3Jrb3JkZXIgZm9yIHRoaXMgdGVzdApteSAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQWRkKAogICAgQ2hhbmdlSUQgICAgICAgPT4gJENoYW5nZUlERm9yQXR0YWNobWVudFRlc3QsCiAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgV29ya09yZGVyU3RhdGUgPT4gJ2FjY2VwdGVkJywKKTsKCiMgdGhlc2Ugb2JqZWN0cyBzaG91bGQgYmUgZGVsZXRlZCBsYXRlciBvbgpwdXNoIEB7ICRJRHNUb0RlbGV0ZXtDaGFuZ2V9IH0sICAgICRDaGFuZ2VJREZvckF0dGFjaG1lbnRUZXN0OwpwdXNoIEB7ICRJRHNUb0RlbGV0ZXtXb3JrT3JkZXJ9IH0sICRXb3JrT3JkZXJJREZvckF0dGFjaG1lbnRUZXN0OwoKIyB2ZXJpZnkgdGhhdCBpbml0aWFseSBubyBhdHRhY2htZW50IGV4aXN0cwpteSAlQXR0YWNobWVudExpc3QgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckF0dGFjaG1lbnRMaXN0KAogICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yQXR0YWNobWVudFRlc3QsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJFNlbGYtPklzKAogICAgc2NhbGFyKCBrZXlzICVBdHRhY2htZW50TGlzdCApLAogICAgMCwKICAgICdubyBhdHRhY2htZW50cyBpbml0aWFsbHknLAopOwoKbXkgQFRlc3RGaWxlTGlzdCA9ICgKICAgIHsKICAgICAgICBGaWxlbmFtZSAgICA9PiAnZmlyc3QgYXR0YWNobWVudCcsCiAgICAgICAgQ29udGVudCAgICAgPT4gJ0ZpcnN0IGF0dGFjaG1lbnQgZnJvbSBJVFNNV29ya09yZGVyLnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgIH0sCiAgICB7CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ3NlY29uZCBhdHRhY2htZW50JywKICAgICAgICBDb250ZW50ICAgICA9PiAnU2Vjb25kIGF0dGFjaG1lbnQgZnJvbSBJVFNNV29ya09yZGVyLnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgIH0sCik7CgpteSAkRmlsZUNvdW50ID0gMTsKbXkgJUZpbGVuYW1lMkZpbGVJRDsKZm9yIG15ICRUZXN0RmlsZSAoQFRlc3RGaWxlTGlzdCkgewoKICAgIG15ICRBZGRPayA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudEFkZCgKICAgICAgICAleyRUZXN0RmlsZX0sCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yQXR0YWNobWVudFRlc3QsCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlERm9yQXR0YWNobWVudFRlc3QsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSggJEFkZE9rLCAiQXR0YWNobWVudCAkRmlsZUNvdW50OiBhdHRhY2htZW50IGFkZGVkIiApOwoKICAgIG15ICVBdHRhY2htZW50TGlzdCA9ICRTZWxmLT57V29ya09yZGVyT2JqZWN0fS0+V29ya09yZGVyQXR0YWNobWVudExpc3QoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yQXR0YWNobWVudFRlc3QsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhcigga2V5cyAlQXR0YWNobWVudExpc3QgKSwKICAgICAgICAkRmlsZUNvdW50LAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IG51bWJlciBvZiBhdHRhY2htZW50cyBhZnRlciBhZGRpbmciLAogICAgKTsKCiAgICBteSAkRmlsZUlEID0gbWF4KCBrZXlzICVBdHRhY2htZW50TGlzdCApOwogICAgJEZpbGVuYW1lMkZpbGVJRHsgJFRlc3RGaWxlLT57RmlsZW5hbWV9IH0gPSAkRmlsZUlEOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkQXR0YWNobWVudExpc3R7JEZpbGVJRH0sCiAgICAgICAgJFRlc3RGaWxlLT57RmlsZW5hbWV9LAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGZpbGVuYW1lIGZyb20gV29ya09yZGVyQXR0YWNobWVudExpc3QoKSIsCiAgICApOwoKICAgIG15ICRBdHRhY2htZW50ID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50R2V0KAogICAgICAgIEZpbGVJRCA9PiAkRmlsZUlELAogICAgKTsKICAgICRTZWxmLT5UcnVlKCAkQXR0YWNobWVudCwgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogV29ya09yZGVyQXR0YWNobWVudEdldCgpIHJldHVybmVkIHRydWUiICk7CgogICAgZm9yIG15ICRBdHRyIChxdyhGaWxlbmFtZSBDb250ZW50IENvbnRlbnRUeXBlKSkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPnskQXR0cn0sCiAgICAgICAgICAgICRUZXN0RmlsZS0+eyRBdHRyfSwKICAgICAgICAgICAgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogJEF0dHIgZnJvbSBXb3JrT3JkZXJBdHRhY2htZW50R2V0IiwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBdHRhY2htZW50RXhpc3RzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50RXhpc3RzKAogICAgICAgIEZpbGVuYW1lICAgID0+ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBDaGFuZ2VJRCAgICA9PiAkQ2hhbmdlSURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKCAkQXR0YWNobWVudEV4aXN0cywgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogYXR0YWNobWVudCBleGlzdHMiICk7Cgp9CmNvbnRpbnVlIHsKICAgICRGaWxlQ291bnQrKzsKfQoKIyBub3cgZGVsZXRlIHRoZSBhdHRhY2htZW50cwokRmlsZUNvdW50ID0gMTsKZm9yIG15ICRUZXN0RmlsZSAoQFRlc3RGaWxlTGlzdCkgewoKICAgIG15ICRGaWxlSUQgICA9ICRGaWxlbmFtZTJGaWxlSUR7ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSB9OwogICAgbXkgJERlbGV0ZU9rID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlKAogICAgICAgIEZpbGVJRCAgICAgID0+ICRGaWxlSUQsCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklERm9yQXR0YWNobWVudFRlc3QsCiAgICAgICAgQ2hhbmdlSUQgICAgPT4gJENoYW5nZUlERm9yQXR0YWNobWVudFRlc3QsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRGVsZXRlT2ssCiAgICAgICAgIkF0dGFjaG1lbnQgJEZpbGVDb3VudDogYXR0YWNobWVudCBkZWxldGVkIiwKICAgICk7CgogICAgbXkgJUF0dGFjaG1lbnRMaXN0ID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50TGlzdCgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyKCBrZXlzICVBdHRhY2htZW50TGlzdCApLAogICAgICAgIDIgLSAkRmlsZUNvdW50LAogICAgICAgICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IG51bWJlciBvZiBhdHRhY2htZW50cyBhZnRlciBkZWxldGlvbiIsCiAgICApOwoKICAgIG15ICRBdHRhY2htZW50RXhpc3RzID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJBdHRhY2htZW50RXhpc3RzKAogICAgICAgIEZpbGVuYW1lICAgID0+ICRUZXN0RmlsZS0+e0ZpbGVuYW1lfSwKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBDaGFuZ2VJRCAgICA9PiAkQ2hhbmdlSURGb3JBdHRhY2htZW50VGVzdCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5GYWxzZSggJEF0dGFjaG1lbnRFeGlzdHMsICJBdHRhY2htZW50ICRGaWxlQ291bnQ6IGF0dGFjaG1lbnQgaXMgZ29uZSIgKTsKfQpjb250aW51ZSB7CiAgICAkRmlsZUNvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbiB0aGUgc3lzdGVtCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY2hhbmdlIHRoZSBuZXdseSBhZGRlZCB1c2VycwokQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJyk7CmlmICggIWRlZmluZWQgJENoZWNrRW1haWxBZGRyZXNzZXNPcmcgKSB7CiAgICAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9IDE7Cn0KJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICBWYWx1ZSA9PiAwLAopOwoKIyBzZXQgdW5pdHRlc3QgdXNlcnMgaW52YWxpZApmb3IgbXkgJFVuaXR0ZXN0VXNlcklEIChAVXNlcklEcykgewoKICAgICMgZ2V0IHVzZXIgZGF0YQogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFVuaXR0ZXN0VXNlcklELAogICAgKTsKCiAgICAjIHVwZGF0ZSB1c2VyCiAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyVXBkYXRlKAogICAgICAgICVVc2VyLAogICAgICAgIFZhbGlkSUQgPT4gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTG9va3VwKCBWYWxpZCA9PiAnaW52YWxpZCcgKSwKICAgICAgICBDaGFuZ2VVc2VySUQgPT4gMSwKICAgICk7Cn0KCiMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQokU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAopOwoKIyBkZWxldGUgdGhlIHRlc3Qgd29ya29yZGVycwpteSAkRGVsZXRlVGVzdENvdW50ID0gMTsKZm9yIG15ICRXb3JrT3JkZXJJRCAoIEB7ICRJRHNUb0RlbGV0ZXtXb3JrT3JkZXJ9IH0sIGtleXMgJVRlc3RlZFdvcmtPcmRlcklEICkgewogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckRlbGV0ZSgKICAgICAgICBXb3JrT3JkZXJJRCA9PiAkV29ya09yZGVySUQsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gV29ya09yZGVyRGVsZXRlKCkgKFdvcmtPcmRlcklEPSRXb3JrT3JkZXJJRCkiLAogICAgKTsKCiAgICAjIGRvdWJsZSBjaGVjayBXb3JrT3JkZXIgaXQgaXMgcmVhbGx5IGRlbGV0ZWQKICAgIG15ICRXb3JrT3JkZXJEYXRhID0gJFNlbGYtPntXb3JrT3JkZXJPYmplY3R9LT5Xb3JrT3JkZXJHZXQoCiAgICAgICAgV29ya09yZGVySUQgPT4gJFdvcmtPcmRlcklELAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICB1bmRlZiwKICAgICAgICAkV29ya09yZGVyRGF0YS0+e1dvcmtPcmRlcklEfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBXb3JrT3JkZXJEZWxldGUoKSAtIGRvdWJsZSBjaGVjayIsCiAgICAgICAgIkRlbGV0ZVRlc3QgJERlbGV0ZVRlc3RDb3VudCAtIGRvdWJsZSBjaGVjayAoV29ya09yZGVySUQ9JFdvcmtPcmRlcklEKSIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICREZWxldGVUZXN0Q291bnQrKzsKfQoKIyBkZWxldGUgdGhlIHRlc3QgY2hhbmdlcwpmb3IgbXkgJENoYW5nZUlEICggQHsgJElEc1RvRGVsZXRle0NoYW5nZX0gfSwga2V5cyAlVGVzdGVkQ2hhbmdlSUQgKSB7CiAgICBteSAkRGVsZXRlT2sgPSAkU2VsZi0+e0NoYW5nZU9iamVjdH0tPkNoYW5nZURlbGV0ZSgKICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRGVsZXRlT2ssCiAgICAgICAgIkRlbGV0ZVRlc3QgJERlbGV0ZVRlc3RDb3VudCAtIENoYW5nZURlbGV0ZSgpIChDaGFuZ2VJRD0kQ2hhbmdlSUQpIiwKICAgICk7CgogICAgIyBkb3VibGUgY2hlY2sgaWYgY2hhbmdlIGlzIHJlYWxseSBkZWxldGVkCiAgICBteSAkQ2hhbmdlRGF0YSA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlR2V0KAogICAgICAgIENoYW5nZUlEID0+ICRDaGFuZ2VJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENhY2hlICAgID0+IDAsCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkQ2hhbmdlRGF0YS0+e0NoYW5nZUlEfSwKICAgICAgICAiRGVsZXRlVGVzdCAkRGVsZXRlVGVzdENvdW50IC0gZG91YmxlIGNoZWNrIChDaGFuZ2VJRD0kQ2hhbmdlSUQpIiwKICAgICk7Cn0KY29udGludWUgewogICAgJERlbGV0ZVRlc3RDb3VudCsrOwp9CgojIHNldCBTZW5kTm90aWZpY2F0aW9ucyB0byBpdCdzIG9yaWdpbmFsIHZhbHVlCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0lUU01DaGFuZ2U6OlNlbmROb3RpZmljYXRpb25zJywKICAgIFZhbHVlID0+ICRTZW5kTm90aWZpY2F0aW9uc09yZywKKTsKCjE7Cg==
IyAtLQojIGNyb24vaXRzbWNoYW5nZV9jaGVjayAtIGl0c20gY2hhbmdlIGNoZWNrIGNyb24gb2YgdGhlIE9UUlMKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IGl0c21jaGFuZ2VfY2hlY2suZGlzdCx2IDEuMSAyMDEwLzAxLzI2IDE1OjU1OjMxIHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyBjaGVjayBldmVyeSAxMjAgbWluIHRoZSBjaGFuZ2VzCjQ1ICovMiAqICogKiAgICAkSE9NRS9iaW4vb3Rycy5JVFNNQ2hhbmdlc0NoZWNrLnBsID4+IC9kZXYvbnVsbAo=
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAF80lEQVR42mIUFhaWamtrm6IDBH9+//rNAAX/cTMgPCCXkZGB8d///8wzZsxcvmrVqiag8D+YPEAAMWRlZU34TyH4/Pnzf3l5+SRkiwECiEVBQV4RxEhu3sXw8Jcgg5g4LwM3NxsDFw8HAycnKwMLKyvDP6Drfv38zfDjxy+G799+Mnz78pPh+4/fDM8fv2VojNFm8DATY5CQkFB9+PAh3GCAAFSQywqAIBQFJ7S6hUa7/v/LonUEvaSHhkm7zn6Y4egk/PLn2NBvBleUmCCYKKhT0daKzuZU8nD4m8VrXNAM487kLOuVJTrwuyHtFUAszEzMYAY7KxMDw9/fDP9+MTL8+s7A8J3xP4OWAheDtSoXgzA3SA0bw79/nAy//vEx3H7yhWHd0Z8MXz4wMPz8+Z3h6ydGBiYmJpQ4AAggFiZmiMD799+A+C8DFwfQBUAhXXVBBmkxLoZ3f5kYvnxnZGBjAQYHMGp//WVguP/xL4OiLD/DlWtvGD5//s0A8jQjIyOKwQABxMQCdfEvYPi9v/Gc4eG9twyCPKwMYoKsDI+efmZ49Pwrw9tPvxj2nXzF8P3PP4ZL198wXLvxjmHr3scMb87dBYbhfYa/f/4yMDMzoxgMEEAsTCwQARY2NnCK+v3zJ8PXD18ZhNkZGfhFORjuPP/CcPrsc4br9z4w3LzxmuEXMOxP7r3AoM91gaEl+DWDJYc4MNwNGBiZmVHSI0AAsTAxQoKCHWgwuzQ/Q3m8NsPJG+8Zjp5+wcDHw8bw9ecfBnM1fqCr/jEoi7Mx6HzdydCXsI3BygQYLuImDPdO/Gb4dPUww/8/QGcjAYAAApoLCRtOLjagq1kYnn/5x6CpKcrAK8zN8PTTXwYhUR6GT/+YGTQ0JRikBBkY7HiWMFh53gPG5QsGhmenGJRk3jJo/j7BkKzP4cnBwCAPMxgggJhgLmYAWvAXGN7vvwDT51tgeH/7xyAnx8/w6iswsTCzMbz7/Ifh/Ht+hqnfehn2bxVhACedz48Yft3eycD8cRtDfICy6dZiu41Ak6RAxgEEEHNgYGCUoaGh+rMPfxgE+LkYeNmYgGmXlUGcn5WBC8gW5Qb66PsnBj6mHwxCwGT3nUWU4cEvcwaV75cZ/n9+zXCUs42B9fsbBoGXexgU5WUlfr98I3D48Y9NAAHE8ujRoycgG/J95eDh8+/fP2D6/MHwj4WT4e2eaQzczGcYPrIrMzDrBjOwcPIx/GKQYfj6po3h4+WVDDLqOgzPf+j8PTYv5H2k1kWRdEO20K6jDN0AAQBZAKb/A87OzugmJiZD/fz8CuHg4PbX2Nju6ennAAIBAQfx9fsA/NGpAB0U2gD4DjAA5/gOAOru8P7X087s7vDy9vMKIv/z8e7+qaysxpKato5tOgZGEwT8C6zL+MkCiAVYgJwLCQmxBzpUHIgZHRwcwtPT0+MkJKR4uTg5Gb5xCTEwfPzMwPz9LgO7rAXDb2Duvf/g8aNZ8xfOfnj75jFwlgQKAfHvF9//t8jzskiIczPIAAQQSqJubW2dDCuxPn369P/zt9//n5/e/v/vJLn//zeF/b+4qOH/h29/wPIX10z6rqerFQRPt0CHncnkfPs+l+u/MS9DKUAAsSCnaWDRZwLjsLOzA0uw7wz/pAwYXv6WY5D8codB+e83hpcH5jB8F1dh0Bb6yJFoKZNZePnaZpBrgR75aDX9eyiwJOIBsi8CBBByPvy3bt2689+/fzeSkZGR5ubmBmZTJgYufiGGnxxyDOwXFzNw8P9jEPz9huH789sMPEoKDBYmckp/nj4RO3zrzRZQEQcqRoAG3wSyPwIEEGrJAQEiQOBvYmJiLwcEwBpGkImDh+XPmaV/0hRuqyjpyHIxCKkwMHwDJfDXDAxKrgzljeunde1/lg8rP0EAIIAIIVDEAPMbgygQA1M2g32iGsPSa9nsH/5PFv3/v1Po/8VU7h9ROlygjCGNrBEggMhBTHNdGQ4cTeD47iPFsBTIdwJiVnRFAAFEDmKRZGCIAtLmoJyLSxFAgAEAU+1ynr9hxoQAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAFUklEQVR42mJgIAII6IZ5S/rN62DgkFRhIBIABBAzIQXipnHBGh6tedfuyH5kUQhzYeX+L/T31dn7QKmf+PQBBBBegwW0fD2MQieVXLr75z0bCzvn9xu/H/z946zCrevv+e//iz//P969g0svQADhNJhF3EjXMW1R45UHfz9r6sh7yMrx6QuIiqh/e/vlzeeb7I/+C/uZ8Wpqmv16vPsyw/+/39D1AwQQdoMZBUVccxd1fPgrxCalIGvPysrA9fMrAwMzAyOPsDSfFo+UkNLP9z/ff/6gxs6q5Gr+78/zPwxf791DNgIggLAZzO5cvKZbUFZHhktQyoSdg4H/BzA0/wLxH6C7fn0H2svOyMcvzavBysknxcUgxjFrRkq2oLq5+bnDJy4x/H3/BmQIQAAxIpvIqeRuZxNclKxjbKLz+Z+gDAsLo9iztwwM34CG/foCxB8gBv/6w8DwHWjRj98MDHNKGRg8DCH6t139/SY8wDf5y52dmwACiAVmqJJDTlj1hMlLOFkYWL/9Yvj35C0D06PXDAz//kMV/ANiIJsJ6pqPQNcXhSIMBQETFVYRbkEZfaAbNgEEEEgdA7eyu9PsuZNnm8sBDQWGpQgPA9M/oKv+/YPqABrI+B9i4G+g2FOgy/0dGBgqw4AC7y4CiR8M74GuD8tfuu/l6bkzQFoAAoiFgU9DbcHaHSudlBj4Vl5gYODjYWD48A3i0n9QV/77C/T6DwaG90CnvPjIwOCky8AwIfgaA8Pz68AY/c/w+/5NhvKZny4cnJkWBdTxGmQwQAAxMXz7+OvPt0+/zzwHupSPgUFWCGjQL6AM0MV/gfQPoCWfPjEwvP3MwPAE6FIPhTsMC0NXM/DwPmBgkNRjYBDTYGBVNGNItrjDI8nxXxIWLAABxMTw5/mD7YeuXXkItEdJFJSkgI4EuvAvEIOCA0T/AdK/gZZkaW1nWBi9hoFfkQOY0DmBXrvO8P/RKWAefMBgHhChsn153gYBFgZtkMEAAcQs69JYs2JqdIqmOAPDPmBwfQZ6lxkYpc/eAV0JdOk3YOx/AIY7P8NvhiVJexg4NdSBYQJMUT+BYfL3B8Pvh+cYPl47wfDl6T0GKVkZATMVbs8te28cAggg5k8fPv65/ZyTR0ZBT9VCj5HlHdCQJy/+M3CyMDK8BgbDy3eQFNHg95lBR/wSMKYFgQEOFPz8FGjrGwbmP78YOKWkGLg5GBlYGL8xKGuJCu7bc/EBQAAxMbw7f2zz5PgIVyNNp9jCLXtAadRUn5GBERgmqgJ/GeRFGBgK3BgYPA1+MPz9BrTpB9BQYK4Bh9nb28BE/Qpo0QtgeAFphg/giPn9h+EfQAAhct7ft4/vnVq+csWaQ5c+/xAR1jdUU2JkZ2LgAcaim/ZvBn52YJi8P8HAzAlMdL+B4cUC1PoHlEveQmgmYMrlAMY+Cw/D/KUndgMEEHqW/svw9cG1q0eXLd28Yfc5Fk5xURFFDaVLz1gY/gGThwbnYaBmoJd+Ag3++xVi2GegwWzAiGTnB2ZdIGblYpiz8OhugADCVbr9///t8c2bx5cvPbJrx+nf/zl5rr+VVWR9tuunlsZPVobfoHz9GeJSUILnACZ+dl4GBh5g+HPxMMybs+8gQAAxElsjMDAp2rIyPGFY32I4wTtC14jhKzDJ/GMFGg7EXMAgEASmVUYehgMbz74Nz1uaChBADKQCoOdlelPVN/4/6/3//+Xg//9v5/3//7Dy/9U1id8j7BXmAZXogtQBBBC5iC3PS2LG/xNh/++sCf+Z6KKwBOhuG2QFAAFECWI0kePM5mVicMUmCRBgAA+o7OKY/o/RAAAAAElFTkSuQmCC
Ly8gLS0KLy8gaXRzbS1jaGFuZ2VtYW5hZ2VtZW50LmpzIC0gcHJvdmlkZXMgSmF2YVNjcmlwdCBmdW5jdGlvbnMKLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMuY29tL1xuIjsKLy8gLS0KLy8gJElkOiBpdHNtLWNoYW5nZW1hbmFnZW1lbnQuanMsdiAxLjcgMjAxMC8wMS8xNSAxNjo1MjoyNSBiZXMgRXhwICQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKCi8vIENoZWNrIGlmIHRoZSB0aW1lIGNvdWxkIGJlIHZhbGlkLgovLyBCZXdhcmUgdGhhdCBkYXlzIGxpa2UgMjAxMC0wMi0yOSBhcmUgYWxsb3dlZC4KZnVuY3Rpb24gQ2hlY2tUaW1lKCBpZF9iYXNlICkgewoKICAgIC8vIGNoZWNrIHRoZSBwbGFubmVkIGVuZCB0aW1lCiAgICB2YXIgWWVhciAgID0gcGFyc2VJbnQoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBpZF9iYXNlICsgJ1llYXInICkudmFsdWUgKTsKICAgIHZhciBNb250aCAgPSBwYXJzZUludCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkX2Jhc2UgKyAnTW9udGgnICkudmFsdWUgKTsKICAgIHZhciBEYXkgICAgPSBwYXJzZUludCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkX2Jhc2UgKyAnRGF5JyApLnZhbHVlICk7CiAgICB2YXIgSG91ciAgID0gcGFyc2VJbnQoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBpZF9iYXNlICsgJ0hvdXInICkudmFsdWUgKTsKICAgIHZhciBNaW51dGUgPSBwYXJzZUludCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkX2Jhc2UgKyAnTWludXRlJyApLnZhbHVlICk7CgogICAgaWYgKAogICAgICAgIDAKICAgICAgICB8fCBpc05hTihZZWFyKSB8fCBpc05hTihNb250aCkgfHwgaXNOYU4oRGF5KSB8fCBpc05hTihIb3VyKSB8fCBpc05hTihNaW51dGUpCiAgICAgICAgfHwgKCBZZWFyICAgPCA5OTkgfHwgWWVhciAgID4gMTAwMDAgKQogICAgICAgIHx8ICggTW9udGggIDwgMSAgIHx8IE1vbnRoICA+IDEyICkKICAgICAgICB8fCAoIERheSAgICA8IDEgICB8fCBEYXkgICAgPiAzMSApCiAgICAgICAgfHwgKCBIb3VyICAgPCAwICAgfHwgSG91ciAgID4gMjMgKQogICAgICAgIHx8ICggTWludXRlIDwgMCAgIHx8IE1pbnV0ZSA+IDU5ICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9CgovLyBjaGVjayBpZiBzdGFydCB0aW1lIGlzIGJlZm9yZSBlbmQgdGltZQpmdW5jdGlvbiBDaGVja1N0YXJ0QmVmb3JlRW5kICggU3RhcnRQcmVmaXgsIEVuZFByZWZpeCwgRXJyb3JNc2cgKSB7CgogICAgLy8gZ2V0IHN0YXJ0IHRpbWUgdmFsdWVzCiAgICB2YXIgU3RhcnRZZWFyICAgPSBwYXJzZUludCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIFN0YXJ0UHJlZml4ICsgJ1llYXInICkudmFsdWUgKTsKICAgIHZhciBTdGFydE1vbnRoICA9IHBhcnNlSW50KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggU3RhcnRQcmVmaXggKyAnTW9udGgnICkudmFsdWUgKTsKICAgIHZhciBTdGFydERheSAgICA9IHBhcnNlSW50KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggU3RhcnRQcmVmaXggKyAnRGF5JyApLnZhbHVlICk7CiAgICB2YXIgU3RhcnRIb3VyICAgPSBwYXJzZUludCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIFN0YXJ0UHJlZml4ICsgJ0hvdXInICkudmFsdWUgKTsKICAgIHZhciBTdGFydE1pbnV0ZSA9IHBhcnNlSW50KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggU3RhcnRQcmVmaXggKyAnTWludXRlJyApLnZhbHVlICk7CgogICAgLy8gZ2V0IGVuZCB0aW1lIHZhbHVlcwogICAgdmFyIEVuZFllYXIgICA9IHBhcnNlSW50KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggRW5kUHJlZml4ICsgJ1llYXInICkudmFsdWUgKTsKICAgIHZhciBFbmRNb250aCAgPSBwYXJzZUludCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIEVuZFByZWZpeCArICdNb250aCcgKS52YWx1ZSApOwogICAgdmFyIEVuZERheSAgICA9IHBhcnNlSW50KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggRW5kUHJlZml4ICsgJ0RheScgKS52YWx1ZSApOwogICAgdmFyIEVuZEhvdXIgICA9IHBhcnNlSW50KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggRW5kUHJlZml4ICsgJ0hvdXInICkudmFsdWUgKTsKICAgIHZhciBFbmRNaW51dGUgPSBwYXJzZUludCggZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIEVuZFByZWZpeCArICdNaW51dGUnICkudmFsdWUgKTsKCiAgICAvLyBjaGVjayB5ZWFyCiAgICBpZiAoIFN0YXJ0WWVhciA8IEVuZFllYXIgKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoIFN0YXJ0WWVhciA+IEVuZFllYXIgKSB7CiAgICAgICAgYWxlcnQoRXJyb3JNc2cpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gY2hlY2sgbW9udGgKICAgIGlmICggU3RhcnRNb250aCA8IEVuZE1vbnRoICkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCBTdGFydE1vbnRoID4gRW5kTW9udGggKSB7CiAgICAgICAgYWxlcnQoRXJyb3JNc2cpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gY2hlY2sgZGF5CiAgICBpZiAoIFN0YXJ0RGF5IDwgRW5kRGF5ICkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCBTdGFydERheSA+IEVuZERheSApIHsKICAgICAgICBhbGVydChFcnJvck1zZyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBjaGVjayBob3VyCiAgICBpZiAoIFN0YXJ0SG91ciA8IEVuZEhvdXIgKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoIFN0YXJ0SG91ciA+IEVuZEhvdXIgKSB7CiAgICAgICAgYWxlcnQoRXJyb3JNc2cpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gY2hlY2sgbWludXRlCiAgICBpZiAoIFN0YXJ0TWludXRlIDwgRW5kTWludXRlICkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCBTdGFydE1pbnV0ZSA+IEVuZE1pbnV0ZSApIHsKICAgICAgICBhbGVydChFcnJvck1zZyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyB0aGUgdGltZXMgYXJlIGVxdWFsCiAgICBhbGVydChFcnJvck1zZyk7CgogICAgcmV0dXJuIGZhbHNlOwp9Cg==
IyAtLQojIElUU01DaGFuZ2VNYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01DaGFuZ2VNYW5hZ2VtZW50LnBtLHYgMS42MCAyMDEwLzA1LzIxIDEwOjIyOjEyIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNQ2hhbmdlTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SGlzdG9yeTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNQ2hhbmdlQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpJVFNNV29ya09yZGVyOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok5vdGlmaWNhdGlvbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlOjpUZW1wbGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOwp1c2UgS2VybmVsOjpTeXN0ZW06OlR5cGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNjAgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCklUU01DaGFuZ2VNYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKRnVuY3Rpb25zIGZvciBpbnN0YWxsaW5nIHRoZSBJVFNNQ2hhbmdlTWFuYWdlbWVudCBwYWNrYWdlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKICAgIHVzZSB2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUNoYW5nZU1hbmFnZW1lbnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkWE1MT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gdmFyOjpwYWNrYWdlc2V0dXA6OklUU01DaGFuZ2VNYW5hZ2VtZW50LT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFhNTE9iamVjdCAgICA9PiAkWE1MT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBFbmNvZGVPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBzeXNjb25maWcgb2JqZWN0CiAgICAkU2VsZi0+e1N5c0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyByZWJ1aWxkIFpaWiogZmlsZXMKICAgICRTZWxmLT57U3lzQ29uZmlnT2JqZWN0fS0+V3JpdGVEZWZhdWx0KCk7CgogICAgIyBkZWZpbmUgdGhlIFpaWiBmaWxlcwogICAgbXkgQFpaWkZpbGVzID0gKAogICAgICAgICdaWlpBQXV0by5wbScsCiAgICAgICAgJ1paWkF1dG8ucG0nLAogICAgKTsKCiAgICAjIHJlbG9hZCB0aGUgWlpaIGZpbGVzIChtb2RfcGVybCB3b3JrYXJvdW5kKQogICAgZm9yIG15ICRaWlpGaWxlIChAWlpaRmlsZXMpIHsKCiAgICAgICAgUFJFRklYOgogICAgICAgIGZvciBteSAkUHJlZml4IChASU5DKSB7CiAgICAgICAgICAgIG15ICRGaWxlID0gJFByZWZpeCAuICcvS2VybmVsL0NvbmZpZy9GaWxlcy8nIC4gJFpaWkZpbGU7CiAgICAgICAgICAgIG5leHQgUFJFRklYIGlmICEtZiAkRmlsZTsKICAgICAgICAgICAgZG8gJEZpbGU7CiAgICAgICAgICAgIGxhc3QgUFJFRklYOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgICRTZWxmLT57Q1NWT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpDU1YtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUeXBlT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlR5cGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q2hhbmdlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ2hhbmdlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fQogICAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01DaGFuZ2VDSVBBbGxvY2F0ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6SVRTTVN0YXRlTWFjaGluZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57V29ya09yZGVyT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6OklUU01Xb3JrT3JkZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57SGlzdG9yeU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Okhpc3RvcnktPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Tm90aWZpY2F0aW9uT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OklUU01DaGFuZ2U6Ok5vdGlmaWNhdGlvbi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUZW1wbGF0ZU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNoYW5nZTo6VGVtcGxhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdHNPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRzLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVmaW5lIGZpbGUgcHJlZml4IGZvciBzdGF0cwogICAgJFNlbGYtPntGaWxlUHJlZml4fSA9ICdJVFNNU3RhdHMnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLWNoYW5nZQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jaGFuZ2UnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBDaGFuZ2UgbWFzayBhY2Nlc3MgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nLAogICAgKTsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1jaGFuZ2UtYnVpbGRlcgogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jaGFuZ2UtYnVpbGRlcicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIENoYW5nZSBCdWlsZGVycy4nLAogICAgKTsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1jaGFuZ2UtbWFuYWdlcgogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIENoYW5nZSBNYW5hZ2Vycy4nLAogICAgKTsKCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICAjIHNldCBkZWZhdWx0IENJUCBtYXRyaXgKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgICMgc2V0IGRlZmF1bHQgU3RhdGVNYWNoaW5lIHNldHRpbmdzCiAgICAkU2VsZi0+X1N0YXRlTWFjaGluZURlZmF1bHRTZXQoKTsKCiAgICAjIGFkZCBub3RpZmljYXRpb25zCiAgICAkU2VsZi0+X0FkZE5vdGlmaWNhdGlvbnMoKTsKCiAgICAjIGFkZCBzeXN0ZW0gbm90aWZpY2F0aW9ucwogICAgJFNlbGYtPl9BZGRTeXN0ZW1Ob3RpZmljYXRpb25zKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIHRoZSBncm91cCBpdHNtLWNoYW5nZQogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jaGFuZ2UnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdHcm91cCBmb3IgSVRTTSBDaGFuZ2UgbWFzayBhY2Nlc3MgaW4gdGhlIGFnZW50IGludGVyZmFjZS4nLAogICAgKTsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1jaGFuZ2UtYnVpbGRlcgogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jaGFuZ2UtYnVpbGRlcicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIENoYW5nZSBCdWlsZGVycy4nLAogICAgKTsKCiAgICAjIGFkZCB0aGUgZ3JvdXAgaXRzbS1jaGFuZ2UtbWFuYWdlcgogICAgJFNlbGYtPl9Hcm91cEFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnaXRzbS1jaGFuZ2UtbWFuYWdlcicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0dyb3VwIGZvciBJVFNNIENoYW5nZSBNYW5hZ2Vycy4nLAogICAgKTsKCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICAjIHNldCBkZWZhdWx0IENJUCBtYXRyaXgKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgICMgc2V0IGRlZmF1bHQgU3RhdGVNYWNoaW5lIHNldHRpbmdzCiAgICAkU2VsZi0+X1N0YXRlTWFjaGluZURlZmF1bHRTZXQoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJFNlbGYtPntTdGF0c09iamVjdH0tPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICApOwoKICAgICMgc2V0IGRlZmF1bHQgQ0lQIG1hdHJpeCAodGhpcyBpcyBvbmx5IGRvbmUgaWYgbm8gbWF0cml4IGV4aXN0cykKICAgICRTZWxmLT5fQ0lQRGVmYXVsdE1hdHJpeFNldCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fMl8wXzMoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDIuMC4zLgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21Mb3dlclRoYW5fMl8wXzMoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fMl8wXzMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFkZCBuZXcgbm90aWZpY2F0aW9ucyB0aGF0IHdlcmUgYWRkZWQgaW4gdmVyc2lvbiAyLjAuMwogICAgJFNlbGYtPl9BZGROb3RpZmljYXRpb25zTmV3SW5fMl8wXzMoKTsKCiAgICAjIGFkZCBuZXcgc3lzdGVtIG5vdGlmaWNhdGlvbnMgdGhhdCB3ZXJlIGFkZGVkIGluIHZlcnNpb24gMi4wLjMKICAgICRTZWxmLT5fQWRkU3lzdGVtTm90aWZpY2F0aW9uc05ld0luXzJfMF8zKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlRnJvbUJldGExKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiAxLjMuOTIgKGJldGEyKS4KCkFsc28gdGhlIHRlbXBsYXRlIHN0cnVjdHVyZSBjaGFuZ2VkIGZyb20gKGJldGExKSB0byAxLjMuOTIgKGJldGEyKSwKc28gdGhlIG9sZCB0ZW1wbGF0ZXMgbXVzdCBiZSBkZWxldGVkLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tQmV0YTEoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21CZXRhMSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgRGVsZXRlIGFsbCB0ZW1wbGF0ZXMsIGFzIHRoZSB0ZW1wbGF0ZSBzdHJ1Y3R1cmUgaGFzIGNoYW5nZWQgcHJpb3IgdG8gQmV0YSAxLgogICAgJFNlbGYtPl9EZWxldGVUZW1wbGF0ZXMoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVGcm9tQmV0YTIoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDEuMy45MyAoYmV0YTMpLgoKVGhlcmUgaGF2ZSBiZWVuIG1hbnkgY2hhbmdlcyBpbiB0aGUgc3l0ZW0gbm90aWZpY2F0aW9uIHRleHRzCmZyb20gMS4zLjkxIChiZXRhMSkgdG8gMS4zLjkyIChiZXRhMikgc28gd2UgbmVlZCB0byBkZWxldGUKdGhlIG9sZCBub3RpZmljYXRpb25zIGFuZCBhZGQgdGhlIG5ldyBvbmVzLgoKRnVydGhlcm1vcmUsIGluIHRoZSBpbnN0YWxsYXRpb24gYW5kIHVwZ3JhZGUgcHJvY2VzcyBmb3IgMS4zLjkyIChCZXRhIDIpIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGluCnRoZSBjcmVhdGlvbiBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2VzLiBUaGUgRW5nbGlzaCBtZXNzYWdlIGZvciAnV29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWQnCmVuZGVkIHVwIGluIHRoZSBzbG90IG9mIHRoZSBFbmdsaXNoIG1lc3NhZ2UgZm9yICdXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZCcuClRoaXMgaXMgcmVjdGlmaWVkIGJ5IHJlaW5zZXJ0aW5nIHRoZSBub3RpZmljYXRpb25zIGZvciB1cGdyYWRlcyBmcm9tIEJldGEgMiBvciBlYXJsaWVyLgoKPWN1dAoKc3ViIENvZGVVcGdyYWRlRnJvbUJldGEyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgc3lzdGVtIG5vdGlmaWNhdGlvbnMKICAgICRTZWxmLT5fRGVsZXRlU3lzdGVtTm90aWZpY2F0aW9ucygpOwoKICAgICMgYWRkIHN5c3RlbSBub3RpZmljYXRpb25zCiAgICAkU2VsZi0+X0FkZFN5c3RlbU5vdGlmaWNhdGlvbnMoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWxldGUgYWxsIGxpbmtzIHdpdGggY2hhbmdlIGFuZCB3b3Jrb3JkZXIgb2JqZWN0cwogICAgJFNlbGYtPl9MaW5rRGVsZXRlKCk7CgogICAgIyBkZWFjdGl2YXRlIHRoZSBncm91cCBpdHNtLWNoYW5nZQogICAgJFNlbGYtPl9Hcm91cERlYWN0aXZhdGUoCiAgICAgICAgTmFtZSA9PiAnaXRzbS1jaGFuZ2UnLAogICAgKTsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIGl0c20tY2hhbmdlLWJ1aWxkZXIKICAgICRTZWxmLT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ2l0c20tY2hhbmdlLWJ1aWxkZXInLAogICAgKTsKCiAgICAjIGRlYWN0aXZhdGUgdGhlIGdyb3VwIGl0c20tY2hhbmdlLW1hbmFnZXIKICAgICRTZWxmLT5fR3JvdXBEZWFjdGl2YXRlKAogICAgICAgIE5hbWUgPT4gJ2l0c20tY2hhbmdlLW1hbmFnZXInLAogICAgKTsKCiAgICAjIGRlbGV0ZSBzeXN0ZW0gbm90aWZpY2F0aW9ucwogICAgJFNlbGYtPl9EZWxldGVTeXN0ZW1Ob3RpZmljYXRpb25zKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1pdGVtIF9Hcm91cEFkZCgpCgphZGQgYSBncm91cAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+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+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQ0lQRGVmYXVsdE1hdHJpeFNldCgpCgpzZXQgdGhlIGRlZmF1bHQgQ0lQIG1hdHJpeAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0NJUERlZmF1bHRNYXRyaXhTZXQoKTsKCj1jdXQKCnN1YiBfQ0lQRGVmYXVsdE1hdHJpeFNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGN1cnJlbnQgYWxsb2NhdGlvbiBsaXN0CiAgICBteSAkTGlzdCA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiBpZiAhJExpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRMaXN0IG5lICdIQVNIJzsKCiAgICAjIHNldCBubyBtYXRyaXggaWYgYWxyZWFkeSBkZWZpbmVkCiAgICByZXR1cm4gaWYgJXskTGlzdH07CgogICAgIyBkZWZpbmUgdGhlIGFsbG9jYXRpb25zCiAgICAjICRBbGxvY2F0aW9ue0ltcGFjdH0tPntDYXRlZ29yeX0gPSBQcmlvcml0eQogICAgbXkgJUFsbG9jYXRpb247CiAgICAkQWxsb2NhdGlvbnsnMSB2ZXJ5IGxvdyd9LT57JzEgdmVyeSBsb3cnfSAgID0gJzEgdmVyeSBsb3cnOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eycyIGxvdyd9ICAgICAgICA9ICcxIHZlcnkgbG93JzsKICAgICRBbGxvY2F0aW9ueycxIHZlcnkgbG93J30tPnsnMyBub3JtYWwnfSAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzEgdmVyeSBsb3cnfS0+eyc0IGhpZ2gnfSAgICAgICA9ICcyIGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMSB2ZXJ5IGxvdyd9LT57JzUgdmVyeSBoaWdoJ30gID0gJzMgbm9ybWFsJzsKICAgICRBbGxvY2F0aW9ueycyIGxvdyd9LT57JzEgdmVyeSBsb3cnfSAgICAgICAgPSAnMSB2ZXJ5IGxvdyc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eycyIGxvdyd9ICAgICAgICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueycyIGxvdyd9LT57JzMgbm9ybWFsJ30gICAgICAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzIgbG93J30tPnsnNCBoaWdoJ30gICAgICAgICAgICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnMiBsb3cnfS0+eyc1IHZlcnkgaGlnaCd9ICAgICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnMyBub3JtYWwnfS0+eycxIHZlcnkgbG93J30gICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueyczIG5vcm1hbCd9LT57JzIgbG93J30gICAgICAgICAgPSAnMiBsb3cnOwogICAgJEFsbG9jYXRpb257JzMgbm9ybWFsJ30tPnsnMyBub3JtYWwnfSAgICAgICA9ICczIG5vcm1hbCc7CiAgICAkQWxsb2NhdGlvbnsnMyBub3JtYWwnfS0+eyc0IGhpZ2gnfSAgICAgICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnMyBub3JtYWwnfS0+eyc1IHZlcnkgaGlnaCd9ICAgID0gJzQgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNCBoaWdoJ30tPnsnMSB2ZXJ5IGxvdyd9ICAgICAgID0gJzIgbG93JzsKICAgICRBbGxvY2F0aW9ueyc0IGhpZ2gnfS0+eycyIGxvdyd9ICAgICAgICAgICAgPSAnMyBub3JtYWwnOwogICAgJEFsbG9jYXRpb257JzQgaGlnaCd9LT57JzMgbm9ybWFsJ30gICAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzQgaGlnaCd9LT57JzQgaGlnaCd9ICAgICAgICAgICA9ICc0IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzQgaGlnaCd9LT57JzUgdmVyeSBoaWdoJ30gICAgICA9ICc1IHZlcnkgaGlnaCc7CiAgICAkQWxsb2NhdGlvbnsnNSB2ZXJ5IGhpZ2gnfS0+eycxIHZlcnkgbG93J30gID0gJzMgbm9ybWFsJzsKICAgICRBbGxvY2F0aW9ueyc1IHZlcnkgaGlnaCd9LT57JzIgbG93J30gICAgICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc1IHZlcnkgaGlnaCd9LT57JzMgbm9ybWFsJ30gICAgPSAnNCBoaWdoJzsKICAgICRBbGxvY2F0aW9ueyc1IHZlcnkgaGlnaCd9LT57JzQgaGlnaCd9ICAgICAgPSAnNSB2ZXJ5IGhpZ2gnOwogICAgJEFsbG9jYXRpb257JzUgdmVyeSBoaWdoJ30tPnsnNSB2ZXJ5IGhpZ2gnfSA9ICc1IHZlcnkgaGlnaCc7CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpJbXBhY3QnLAogICAgKTsKICAgIG15ICVJbXBhY3RMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW1wYWN0TGlzdH07CgogICAgIyBnZXQgY2F0ZWdvcnkgbGlzdAogICAgbXkgJENhdGVnb3J5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2F0ZWdvcnknLAogICAgKTsKICAgIG15ICVDYXRlZ29yeUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRDYXRlZ29yeUxpc3R9OwoKICAgICMgZ2V0IHByaW9yaXR5IGxpc3QKICAgIG15ICRQcmlvcml0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNoYW5nZU1hbmFnZW1lbnQ6OlByaW9yaXR5JywKICAgICk7CiAgICBteSAlUHJpb3JpdHlMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskUHJpb3JpdHlMaXN0fTsKCiAgICAjIGNyZWF0ZSB0aGUgYWxsb2NhdGlvbiBtYXRyaXgKICAgIG15ICVBbGxvY2F0aW9uTWF0cml4OwogICAgSU1QQUNUOgogICAgZm9yIG15ICRJbXBhY3QgKCBrZXlzICVBbGxvY2F0aW9uICkgewoKICAgICAgICBuZXh0IElNUEFDVCBpZiAhJEltcGFjdExpc3RSZXZlcnNleyRJbXBhY3R9OwoKICAgICAgICAjIGV4dHJhY3QgaW1wYWN0IGlkCiAgICAgICAgbXkgJEltcGFjdElEID0gJEltcGFjdExpc3RSZXZlcnNleyRJbXBhY3R9OwoKICAgICAgICBDQVRFR09SWToKICAgICAgICBmb3IgbXkgJENhdGVnb3J5ICgga2V5cyAleyAkQWxsb2NhdGlvbnskSW1wYWN0fSB9ICkgewoKICAgICAgICAgICAgbmV4dCBDQVRFR09SWSBpZiAhJENhdGVnb3J5TGlzdFJldmVyc2V7JENhdGVnb3J5fTsKCiAgICAgICAgICAgICMgZXh0cmFjdCBwcmlvcml0eQogICAgICAgICAgICBteSAkUHJpb3JpdHkgPSAkQWxsb2NhdGlvbnskSW1wYWN0fS0+eyRDYXRlZ29yeX07CgogICAgICAgICAgICBuZXh0IENBVEVHT1JZIGlmICEkUHJpb3JpdHlMaXN0UmV2ZXJzZXskUHJpb3JpdHl9OwoKICAgICAgICAgICAgIyBleHRyYWN0IGNyaXRpY2FsaXR5IGlkIGFuZCBwcmlvcml0eSBpZAogICAgICAgICAgICBteSAkQ2F0ZWdvcnlJRCA9ICRDYXRlZ29yeUxpc3RSZXZlcnNleyRDYXRlZ29yeX07CiAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJFByaW9yaXR5TGlzdFJldmVyc2V7JFByaW9yaXR5fTsKCiAgICAgICAgICAgICRBbGxvY2F0aW9uTWF0cml4eyRJbXBhY3RJRH0tPnskQ2F0ZWdvcnlJRH0gPSAkUHJpb3JpdHlJRDsKICAgICAgICB9CiAgICB9CgogICAgIyBzYXZlIHRoZSBtYXRyaXgKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5BbGxvY2F0ZVVwZGF0ZSgKICAgICAgICBBbGxvY2F0ZURhdGEgPT4gXCVBbGxvY2F0aW9uTWF0cml4LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1N0YXRlTWFjaGluZURlZmF1bHRTZXQoKQoKc2V0IHRoZSBkZWZhdWx0IHN0YXRlIG1hY2hpbmUKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TdGF0ZU1hY2hpbmVEZWZhdWx0U2V0KCk7Cgo9Y3V0CgpzdWIgX1N0YXRlTWFjaGluZURlZmF1bHRTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0aGUgY2hhbmdlIHN0YXRlcyBmcm9tIHRoZSBnZW5lcmFsIGNhdGFsb2cKICAgIG15ICVOYW1lMkNoYW5nZVN0YXRlSUQgPSByZXZlcnNlICV7CiAgICAgICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgICkKICAgICAgICB9OwoKICAgICMgZ2V0IHRoZSB3b3Jrb3JkZXIgc3RhdGVzIGZyb20gdGhlIGdlbmVyYWwgY2F0YWxvZwogICAgbXkgJU5hbWUyV29ya09yZGVyU3RhdGVJRCA9IHJldmVyc2UgJXsKICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDaGFuZ2VNYW5hZ2VtZW50OjpXb3JrT3JkZXI6OlN0YXRlJywKICAgICAgICAgICAgKQogICAgICAgIH07CgogICAgIyBkZWZpbmUgQ2hhbmdlU3RhdGUgdHJhbnNpdGlvbnMKICAgIG15ICVDaGFuZ2VTdGF0ZVRyYW5zaXRpb25zID0gKAogICAgICAgIDAgPT4gWydyZXF1ZXN0ZWQnXSwKICAgICAgICAncmVxdWVzdGVkJyA9PiBbICdyZWplY3RlZCcsICdyZXRyYWN0ZWQnLCAncGVuZGluZyBhcHByb3ZhbCcsICdpbiBwcm9ncmVzcycgXSwKICAgICAgICAncGVuZGluZyBhcHByb3ZhbCcgPT4gWyAncmVqZWN0ZWQnLCAncmV0cmFjdGVkJywgJ2FwcHJvdmVkJyBdLAogICAgICAgICdhcHByb3ZlZCcgICAgPT4gWyAncmV0cmFjdGVkJywgICAnaW4gcHJvZ3Jlc3MnIF0sCiAgICAgICAgJ2luIHByb2dyZXNzJyA9PiBbICdwZW5kaW5nIHBpcicsICdyZXRyYWN0ZWQnLCAnZmFpbGVkJywgJ3N1Y2Nlc3NmdWwnLCAnY2FuY2VsZWQnIF0sCiAgICAgICAgJ3BlbmRpbmcgcGlyJyA9PiBbICdmYWlsZWQnLCAgICAgICdzdWNjZXNzZnVsJyBdLAogICAgICAgICdyZWplY3RlZCcgICA9PiBbMF0sCiAgICAgICAgJ3JldHJhY3RlZCcgID0+IFswXSwKICAgICAgICAnZmFpbGVkJyAgICAgPT4gWzBdLAogICAgICAgICdzdWNjZXNzZnVsJyA9PiBbMF0sCiAgICAgICAgJ2NhbmNlbGVkJyAgID0+IFswXSwKICAgICk7CgogICAgIyBkZWZpbmUgV29ya09yZGVyU3RhdGUgdHJhbnNpdGlvbnMKICAgIG15ICVXb3JrT3JkZXJTdGF0ZVRyYW5zaXRpb25zID0gKAogICAgICAgIDAgICAgICAgICAgICAgPT4gWydjcmVhdGVkJ10sCiAgICAgICAgJ2NyZWF0ZWQnICAgICA9PiBbICdhY2NlcHRlZCcsICdjYW5jZWxlZCcgXSwKICAgICAgICAnYWNjZXB0ZWQnICAgID0+IFsgJ3JlYWR5JywgJ2NhbmNlbGVkJyBdLAogICAgICAgICdyZWFkeScgICAgICAgPT4gWyAnaW4gcHJvZ3Jlc3MnLCAnY2FuY2VsZWQnIF0sCiAgICAgICAgJ2luIHByb2dyZXNzJyA9PiBbICdjbG9zZWQnLCAnY2FuY2VsZWQnIF0sCiAgICAgICAgJ2NhbmNlbGVkJyAgICA9PiBbMF0sCiAgICAgICAgJ2Nsb3NlZCcgICAgICA9PiBbMF0sCiAgICApOwoKICAgICMgaW5zZXJ0IENoYW5nZVN0YXRlIHRyYW5zaXRpb25zIGludG8gZGF0YWJhc2UKICAgIGZvciBteSAkU3RhdGUgKCBzb3J0IGtleXMgJUNoYW5nZVN0YXRlVHJhbnNpdGlvbnMgKSB7CgogICAgICAgIGZvciBteSAkTmV4dFN0YXRlICggQHsgJENoYW5nZVN0YXRlVHJhbnNpdGlvbnN7JFN0YXRlfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgc3RhdGUgdHJhbnNpdGlvbgogICAgICAgICAgICBteSAkVHJhbnNpdGlvbklEID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEeyRTdGF0ZX0gICAgIHx8IDAsCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiAkTmFtZTJDaGFuZ2VTdGF0ZUlEeyROZXh0U3RhdGV9IHx8IDAsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6Q2hhbmdlOjpTdGF0ZScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaW5zZXJ0IFdvcmtPcmRlclN0YXRlIHRyYW5zaXRpb25zIGludG8gZGF0YWJhc2UKICAgIGZvciBteSAkU3RhdGUgKCBzb3J0IGtleXMgJVdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnMgKSB7CgogICAgICAgIGZvciBteSAkTmV4dFN0YXRlICggQHsgJFdvcmtPcmRlclN0YXRlVHJhbnNpdGlvbnN7JFN0YXRlfSB9ICkgewoKICAgICAgICAgICAgIyBhZGQgc3RhdGUgdHJhbnNpdGlvbgogICAgICAgICAgICBteSAkVHJhbnNpdGlvbklEID0gJFNlbGYtPntTdGF0ZU1hY2hpbmVPYmplY3R9LT5TdGF0ZVRyYW5zaXRpb25BZGQoCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICA9PiAkTmFtZTJXb3JrT3JkZXJTdGF0ZUlEeyRTdGF0ZX0gICAgIHx8IDAsCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiAkTmFtZTJXb3JrT3JkZXJTdGF0ZUlEeyROZXh0U3RhdGV9IHx8IDAsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q2hhbmdlTWFuYWdlbWVudDo6V29ya09yZGVyOjpTdGF0ZScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTGlua0RlbGV0ZSgpCgpkZWxldGUgYWxsIGV4aXN0aW5nIGxpbmtzIHdpdGggY2hhbmdlIGFuZCB3b3Jrb3JkZXIgb2JqZWN0cwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0xpbmtEZWxldGUoKTsKCj1jdXQKCnN1YiBfTGlua0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBjaGFuZ2Ugb2JqZWN0IGlkcwogICAgbXkgJENoYW5nZUlEcyA9ICRTZWxmLT57Q2hhbmdlT2JqZWN0fS0+Q2hhbmdlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIGNoYW5nZSBsaW5rcwogICAgaWYgKCAkQ2hhbmdlSURzICYmIHJlZiAkQ2hhbmdlSURzIGVxICdBUlJBWScgKSB7CgogICAgICAgIENIQU5HRUlEOgogICAgICAgIGZvciBteSAkQ2hhbmdlSUQgKCBAeyRDaGFuZ2VJRHN9ICkgewoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIGxpbmtzIHRvIHRoaXMgY2hhbmdlCiAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtEZWxldGVBbGwoCiAgICAgICAgICAgICAgICBPYmplY3QgPT4gJ0lUU01DaGFuZ2UnLAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRDaGFuZ2VJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgYWxsIHdvcmtvcmRlciBpZHMgZm9yIHRoaXMgY2hhbmdlCiAgICAgICAgICAgIG15ICRXb3JrT3JkZXJJRHMgPSAkU2VsZi0+e1dvcmtPcmRlck9iamVjdH0tPldvcmtPcmRlckxpc3QoCiAgICAgICAgICAgICAgICBDaGFuZ2VJRCA9PiAkQ2hhbmdlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDSEFOR0VJRCBpZiAhJFdvcmtPcmRlcklEczsKICAgICAgICAgICAgbmV4dCBDSEFOR0VJRCBpZiByZWYgJFdvcmtPcmRlcklEcyBuZSAnQVJSQVknOwoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIHdvcmtvcmRlciBsaW5rcwogICAgICAgICAgICBmb3IgbXkgJFdvcmtPcmRlcklEICggQHskV29ya09yZGVySURzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtEZWxldGVBbGwoCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdJVFNNV29ya09yZGVyJywKICAgICAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFdvcmtPcmRlcklELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0FkZE5vdGlmaWNhdGlvbnMoKQoKQWRkIENoYW5nZU1hbmFnZW1lbnQgc3BlY2lmaWMgbm90aWZpY2F0aW9ucy4KCiAgICBteSAkU3VjY2VzcyA9ICRTZXR1cE9iamVjdC0+X0FkZE5vdGlmaWNhdGlvbnM7Cgo9Y3V0CgpzdWIgX0FkZE5vdGlmaWNhdGlvbnMgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICMgZGVmaW5lIG5vdGlmaWNhdGlvbnMgYW5kIHJlY2lwaWVudHMKICAgIG15IEBOb3RpZmljYXRpb25zID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAncmVxdWVzdGVkIGNoYW5nZXMnLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdDaGFuZ2VBZGQnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2Ugd2FzIHJlcXVlc3RlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJycsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWyAnQ2hhbmdlSW5pdGlhdG9ycycsICdDaGFuZ2VNYW5hZ2VyJywgJ0NoYW5nZUJ1aWxkZXInIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3BlbmRpbmcgYXBwcm92YWwgY2hhbmdlcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhaXRzIGZvciBhcHByb3ZhbCcsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJ3BlbmRpbmcgYXBwcm92YWwnLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsgJ0NoYW5nZU1hbmFnZXInLCAnQ0FCQ3VzdG9tZXJzJywgJ0NBQkFnZW50cycgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAncGVuZGluZyBQSVIgY2hhbmdlcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhaXRzIGZvciBQSVInLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICdwZW5kaW5nIFBJUicsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWydDaGFuZ2VNYW5hZ2VyJ10sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3JlamVjdGVkIGNoYW5nZXMnLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICdDaGFuZ2VTdGF0ZScsCiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIGNoYW5nZSB3YXMgcmVqZWN0ZWQnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICdyZWplY3RlZCcsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsICdDQUJDdXN0b21lcnMnLCAnQ0FCQWdlbnRzJywgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ2FwcHJvdmVkIGNoYW5nZXMnLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICdDaGFuZ2VTdGF0ZScsCiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0NoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIGNoYW5nZSB3YXMgYXBwcm92ZWQnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICdhcHByb3ZlZCcsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsICdDaGFuZ2VDQUJDdXN0b21lcnMnLCAnQ2hhbmdlQ0FCQWdlbnRzJywKICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZ2VudHMnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgID0+ICdjaGFuZ2VzIGluIHByb2dyZXNzJywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICdpbiBwcm9ncmVzcycsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWyAnQ2hhbmdlTWFuYWdlcicsICdXb3JrT3JkZXJBZ2VudHMnIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3N1Y2Nlc3NmdWwgY2hhbmdlcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhcyBzdWNjZXNzZnVsJywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnc3VjY2Vzc2Z1bCcsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsICdDQUJDdXN0b21lcnMnLCAnQ0FCQWdlbnRzJywgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ2ZhaWxlZCBjaGFuZ2VzJywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2UgZmFpbGVkJywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnZmFpbGVkJywKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlQnVpbGRlcicsICdDaGFuZ2VJbml0aWF0b3JzJywgJ0NBQkN1c3RvbWVycycsICdDQUJBZ2VudHMnLCAnV29ya09yZGVyQWdlbnRzJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnY2FuY2VsZWQgY2hhbmdlcycsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJ0NoYW5nZVN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIHdhcyBjYW5jZWxlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJ2NhbmNlbGVkJywKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3JldHJhY3RlZCBjaGFuZ2VzJywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQ2hhbmdlU3RhdGUnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSBjaGFuZ2Ugd2FzIHJldHJhY3RlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJ3JldHJhY3RlZCcsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsICdDQUJDdXN0b21lcnMnLCAnQ0FCQWdlbnRzJywgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0NoYW5nZU1hbmFnZXIgdXBkYXRlJywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQ2hhbmdlTWFuYWdlcklEJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQ2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IHRoZSBjaGFuZ2VtYW5hZ2VyIHdhcyByZXBsYWNlZCcsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJy4qJywKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlTWFuYWdlcicsICdPbGRDaGFuZ2VNYW5hZ2VyJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnQ2hhbmdlQnVpbGRlciB1cGRhdGUnLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICdDaGFuZ2VCdWlsZGVySUQnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgdGhlIGNoYW5nZWJ1aWxkZXIgd2FzIHJlcGxhY2VkJywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnLionLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VNYW5hZ2VyJywgJ0NoYW5nZUJ1aWxkZXInLCAnT2xkQ2hhbmdlQnVpbGRlcicsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ25ldyB3b3Jrb3JkZXInLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdXb3JrT3JkZXJBZGQnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSB3b3Jrb3JkZXIgd2FzIGFkZGVkJywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnJywKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlQnVpbGRlcicsICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3VwZGF0ZWQgc3RhdGUgZm9yIHdvcmtvcmRlcicsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJ1dvcmtPcmRlclN0YXRlJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnV29ya09yZGVyVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgdGhlIHN0YXRlIG9mIGEgd29ya29yZGVyIHdhcyBjaGFuZ2VkJywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnLionLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ1dvcmtPcmRlckFnZW50cycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3VwZGF0ZWQgd29ya29yZGVyIGFnZW50IGZvciB3b3Jrb3JkZXInLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICdXb3JrT3JkZXJBZ2VudElEJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnV29ya09yZGVyVXBkYXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IHRoZSB3b3Jrb3JkZXIgYWdlbnQgd2FzIHJlcGxhY2VkJywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnLionLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ1dvcmtPcmRlckFnZW50JywgJ09sZFdvcmtPcmRlckFnZW50JywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAndGlja2V0IGxpbmtlZCB0byBjaGFuZ2UnLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdDaGFuZ2VMaW5rQWRkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgdGlja2V0IHdhcyBsaW5rZWQgdG8gdGhlIGNoYW5nZScsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJycsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlSW5pdGlhdG9ycycsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3BsYW5uZWQgc3RhcnQgdGltZSBvZiBjaGFuZ2UgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0NoYW5nZVBsYW5uZWRTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIGhhcyByZWFjaGVkIHRoZSBwbGFubmVkIHN0YXJ0IHRpbWUnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICcnLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgID0+ICdwbGFubmVkIGVuZCB0aW1lIG9mIGNoYW5nZSByZWFjaGVkJywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQ2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIGhhcyByZWFjaGVkIHRoZSBwbGFubmVkIGVuZCB0aW1lJywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnJywKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlQnVpbGRlcicsICdDaGFuZ2VNYW5hZ2VyJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnYWN0dWFsIHN0YXJ0IHRpbWUgb2YgY2hhbmdlIHJlYWNoZWQnLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIGhhcyByZWFjaGVkIHRoZSBhY3R1YWwgc3RhcnQgdGltZScsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJycsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlTWFuYWdlcicsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ2FjdHVhbCBlbmQgdGltZSBvZiBjaGFuZ2UgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0NoYW5nZUFjdHVhbEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIGhhcyByZWFjaGVkIHRoZSBhY3R1YWwgZW5kIHRpbWUnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICcnLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywgJ0NoYW5nZU1hbmFnZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgID0+ICdyZXF1ZXN0ZWQgdGltZSBvZiBjaGFuZ2UgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0NoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgY2hhbmdlIGhhcyByZWFjaGVkIHRoZSByZXF1ZXN0ZWQgdGltZScsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJycsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLCAnQ2hhbmdlTWFuYWdlcicsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3BsYW5uZWQgc3RhcnQgdGltZSBvZiB3b3Jrb3JkZXIgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ1dvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgd29ya29yZGVyIGhhcyByZWFjaGVkIHRoZSBwbGFubmVkIHN0YXJ0IHRpbWUnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICcnLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ3BsYW5uZWQgZW5kIHRpbWUgb2Ygd29ya29yZGVyIHJlYWNoZWQnLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICcnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ2luZm9ybSByZWNpcGllbnRzIHRoYXQgYSB3b3Jrb3JkZXIgaGFzIHJlYWNoZWQgdGhlIHBsYW5uZWQgZW5kIHRpbWUnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICcnLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ2FjdHVhbCBzdGFydCB0aW1lIG9mIHdvcmtvcmRlciByZWFjaGVkJywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnJywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnV29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhIHdvcmtvcmRlciBoYXMgcmVhY2hlZCB0aGUgYWN0dWFsIHN0YXJ0IHRpbWUnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICcnLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ2FjdHVhbCBlbmQgdGltZSBvZiB3b3Jrb3JkZXIgcmVhY2hlZCcsCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgPT4gJycsCiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ1dvcmtPcmRlckFjdHVhbEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGEgd29ya29yZGVyIGhhcyByZWFjaGVkIHRoZSBhY3R1YWwgZW5kIHRpbWUnLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICcnLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdXb3JrT3JkZXJBZ2VudCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ2FjdGlvbiBleGVjdXRpb24gc3VjY2Vzc2Z1bGx5JywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQWN0aW9uUmVzdWx0JywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQWN0aW9uRXhlY3V0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhbiBhY3Rpb24gd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseScsCiAgICAgICAgICAgIFJ1bGUgICAgICAgPT4gJ3N1Y2Nlc3NmdWxseScsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgID0+ICdhY3Rpb24gZXhlY3V0aW9uIHVuc3VjY2Vzc2Z1bGx5JywKICAgICAgICAgICAgQXR0cmlidXRlICA9PiAnQWN0aW9uUmVzdWx0JywKICAgICAgICAgICAgRXZlbnQgICAgICA9PiAnQWN0aW9uRXhlY3V0ZScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnaW5mb3JtIHJlY2lwaWVudHMgdGhhdCBhbiBhY3Rpb24gd2FzIGV4ZWN1dGVkIHVuc3VjY2Vzc2Z1bGx5JywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAndW5zdWNjZXNzZnVsbHknLAogICAgICAgICAgICBSZWNpcGllbnRzID0+IFsKICAgICAgICAgICAgICAgICdDaGFuZ2VCdWlsZGVyJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGNhY2hlIGZvciBsb29rdXAgcmVzdWx0cwogICAgbXkgJUhpc3RvcnlUeXBlczsKCiAgICAjIGFkZCBub3RpZmljYXRpb25zCiAgICBOT1RJRklDQVRJT046CiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbiAoQE5vdGlmaWNhdGlvbnMpIHsKCiAgICAgICAgIyBmaW5kIHJlY2lwaWVudHMKICAgICAgICBteSBAUmVjaXBpZW50SURzOwogICAgICAgIGZvciBteSAkUmVjaXBpZW50ICggQHsgJE5vdGlmaWNhdGlvbi0+e1JlY2lwaWVudHN9IH0gKSB7CiAgICAgICAgICAgIG15ICRSZWNpcGllbnRJRCA9ICRTZWxmLT57Tm90aWZpY2F0aW9uT2JqZWN0fS0+UmVjaXBpZW50TG9va3VwKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRJRCkgewogICAgICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50SURzLCAkUmVjaXBpZW50SUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGV2ZW50IGlkCiAgICAgICAgbXkgJEV2ZW50SUQgPQogICAgICAgICAgICAkSGlzdG9yeVR5cGVzeyAkTm90aWZpY2F0aW9uLT57RXZlbnR9IH0KICAgICAgICAgICAgfHwgJFNlbGYtPntIaXN0b3J5T2JqZWN0fS0+SGlzdG9yeVR5cGVMb29rdXAoIEhpc3RvcnlUeXBlID0+ICROb3RpZmljYXRpb24tPntFdmVudH0gKTsKCiAgICAgICAgIyBpbnNlcnQgbm90aWZpY2F0aW9uCiAgICAgICAgbXkgJFJ1bGVJRCA9ICRTZWxmLT57Tm90aWZpY2F0aW9uT2JqZWN0fS0+Tm90aWZpY2F0aW9uUnVsZUFkZCgKICAgICAgICAgICAgJXskTm90aWZpY2F0aW9ufSwKICAgICAgICAgICAgRXZlbnRJRCAgICAgID0+ICRFdmVudElELAogICAgICAgICAgICBSZWNpcGllbnRJRHMgPT4gXEBSZWNpcGllbnRJRHMsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0FkZE5vdGlmaWNhdGlvbnNOZXdJbl8yXzBfMygpCgpBZGQgQ2hhbmdlTWFuYWdlbWVudCBzcGVjaWZpYyBub3RpZmljYXRpb25zIHRoYXQgd2VyZSBhZGRlZCBpbiB2ZXJzaW9uIDIuMC4zLgoKICAgIG15ICRTdWNjZXNzID0gJFNldHVwT2JqZWN0LT5fQWRkTm90aWZpY2F0aW9uc05ld0luXzJfMF8zOwoKPWN1dAoKc3ViIF9BZGROb3RpZmljYXRpb25zTmV3SW5fMl8wXzMgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICMgZGVmaW5lIG5vdGlmaWNhdGlvbnMgYW5kIHJlY2lwaWVudHMKICAgIG15IEBOb3RpZmljYXRpb25zID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnYWN0aW9uIGV4ZWN1dGlvbiBzdWNjZXNzZnVsbHknLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICdBY3Rpb25SZXN1bHQnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdBY3Rpb25FeGVjdXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGFuIGFjdGlvbiB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5JywKICAgICAgICAgICAgUnVsZSAgICAgICA9PiAnc3VjY2Vzc2Z1bGx5JywKICAgICAgICAgICAgUmVjaXBpZW50cyA9PiBbCiAgICAgICAgICAgICAgICAnQ2hhbmdlQnVpbGRlcicsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ2FjdGlvbiBleGVjdXRpb24gdW5zdWNjZXNzZnVsbHknLAogICAgICAgICAgICBBdHRyaWJ1dGUgID0+ICdBY3Rpb25SZXN1bHQnLAogICAgICAgICAgICBFdmVudCAgICAgID0+ICdBY3Rpb25FeGVjdXRlJywKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICdpbmZvcm0gcmVjaXBpZW50cyB0aGF0IGFuIGFjdGlvbiB3YXMgZXhlY3V0ZWQgdW5zdWNjZXNzZnVsbHknLAogICAgICAgICAgICBSdWxlICAgICAgID0+ICd1bnN1Y2Nlc3NmdWxseScsCiAgICAgICAgICAgIFJlY2lwaWVudHMgPT4gWwogICAgICAgICAgICAgICAgJ0NoYW5nZUJ1aWxkZXInLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2FjaGUgZm9yIGxvb2t1cCByZXN1bHRzCiAgICBteSAlSGlzdG9yeVR5cGVzOwoKICAgICMgYWRkIG5vdGlmaWNhdGlvbnMKICAgIE5PVElGSUNBVElPTjoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uIChATm90aWZpY2F0aW9ucykgewoKICAgICAgICAjIGZpbmQgcmVjaXBpZW50cwogICAgICAgIG15IEBSZWNpcGllbnRJRHM7CiAgICAgICAgZm9yIG15ICRSZWNpcGllbnQgKCBAeyAkTm90aWZpY2F0aW9uLT57UmVjaXBpZW50c30gfSApIHsKICAgICAgICAgICAgbXkgJFJlY2lwaWVudElEID0gJFNlbGYtPntOb3RpZmljYXRpb25PYmplY3R9LT5SZWNpcGllbnRMb29rdXAoCiAgICAgICAgICAgICAgICBOYW1lID0+ICRSZWNpcGllbnQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFJlY2lwaWVudElEKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZWNpcGllbnRJRHMsICRSZWNpcGllbnRJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZXZlbnQgaWQKICAgICAgICBteSAkRXZlbnRJRCA9CiAgICAgICAgICAgICRIaXN0b3J5VHlwZXN7ICROb3RpZmljYXRpb24tPntFdmVudH0gfQogICAgICAgICAgICB8fCAkU2VsZi0+e0hpc3RvcnlPYmplY3R9LT5IaXN0b3J5VHlwZUxvb2t1cCggSGlzdG9yeVR5cGUgPT4gJE5vdGlmaWNhdGlvbi0+e0V2ZW50fSApOwoKICAgICAgICAjIGluc2VydCBub3RpZmljYXRpb24KICAgICAgICBteSAkUnVsZUlEID0gJFNlbGYtPntOb3RpZmljYXRpb25PYmplY3R9LT5Ob3RpZmljYXRpb25SdWxlQWRkKAogICAgICAgICAgICAleyROb3RpZmljYXRpb259LAogICAgICAgICAgICBFdmVudElEICAgICAgPT4gJEV2ZW50SUQsCiAgICAgICAgICAgIFJlY2lwaWVudElEcyA9PiBcQFJlY2lwaWVudElEcywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQWRkU3lzdGVtTm90aWZpY2F0aW9ucygpCgpBZGRzIHRoZSBDaGFuZ2U6OiBhbmQgV29ya09yZGVyOjogbm90aWZpY2F0aW9ucyB0byBzeXN0ZW1zIG5vdGlmaWNhdGlvbiB0YWJsZS4KVGhlcmUgaXMgbm8gY2hlY2sgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cy4Kc28gdXN1YWxseSBfRGVsZXRlU3lzdGVtTm90aWZpY2F0aW9ucyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KCiAgICBteSAkU3VjY2VzcyA9ICRQYWNrYWdlU2V0dXAtPl9BZGRTeXN0ZW1Ob3RpZmljYXRpb25zKCk7Cgo9Y3V0CgpzdWIgX0FkZFN5c3RlbU5vdGlmaWNhdGlvbnMgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICMgU2V0IHVwIHNvbWUgc3RhbmRhcmQgdGV4dHMgZm9yIEVuZ2xpc2ggYW5kIEdlcm1hbiwgQ2hhbmdlIGFuZCBXb3JrT3JkZXIsIGFnZW50IGFuZCBjdXN0b21lcgogICAgIyBUaGUgY3VzdG9tZXIgdGV4dHMgcHJvdmlkZSBubyBsaW5rLgoKICAgICMgQ2hhbmdlIGluZm8gZm9yIGFnZW50cyAoZW4pCiAgICBteSAkQ2hhbmdlSW5mb0FnZW50RW4gPSAiXG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiQ2hhbmdlIHRpdGxlOiA8T1RSU19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgLiAiQ3VycmVudCBjaGFuZ2Ugc3RhdGU6IDxPVFJTX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICI8T1RSU19DT05GSUdfSHR0cFR5cGU+Oi8vPE9UUlNfQ09ORklHX0ZRRE4+LzxPVFJTX0NPTkZJR19TY3JpcHRBbGlhcz5pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbSZDaGFuZ2VJRD08T1RSU19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiWW91ciBPVFJTIE5vdGlmaWNhdGlvbiBNYXN0ZXJcbiI7CgogICAgIyBDaGFuZ2UgaW5mbyBmb3IgQ3VzdG9tZXJzIChlbikKICAgIG15ICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiA9ICJcbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICJDaGFuZ2UgdGl0bGU6IDxPVFJTX0NIQU5HRV9DaGFuZ2VUaXRsZT5cbiIKICAgICAgICAuICJDdXJyZW50IGNoYW5nZSBzdGF0ZTogPE9UUlNfQ0hBTkdFX0NoYW5nZVN0YXRlPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIllvdXIgT1RSUyBOb3RpZmljYXRpb24gTWFzdGVyXG4iOwoKICAgICMgQ2hhbmdlIGluZm8gZm9yIGFnZW50cyAoZGUpCiAgICBteSAkQ2hhbmdlSW5mb0FnZW50RGUgPSAiXG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiQ2hhbmdlIFRpdGVsOiA8T1RSU19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgLiAiQWt0dWVsbGVyIENoYW5nZSBTdGF0dXM6IDxPVFJTX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICI8T1RSU19DT05GSUdfSHR0cFR5cGU+Oi8vPE9UUlNfQ09ORklHX0ZRRE4+LzxPVFJTX0NPTkZJR19TY3JpcHRBbGlhcz5pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbSZDaGFuZ2VJRD08T1RSU19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiSWhyIE9UUlMgTm90aWZpY2F0aW9uIE1hc3RlclxuIjsKCiAgICAjIENoYW5nZSBpbmZvIGZvciBDdXN0b21lcnMgKGRlKQogICAgbXkgJENoYW5nZUluZm9DdXN0b21lckRlID0gIlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIkNoYW5nZSBUaXRlbDogPE9UUlNfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgIC4gIkFrdHVlbGxlciBDaGFuZ2UgU3RhdHVzOiA8T1RSU19DSEFOR0VfQ2hhbmdlU3RhdGU+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiSWhyIE9UUlMgTm90aWZpY2F0aW9uIE1hc3RlclxuIjsKCiAgICAjIFdvcmtvcmRlciBpbmZvIGZvciBhZ2VudHMgKGVuKQogICAgbXkgJFdvcmtPcmRlckluZm9BZ2VudEVuID0gIlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIkNoYW5nZSB0aXRsZTogPE9UUlNfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgIC4gIkN1cnJlbnQgY2hhbmdlIHN0YXRlOiA8T1RSU19DSEFOR0VfQ2hhbmdlU3RhdGU+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiV29ya29yZGVyIHRpdGxlOiA8T1RSU19XT1JLT1JERVJfV29ya09yZGVyVGl0bGU+XG4iCiAgICAgICAgLiAiV29ya29yZGVyIHR5cGU6IDxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJUeXBlPlxuIgogICAgICAgIC4gIkN1cnJlbnQgd29ya29yZGVyIHN0YXRlOiA8T1RSU19XT1JLT1JERVJfV29ya09yZGVyU3RhdGU+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiPE9UUlNfQ09ORklHX0h0dHBUeXBlPjovLzxPVFJTX0NPTkZJR19GUUROPi88T1RSU19DT05GSUdfU2NyaXB0QWxpYXM+aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTVdvcmtPcmRlclpvb20mV29ya09yZGVySUQ9PE9UUlNfV09SS09SREVSX1dvcmtPcmRlcklEPlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIllvdXIgT1RSUyBOb3RpZmljYXRpb24gTWFzdGVyXG4iOwoKICAgICMgV29ya29yZGVyIGluZm8gZm9yIGN1c3RvbWVycyAoZW4pCiAgICBteSAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4gPSAiXG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiQ2hhbmdlIHRpdGxlOiA8T1RSU19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgLiAiQ3VycmVudCBjaGFuZ2Ugc3RhdGU6IDxPVFJTX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICJXb3Jrb3JkZXIgdGl0bGU6IDxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJUaXRsZT5cbiIKICAgICAgICAuICJXb3Jrb3JkZXIgdHlwZTogPE9UUlNfV09SS09SREVSX1dvcmtPcmRlclR5cGU+XG4iCiAgICAgICAgLiAiQ3VycmVudCB3b3Jrb3JkZXIgc3RhdGU6IDxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICJZb3VyIE9UUlMgTm90aWZpY2F0aW9uIE1hc3RlclxuIjsKCiAgICAjIFdvcmtvcmRlciBpbmZvIGZvciBhZ2VudHMgKGRlKQogICAgbXkgJFdvcmtPcmRlckluZm9BZ2VudERlID0gIlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIkNoYW5nZSBUaXRlbDogPE9UUlNfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgIC4gIkFrdHVlbGxlciBDaGFuZ2UgU3RhdHVzOiA8T1RSU19DSEFOR0VfQ2hhbmdlU3RhdGU+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiV29ya29yZGVyIFRpdGVsOiA8T1RSU19XT1JLT1JERVJfV29ya09yZGVyVGl0bGU+XG4iCiAgICAgICAgLiAiV29ya29yZGVyIFR5cDogPE9UUlNfV09SS09SREVSX1dvcmtPcmRlclR5cGU+XG4iCiAgICAgICAgLiAiQWt0dWVsbGVyIFdvcmtvcmRlciBTdGF0dXM6IDxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICI8T1RSU19DT05GSUdfSHR0cFR5cGU+Oi8vPE9UUlNfQ09ORklHX0ZRRE4+LzxPVFJTX0NPTkZJR19TY3JpcHRBbGlhcz5pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNV29ya09yZGVyWm9vbSZXb3JrT3JkZXJJRD08T1RSU19XT1JLT1JERVJfV29ya09yZGVySUQ+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiSWhyIE9UUlMgTm90aWZpY2F0aW9uIE1hc3RlclxuIjsKCiAgICAjIFdvcmtvcmRlciBpbmZvIGZvciBjdXN0b21lcnMgKGRlKQogICAgbXkgJFdvcmtPcmRlckluZm9DdXN0b21lckRlID0gIlxuIgogICAgICAgIC4gIlxuIgogICAgICAgIC4gIkNoYW5nZSBUaXRlbDogPE9UUlNfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgIC4gIkFrdHVlbGxlciBDaGFuZ2UgU3RhdHVzOiA8T1RSU19DSEFOR0VfQ2hhbmdlU3RhdGU+XG4iCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAiV29ya29yZGVyIFRpdGVsOiA8T1RSU19XT1JLT1JERVJfV29ya09yZGVyVGl0bGU+XG4iCiAgICAgICAgLiAiV29ya29yZGVyIFR5cDogPE9UUlNfV09SS09SREVSX1dvcmtPcmRlclR5cGU+XG4iCiAgICAgICAgLiAiQWt0dWVsbGVyIFdvcmtvcmRlciBTdGF0dXM6IDxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJTdGF0ZT5cbiIKICAgICAgICAuICJcbiIKICAgICAgICAuICJJaHIgT1RSUyBOb3RpZmljYXRpb24gTWFzdGVyXG4iOwoKICAgICMgZGVmaW5lIGFnZW50IG5vdGlmaWNhdGlvbnMKICAgIG15IEBBZ2VudE5vdGlmaWNhdGlvbnMgPSAoCgogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUFkZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIG5ldSBlcnN0ZWxsdCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBuZXUgZXJzdGVsbHQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VBZGQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBjcmVhdGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyBjcmVhdGVkLicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VVcGRhdGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUNBQlVwZGF0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIENBQiBha3R1YWxpc2llcnQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gbWl0IGFrdHVhbGlzaWVydGVtIENBQi4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUNBQlVwZGF0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIENBQiB1cGRhdGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdpdGggdXBkYXRlZCBDQUIuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OkNoYW5nZTo6Q2hhbmdlQ0FCRGVsZXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQ0FCIGdlbPZzY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IG1pdCBnZWz2c2NodGVtIENBQi4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUNBQkRlbGV0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIENBQiBkZWxldGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdpdGggZGVsZXRlZCBDQUIuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OkNoYW5nZTo6Q2hhbmdlTGlua0FkZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIDxPVFJTX0xJTktfT2JqZWN0PiB2ZXJrbvxwZnQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgbWl0IGVpbmVtIDxPVFJTX0xJTktfT2JqZWN0PiB2ZXJrbvxwZnQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VMaW5rQWRkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gPE9UUlNfTElOS19PYmplY3Q+IGxpbmtlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgbGlua2VkIHRvIGEgPE9UUlNfTElOS19PYmplY3Q+IC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VMaW5rRGVsZXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gPE9UUlNfTElOS19PYmplY3Q+IGVudGZlcm50JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGlzdCBtaXQgZWluZW0gPE9UUlNfTElOS19PYmplY3Q+IG5pY2h0IG1laHIgdmVya278cGZ0LicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OkNoYW5nZTo6Q2hhbmdlTGlua0RlbGV0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIDxPVFJTX0xJTktfT2JqZWN0PiByZW1vdmVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGlzIG5vIGxvbmdlciBsaW5rZWQgdG8gYSA8T1RSU19MSU5LX09iamVjdD4gLicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZURlbGV0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGdlbPZzY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGdlbPZzY2h0LicsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VEZWxldGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBkZWxldGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyBkZWxldGVkLicsCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyQWRkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gbmV1IGVyc3RlbGx0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIG5ldSBlcnN0ZWxsdC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlckFkZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGNyZWF0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd2FzIGNyZWF0ZWQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyVXBkYXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlclVwZGF0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyRGVsZXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gZ2Vs9nNjaHQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd3VyZGUgZ2Vs9nNjaHQuJywKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlckRlbGV0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGRlbGV0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd2FzIGRlbGV0ZWQuJywKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6V29ya09yZGVyOjpXb3JrT3JkZXJMaW5rQWRkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gPE9UUlNfTElOS19PYmplY3Q+IHZlcmtu/HBmdCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3dXJkZSBtaXQgZWluZW0gPE9UUlNfTElOS19PYmplY3Q+IHZlcmtu/HBmdC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlckxpbmtBZGQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSA8T1RSU19MSU5LX09iamVjdD4gbGlua2VkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHdhcyBsaW5rZWQgdG8gYSA8T1RSU19MSU5LX09iamVjdD4uJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyTGlua0RlbGV0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIDxPVFJTX0xJTktfT2JqZWN0PiBlbnRmZXJudCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBpc3QgbWl0IGVpbmVtIDxPVFJTX0xJTktfT2JqZWN0PiBuaWNodCBtZWhyIHZlcmtu/HBmdC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlckxpbmtEZWxldGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSA8T1RSU19MSU5LX09iamVjdD4gcmVtb3ZlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBpcyBubyBsb25nZXIgbGlua2VkIHRvIGEgPE9UUlNfTElOS19PYmplY3Q+LicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudEVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUF0dGFjaG1lbnRBZGQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBuZXVlciBBbmhhbmcnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGF0IGVpbmVuIG5ldWVuIEFuaGFuZy4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUF0dGFjaG1lbnRBZGQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBuZXcgYXR0YWNobWVudCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXMgYSBuZXcgYXR0YWNobWVudC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VBdHRhY2htZW50RGVsZXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQW5oYW5nIGdlbPZzY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IG1pdCBnZWz2c2NodGVtIEFuaGFuZy4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUF0dGFjaG1lbnREZWxldGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBhdHRhY2htZW50IGRlbGV0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2l0aCBkZWxldGVkIGF0dGFjaG1lbnQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyQXR0YWNobWVudEFkZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIG5ldWVyIEFuaGFuZycsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBoYXQgZWluZW4gbmV1ZW4gQW5oYW5nLicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudERlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyQXR0YWNobWVudEFkZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIG5ldyBhdHRhY2htZW50JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IGhhcyBhIG5ldyBhdHRhY2htZW50LicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudEVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBBbmhhbmcgZ2Vs9nNjaHQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gbWl0IGdlbPZzY2h0ZW0gQW5oYW5nLicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudERlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyQXR0YWNobWVudERlbGV0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGF0dGFjaG1lbnQgZGVsZXRlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3aXRoIGRlbGV0ZWQgYXR0YWNobWVudC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZVBsYW5uZWRTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gUGxhbm5lZCBTdGFydCBUaW1lIHJlYWNoZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGFzIHJlYWNoZWQgaXRzIFBsYW5uZWQgU3RhcnQgVGltZS4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VQbGFubmVkRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBnZXBsYW50ZSBFbmR6ZWl0IGVycmVpY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhdCBkaWUgZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZVBsYW5uZWRFbmRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIFBsYW5uZWQgRW5kIFRpbWUgcmVhY2hlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXMgcmVhY2hlZCBpdHMgUGxhbm5lZCBFbmQgVGltZS4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYmVnb25uZW4nLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYmVnb25uZW4uJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0FnZW50RGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VBY3R1YWxTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gc3RhcnRlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXMgc3RhcnRlZC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGFiZ2VzY2hsb3NzZW4nLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd3VyZGUgYWJnZXNjaGxvc3Nlbi4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZUFjdHVhbEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gZmluaXNoZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIGZpbmlzaGVkLicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudEVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkNoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gR2V3/G5zY2h0ZSBGZXJ0aWdzdGVsbHVuZ3N6ZWl0IGVycmVpY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhdCBkaWUgZ2V3/G5zY2h0ZSBGZXJ0aWdzdGVsbHVuZ3N6ZWl0IGVycmVpY2h0LicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9BZ2VudERlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OkNoYW5nZTo6Q2hhbmdlUmVxdWVzdGVkVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSByZXF1ZXN0ZWQgdGltZSByZWFjaGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhcyByZWFjaGVkIGl0cyByZXF1ZXN0ZWQgdGltZS4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6Q2hhbmdlOjpBY3Rpb25FeGVjdXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQWt0aW9ucy1BdXNm/GhydW5nIDxPVFJTX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IEFrdGlvbnMtQXVzZvxocnVuZyA8T1RSU19DT05ESVRJT05fQWN0aW9uUmVzdWx0Pi4nCiAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiQ2hhbmdlIFRpdGVsOiA8T1RSU19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgICAgICAgICAuICJBa3R1ZWxsZXIgQ2hhbmdlIFN0YXR1czogPE9UUlNfQ0hBTkdFX0NoYW5nZVN0YXRlPlxuIgogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICJDb25kaXRpb24gSUQ6IDxPVFJTX0NPTkRJVElPTl9Db25kaXRpb25JRD5cbiIKICAgICAgICAgICAgICAgIC4gIkNvbmRpdGlvbiBOYW1lOiA8T1RSU19DT05ESVRJT05fQ29uZGl0aW9uTmFtZT5cbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiQWN0aW9uIElEOiA8T1RSU19DT05ESVRJT05fQWN0aW9uSUQ+XG4iCiAgICAgICAgICAgICAgICAuICJBa3Rpb25zLUF1c2b8aHJ1bmc6IDxPVFJTX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+XG4iCiAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgIC4gIjxPVFJTX0NPTkZJR19IdHRwVHlwZT46Ly88T1RSU19DT05GSUdfRlFETj4vPE9UUlNfQ09ORklHX1NjcmlwdEFsaWFzPmluZGV4LnBsP0FjdGlvbj1BZ2VudElUU01DaGFuZ2Vab29tJkNoYW5nZUlEPTxPVFJTX0NIQU5HRV9DaGFuZ2VJRD5cbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiSWhyIE9UUlMgTm90aWZpY2F0aW9uIE1hc3RlclxuIiwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkFjdGlvbkV4ZWN1dGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBBY3Rpb24gZXhlY3V0aW9uIDxPVFJTX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IEFjdGlvbiBleGVjdXRpb24gPE9UUlNfQ09ORElUSU9OX0FjdGlvblJlc3VsdD4uJwogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgIC4gIkNoYW5nZSB0aXRsZTogPE9UUlNfQ0hBTkdFX0NoYW5nZVRpdGxlPlxuIgogICAgICAgICAgICAgICAgLiAiQ3VycmVudCBjaGFuZ2Ugc3RhdGU6IDxPVFJTX0NIQU5HRV9DaGFuZ2VTdGF0ZT5cbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIElEOiA8T1RSU19DT05ESVRJT05fQ29uZGl0aW9uSUQ+XG4iCiAgICAgICAgICAgICAgICAuICJDb25kaXRpb24gbmFtZTogPE9UUlNfQ09ORElUSU9OX0NvbmRpdGlvbk5hbWU+XG4iCiAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgIC4gIkFjdGlvbiBJRDogPE9UUlNfQ09ORElUSU9OX0FjdGlvbklEPlxuIgogICAgICAgICAgICAgICAgLiAiQWN0aW9uIGV4ZWN1dGlvbjogPE9UUlNfQ09ORElUSU9OX0FjdGlvblJlc3VsdD5cbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiPE9UUlNfQ09ORklHX0h0dHBUeXBlPjovLzxPVFJTX0NPTkZJR19GUUROPi88T1RSU19DT05GSUdfU2NyaXB0QWxpYXM+aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb20mQ2hhbmdlSUQ9PE9UUlNfQ0hBTkdFX0NoYW5nZUlEPlxuIgogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICJZb3VyIE9UUlMgTm90aWZpY2F0aW9uIE1hc3RlclxuIiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6V29ya09yZGVyOjpXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIFN0YXJ0emVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlclBsYW5uZWRTdGFydFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gUGxhbm5lZCBTdGFydCBUaW1lIHJlYWNoZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHJlYWNoZWQgdGhlIFBsYW5uZWQgU3RhcnQgVGltZS4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6V29ya09yZGVyOjpXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBnZXBsYW50ZSBFbmR6ZWl0IGVycmVpY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IGhhdCBkaWUgZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnREZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpXb3JrT3JkZXI6OldvcmtPcmRlclBsYW5uZWRFbmRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIFBsYW5uZWQgRW5kIFRpbWUgcmVhY2hlZC4nLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHJlYWNoZWQgdGhlIFBsYW5uZWQgRW5kIFRpbWUuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGJlZ29ubmVuJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGJlZ29ubmVuLicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9BZ2VudERlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIHN0YXJ0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHN0YXJ0ZWQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OldvcmtPcmRlcjo6V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBhYmdlc2NobG9zc2VuJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGFiZ2VzY2hsb3NzZW4uJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0FnZW50RGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdBZ2VudDo6V29ya09yZGVyOjpXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGZpbmlzaGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHdhcyBmaW5pc2hlZC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQWdlbnRFbiwKICAgICAgICBdLAoKICAgICk7CgogICAgIyBkZWZpbmUgY3VzdG9tZXIgbm90aWZpY2F0aW9ucwogICAgbXkgQEN1c3RvbWVyTm90aWZpY2F0aW9ucyA9ICgKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQWRkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gbmV1IGVyc3RlbGx0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIG5ldSBlcnN0ZWxsdC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpDaGFuZ2U6OkNoYW5nZUFkZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGNyZWF0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIGNyZWF0ZWQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlVXBkYXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYWt0dWFsaXNpZXJ0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpDaGFuZ2U6OkNoYW5nZVVwZGF0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHVwZGF0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIHVwZGF0ZWQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQ0FCVXBkYXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQ0FCIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBtaXQgYWt0dWFsaXNpZXJ0ZW0gQ0FCLicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQ0FCVXBkYXRlJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQ0FCIHVwZGF0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2l0aCB1cGRhdGVkIENBQi4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VDQUJEZWxldGUnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBDQUIgZ2Vs9nNjaHQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gbWl0IGdlbPZzY2h0ZW0gQ0FCLicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQ0FCRGVsZXRlJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gQ0FCIGRlbGV0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2l0aCBkZWxldGVkIENBQi4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VMaW5rQWRkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gPE9UUlNfTElOS19PYmplY3Q+IHZlcmtu/GZ0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIG1pdCBlaW5lbSA8T1RSU19MSU5LX09iamVjdD4gdmVya278cGZ0LicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlTGlua0FkZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIDxPVFJTX0xJTktfT2JqZWN0PiBsaW5rZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gd2FzIGxpbmtlZCB0byBhIDxPVFJTX0xJTktfT2JqZWN0PiAuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlTGlua0RlbGV0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIDxPVFJTX0xJTktfT2JqZWN0PiBlbnRmZXJudCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBpc3QgbWl0IGVpbmVtIDxPVFJTX0xJTktfT2JqZWN0PiBuaWNodCBtZWhyIHZlcmtu/HBmdC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpDaGFuZ2U6OkNoYW5nZUxpbmtEZWxldGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSA8T1RSU19MSU5LX09iamVjdD4gcmVtb3ZlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBpcyBubyBsb25nZXIgbGlua2VkIHRvIGEgPE9UUlNfTElOS19PYmplY3Q+IC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VEZWxldGUnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBnZWz2c2NodCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3dXJkZSBnZWz2c2NodC4nLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlRGVsZXRlJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gZGVsZXRlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiB3YXMgZGVsZXRlZC4nLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OldvcmtPcmRlckFkZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIG5ldSBlcnN0ZWxsdCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3dXJkZSBuZXUgZXJzdGVsbHQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJBZGQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBjcmVhdGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHdhcyBjcmVhdGVkLicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9DdXN0b21lckVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OldvcmtPcmRlclVwZGF0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGFrdHVhbGlzaWVydCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3dXJkZSBha3R1YWxpc2llcnQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJVcGRhdGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSB1cGRhdGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHdhcyB1cGRhdGVkLicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9DdXN0b21lckVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OldvcmtPcmRlckRlbGV0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGdlbPZzY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGdlbPZzY2h0LicsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJEZWxldGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBkZWxldGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHdhcyBkZWxldGVkLicsCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OldvcmtPcmRlcjo6V29ya09yZGVyTGlua0FkZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIDxPVFJTX0xJTktfT2JqZWN0PiB2ZXJrbvxwZnQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd3VyZGUgbWl0IGVpbmVtIDxPVFJTX0xJTktfT2JqZWN0PiB2ZXJrbvxwZnQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJMaW5rQWRkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gPE9UUlNfTElOS19PYmplY3Q+IGxpbmtlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiB3YXMgbGlua2VkIHRvIGEgPE9UUlNfTElOS19PYmplY3Q+LicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9DdXN0b21lckVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OldvcmtPcmRlckxpbmtEZWxldGUnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSA8T1RSU19MSU5LX09iamVjdD4gZW50ZmVybnQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaXN0IG1pdCBlaW5lbSA8T1RSU19MSU5LX09iamVjdD4gbmljaHQgbWVociB2ZXJrbvxwZnQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJMaW5rRGVsZXRlJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gPE9UUlNfTElOS19PYmplY3Q+IHJlbW92ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaXMgbm8gbG9uZ2VyIGxpbmtlZCB0byBhIDxPVFJTX0xJTktfT2JqZWN0Pi4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VBdHRhY2htZW50QWRkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gbmV1ZXIgQW5oYW5nJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhdCBlaW5lbiBuZXVlbiBBbmhhbmcuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VBdHRhY2htZW50QWRkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gbmV3IGF0dGFjaG1lbnQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGFzIGEgbmV3IGF0dGFjaG1lbnQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQXR0YWNobWVudERlbGV0ZScsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIEFuaGFuZyBnZWz2c2NodCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBtaXQgZ2Vs9nNjaHRlbSBBbmhhbmcuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VBdHRhY2htZW50RGVsZXRlJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gYXR0YWNobWVudCBkZWxldGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdpdGggZGVsZXRlZCBhdHRhY2htZW50LicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckVuLAogICAgICAgIF0sCgogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OldvcmtPcmRlckF0dGFjaG1lbnRBZGQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBuZXVlciBBbmhhbmcnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGF0IGVpbmVuIG5ldWVuIEFuaGFuZy4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJEZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OldvcmtPcmRlckF0dGFjaG1lbnRBZGQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBuZXcgYXR0YWNobWVudCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBoYXMgYSBuZXcgYXR0YWNobWVudC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJBdHRhY2htZW50RGVsZXRlJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gQW5oYW5nIGdlbPZzY2h0JywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IG1pdCBnZWz2c2NodGVtIEFuaGFuZy4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJEZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpXb3JrT3JkZXI6OldvcmtPcmRlckF0dGFjaG1lbnREZWxldGUnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBhdHRhY2htZW50IGRlbGV0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gd2l0aCBkZWxldGVkIGF0dGFjaG1lbnQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGF0IGRpZSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VQbGFubmVkU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIFBsYW5uZWQgU3RhcnQgVGltZSByZWFjaGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IGhhcyByZWFjaGVkIGl0cyBQbGFubmVkIFN0YXJ0IFRpbWUuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlUGxhbm5lZEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIEVuZHplaXQgZXJyZWljaHQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VQbGFubmVkRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBQbGFubmVkIEVuZCBUaW1lIHJlYWNoZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGFzIHJlYWNoZWQgaXRzIFBsYW5uZWQgRW5kIFRpbWUuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGJlZ29ubmVuJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGJlZ29ubmVuLicKICAgICAgICAgICAgICAgIC4gJENoYW5nZUluZm9DdXN0b21lckRlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIHN0YXJ0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gaGFzIHN0YXJ0ZWQuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OkNoYW5nZTo6Q2hhbmdlQWN0dWFsRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBhYmdlc2NobG9zc2VuJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHd1cmRlIGFiZ2VzY2hsb3NzZW4uJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VBY3R1YWxFbmRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIGZpbmlzaGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+IHdhcyBmaW5pc2hlZC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJFbiwKICAgICAgICBdLAoKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6Q2hhbmdlOjpDaGFuZ2VSZXF1ZXN0ZWRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIEdld/xuc2NodGUgRmVydGlnc3RlbGx1bmdzemVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXQgZGllIGdld/xuc2NodGUgRmVydGlnc3RlbGx1bmdzemVpdCBlcnJlaWNodC4nCiAgICAgICAgICAgICAgICAuICRDaGFuZ2VJbmZvQ3VzdG9tZXJEZSwKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICAgJ0N1c3RvbWVyOjpDaGFuZ2U6OkNoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2VuJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPl0gcmVxdWVzdGVkIHRpbWUgcmVhY2hlZCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTUNoYW5nZTo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPiBoYXMgcmVhY2hlZCBpdHMgcmVxdWVzdGVkIHRpbWUuJwogICAgICAgICAgICAgICAgLiAkQ2hhbmdlSW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OldvcmtPcmRlcjo6V29ya09yZGVyUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGF0IGRpZSBnZXBsYW50ZSBTdGFydHplaXQgZXJyZWljaHQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIFBsYW5uZWQgU3RhcnQgVGltZSByZWFjaGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IGhhcyByZWFjaGVkIHRoZSBQbGFubmVkIFN0YXJ0IFRpbWUuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OldvcmtPcmRlcjo6V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkJywKICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgJ1s8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPl0gZ2VwbGFudGUgRW5kemVpdCBlcnJlaWNodCcsCiAgICAgICAgICAgICc8T1RSU19DT05GSUdfSVRTTVdvcmtPcmRlcjo6SG9vaz48T1RSU19DSEFOR0VfQ2hhbmdlTnVtYmVyPi08T1RSU19XT1JLT1JERVJfV29ya09yZGVyTnVtYmVyPiBoYXQgZGllIGdlcGxhbnRlIEVuZHplaXQgZXJyZWljaHQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJQbGFubmVkRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBQbGFubmVkIEVuZCBUaW1lIHJlYWNoZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHJlYWNoZWQgdGhlIFBsYW5uZWQgRW5kIFRpbWUuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OldvcmtPcmRlcjo6V29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdkZScsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGJlZ29ubmVuJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGJlZ29ubmVuLicKICAgICAgICAgICAgICAgIC4gJFdvcmtPcmRlckluZm9DdXN0b21lckRlLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OldvcmtPcmRlcjo6V29ya09yZGVyQWN0dWFsU3RhcnRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIHN0YXJ0ZWQnLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj4gaGFzIHN0YXJ0ZWQuJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRW4sCiAgICAgICAgXSwKCiAgICAgICAgWwogICAgICAgICAgICAnQ3VzdG9tZXI6OldvcmtPcmRlcjo6V29ya09yZGVyQWN0dWFsRW5kVGltZVJlYWNoZWQnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+XSBhYmdlc2NobG9zc2VuJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHd1cmRlIGFiZ2VzY2hsb3NzZW4uJwogICAgICAgICAgICAgICAgLiAkV29ya09yZGVySW5mb0N1c3RvbWVyRGUsCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAgICdDdXN0b21lcjo6V29ya09yZGVyOjpXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZCcsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01Xb3JrT3JkZXI6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4tPE9UUlNfV09SS09SREVSX1dvcmtPcmRlck51bWJlcj5dIGZpbmlzaGVkJywKICAgICAgICAgICAgJzxPVFJTX0NPTkZJR19JVFNNV29ya09yZGVyOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+LTxPVFJTX1dPUktPUkRFUl9Xb3JrT3JkZXJOdW1iZXI+IHdhcyBmaW5pc2hlZC4nCiAgICAgICAgICAgICAgICAuICRXb3JrT3JkZXJJbmZvQ3VzdG9tZXJFbiwKICAgICAgICBdLAoKICAgICk7CgogICAgIyBXaGVuIFVURi04IGlzIGVuYWJsZWQsIHRoZSBub3RpZmljYXRpb24gdGV4dHMgYXJlIHN0b3JlZCBhcyBVVEYtOAogICAgbXkgJEVuY29kZUludGVybmFsVXNlZCA9ICRTZWxmLT57RW5jb2RlT2JqZWN0fS0+RW5jb2RlSW50ZXJuYWxVc2VkKCk7CiAgICBteSAkTm90aWZpY2F0aW9uQ2hhcnNldCA9ICRFbmNvZGVJbnRlcm5hbFVzZWQgPyAndXRmLTgnIDogJ2lzby04ODU5LTEnOwoKICAgICMgaW5zZXJ0IHRoZSBlbnRyaWVzCiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbiAoIEBBZ2VudE5vdGlmaWNhdGlvbnMsIEBDdXN0b21lck5vdGlmaWNhdGlvbnMgKSB7CiAgICAgICAgbXkgQEJpbmRzOwoKICAgICAgICBmb3IgbXkgJFZhbHVlICggQHskTm90aWZpY2F0aW9ufSApIHsKCiAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHN0cmluZ3MgYXJlIHV0Zi04IGlmIHRoZSBzeXN0ZW0gaXMgaW4gdXRmLTgsCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIGxlYXZlIGl0IGluIGxhdGluLTEKICAgICAgICAgICAgaWYgKCRFbmNvZGVJbnRlcm5hbFVzZWQpIHsKICAgICAgICAgICAgICAgIHV0Zjg6OnVwZ3JhZGUoJFZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBCaW5kIHJlcXVpcmVzIHNjYWxhciByZWZlcmVuY2VzCiAgICAgICAgICAgIHB1c2ggQEJpbmRzLCBcJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgIyBkbyB0aGUgaW5zZXJ0aW9uCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIG5vdGlmaWNhdGlvbnMgKG5vdGlmaWNhdGlvbl90eXBlLCBub3RpZmljYXRpb25fbGFuZ3VhZ2UsICcKICAgICAgICAgICAgICAgIC4gJ3N1YmplY3QsIHRleHQsIG5vdGlmaWNhdGlvbl9jaGFyc2V0LCBjb250ZW50X3R5cGUsICcKICAgICAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpICcKICAgICAgICAgICAgICAgIC4gJ1ZBTFVFUyggPywgPywgPywgPywgPywgXCd0ZXh0L3BsYWluXCcsICcKICAgICAgICAgICAgICAgIC4gJ2N1cnJlbnRfdGltZXN0YW1wLCAxLCBjdXJyZW50X3RpbWVzdGFtcCwgMSApJywKICAgICAgICAgICAgQmluZCA9PiBbIEBCaW5kcywgXCROb3RpZmljYXRpb25DaGFyc2V0IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0FkZFN5c3RlbU5vdGlmaWNhdGlvbnNOZXdJbl8yXzBfMygpCgpBZGRzIHRoZSBuZXcgbm90aWZpY2F0aW9ucyB0byBzeXN0ZW1zIG5vdGlmaWNhdGlvbiB0YWJsZSB0aGF0IHdlcmUgYWRkZWQgaW4gdmVyc2lvbiAyLjAuMy4KCiAgICBteSAkU3VjY2VzcyA9ICRQYWNrYWdlU2V0dXAtPl9BZGRTeXN0ZW1Ob3RpZmljYXRpb25zTmV3SW5fMl8wXzMoKTsKCj1jdXQKCnN1YiBfQWRkU3lzdGVtTm90aWZpY2F0aW9uc05ld0luXzJfMF8zIHsKICAgIG15ICgkU2VsZikgPSBAXzsKCiAgICAjIGRlZmluZSBhZ2VudCBub3RpZmljYXRpb25zCiAgICBteSBAQWdlbnROb3RpZmljYXRpb25zID0gKAogICAgICAgIFsKICAgICAgICAgICAgJ0FnZW50OjpDaGFuZ2U6OkFjdGlvbkV4ZWN1dGUnLAogICAgICAgICAgICAnZGUnLAogICAgICAgICAgICAnWzxPVFJTX0NPTkZJR19JVFNNQ2hhbmdlOjpIb29rPjxPVFJTX0NIQU5HRV9DaGFuZ2VOdW1iZXI+XSBBa3Rpb25zLUF1c2b8aHJ1bmcgPE9UUlNfQ09ORElUSU9OX0FjdGlvblJlc3VsdD4nLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gQWt0aW9ucy1BdXNm/GhydW5nIDxPVFJTX0NPTkRJVElPTl9BY3Rpb25SZXN1bHQ+LicKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICJDaGFuZ2UgVGl0ZWw6IDxPVFJTX0NIQU5HRV9DaGFuZ2VUaXRsZT5cbiIKICAgICAgICAgICAgICAgIC4gIkFrdHVlbGxlciBDaGFuZ2UgU3RhdHVzOiA8T1RSU19DSEFOR0VfQ2hhbmdlU3RhdGU+XG4iCiAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgIC4gIkNvbmRpdGlvbiBJRDogPE9UUlNfQ09ORElUSU9OX0NvbmRpdGlvbklEPlxuIgogICAgICAgICAgICAgICAgLiAiQ29uZGl0aW9uIE5hbWU6IDxPVFJTX0NPTkRJVElPTl9Db25kaXRpb25OYW1lPlxuIgogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICJBY3Rpb24gSUQ6IDxPVFJTX0NPTkRJVElPTl9BY3Rpb25JRD5cbiIKICAgICAgICAgICAgICAgIC4gIkFrdGlvbnMtQXVzZvxocnVuZzogPE9UUlNfQ09ORElUSU9OX0FjdGlvblJlc3VsdD5cbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiPE9UUlNfQ09ORklHX0h0dHBUeXBlPjovLzxPVFJTX0NPTkZJR19GUUROPi88T1RSU19DT05GSUdfU2NyaXB0QWxpYXM+aW5kZXgucGw/QWN0aW9uPUFnZW50SVRTTUNoYW5nZVpvb20mQ2hhbmdlSUQ9PE9UUlNfQ0hBTkdFX0NoYW5nZUlEPlxuIgogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICJJaHIgT1RSUyBOb3RpZmljYXRpb24gTWFzdGVyXG4iLAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgICAnQWdlbnQ6OkNoYW5nZTo6QWN0aW9uRXhlY3V0ZScsCiAgICAgICAgICAgICdlbicsCiAgICAgICAgICAgICdbPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj5dIEFjdGlvbiBleGVjdXRpb24gPE9UUlNfQ09ORElUSU9OX0FjdGlvblJlc3VsdD4nLAogICAgICAgICAgICAnPE9UUlNfQ09ORklHX0lUU01DaGFuZ2U6Okhvb2s+PE9UUlNfQ0hBTkdFX0NoYW5nZU51bWJlcj4gQWN0aW9uIGV4ZWN1dGlvbiA8T1RSU19DT05ESVRJT05fQWN0aW9uUmVzdWx0Pi4nCiAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiQ2hhbmdlIHRpdGxlOiA8T1RSU19DSEFOR0VfQ2hhbmdlVGl0bGU+XG4iCiAgICAgICAgICAgICAgICAuICJDdXJyZW50IGNoYW5nZSBzdGF0ZTogPE9UUlNfQ0hBTkdFX0NoYW5nZVN0YXRlPlxuIgogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICJDb25kaXRpb24gSUQ6IDxPVFJTX0NPTkRJVElPTl9Db25kaXRpb25JRD5cbiIKICAgICAgICAgICAgICAgIC4gIkNvbmRpdGlvbiBuYW1lOiA8T1RSU19DT05ESVRJT05fQ29uZGl0aW9uTmFtZT5cbiIKICAgICAgICAgICAgICAgIC4gIlxuIgogICAgICAgICAgICAgICAgLiAiQWN0aW9uIElEOiA8T1RSU19DT05ESVRJT05fQWN0aW9uSUQ+XG4iCiAgICAgICAgICAgICAgICAuICJBY3Rpb24gZXhlY3V0aW9uOiA8T1RSU19DT05ESVRJT05fQWN0aW9uUmVzdWx0PlxuIgogICAgICAgICAgICAgICAgLiAiXG4iCiAgICAgICAgICAgICAgICAuICI8T1RSU19DT05GSUdfSHR0cFR5cGU+Oi8vPE9UUlNfQ09ORklHX0ZRRE4+LzxPVFJTX0NPTkZJR19TY3JpcHRBbGlhcz5pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ2hhbmdlWm9vbSZDaGFuZ2VJRD08T1RSU19DSEFOR0VfQ2hhbmdlSUQ+XG4iCiAgICAgICAgICAgICAgICAuICJcbiIKICAgICAgICAgICAgICAgIC4gIllvdXIgT1RSUyBOb3RpZmljYXRpb24gTWFzdGVyXG4iLAogICAgICAgIF0sCiAgICApOwoKICAgICMgV2hlbiBVVEYtOCBpcyBlbmFibGVkLCB0aGUgbm90aWZpY2F0aW9uIHRleHRzIGFyZSBzdG9yZWQgYXMgVVRGLTgKICAgIG15ICRFbmNvZGVJbnRlcm5hbFVzZWQgPSAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZUludGVybmFsVXNlZCgpOwogICAgbXkgJE5vdGlmaWNhdGlvbkNoYXJzZXQgPSAkRW5jb2RlSW50ZXJuYWxVc2VkID8gJ3V0Zi04JyA6ICdpc28tODg1OS0xJzsKCiAgICAjIGluc2VydCB0aGUgZW50cmllcwogICAgZm9yIG15ICROb3RpZmljYXRpb24gKEBBZ2VudE5vdGlmaWNhdGlvbnMpIHsKICAgICAgICBteSBAQmluZHM7CgogICAgICAgIGZvciBteSAkVmFsdWUgKCBAeyROb3RpZmljYXRpb259ICkgewoKICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgc3RyaW5ncyBhcmUgdXRmLTggaWYgdGhlIHN5c3RlbSBpcyBpbiB1dGYtOCwKICAgICAgICAgICAgIyBvdGhlcndpc2UgbGVhdmUgaXQgaW4gbGF0aW4tMQogICAgICAgICAgICBpZiAoJEVuY29kZUludGVybmFsVXNlZCkgewogICAgICAgICAgICAgICAgdXRmODo6dXBncmFkZSgkVmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEJpbmQgcmVxdWlyZXMgc2NhbGFyIHJlZmVyZW5jZXMKICAgICAgICAgICAgcHVzaCBAQmluZHMsIFwkVmFsdWU7CiAgICAgICAgfQoKICAgICAgICAjIGRvIHRoZSBpbnNlcnRpb24KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gbm90aWZpY2F0aW9ucyAobm90aWZpY2F0aW9uX3R5cGUsIG5vdGlmaWNhdGlvbl9sYW5ndWFnZSwgJwogICAgICAgICAgICAgICAgLiAnc3ViamVjdCwgdGV4dCwgbm90aWZpY2F0aW9uX2NoYXJzZXQsIGNvbnRlbnRfdHlwZSwgJwogICAgICAgICAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwogICAgICAgICAgICAgICAgLiAnVkFMVUVTKCA/LCA/LCA/LCA/LCA/LCBcJ3RleHQvcGxhaW5cJywgJwogICAgICAgICAgICAgICAgLiAnY3VycmVudF90aW1lc3RhbXAsIDEsIGN1cnJlbnRfdGltZXN0YW1wLCAxICknLAogICAgICAgICAgICBCaW5kID0+IFsgQEJpbmRzLCBcJE5vdGlmaWNhdGlvbkNoYXJzZXQgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfRGVsZXRlVGVtcGxhdGVzKCkKCmRlbGV0ZXMgYWxsIHRlbXBsYXRlcwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0RlbGV0ZVRlbXBsYXRlcygpOwoKPWN1dAoKc3ViIF9EZWxldGVUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhbGwgdGVtcGxhdGVzLCBhbHNvIGludmFsaWQgb25lcwogICAgbXkgJFRlbXBsYXRlcyA9ICRTZWxmLT57VGVtcGxhdGVPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCB0ZW1wbGF0ZXMKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIGtleXMgJXskVGVtcGxhdGVzfSApIHsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RlbXBsYXRlT2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwoKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0RlbGV0ZVN5c3RlbU5vdGlmaWNhdGlvbnMoKQoKRGVsZXRlcyB0aGUgQ2hhbmdlOjogYW5kIFdvcmtPcmRlcjo6IG5vdGlmaWNhdGlvbnMgZnJvbSBzeXN0ZW1zIG5vdGlmaWNhdGlvbiB0YWJsZS4KCiAgICBteSAkU3VjY2VzcyA9ICRQYWNrYWdlU2V0dXAtPl9EZWxldGVTeXN0ZW1Ob3RpZmljYXRpb25zKCk7Cgo9Y3V0CgpzdWIgX0RlbGV0ZVN5c3RlbU5vdGlmaWNhdGlvbnMgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICMgZGVmaW5lIHRoZSBub3RpZmljYXRpb24gdHlwZXMgdG8gYmUgZGVsZXRlZAogICAgbXkgQE5vdGlmaWNhdGlvblR5cGVzID0gcXcoCiAgICAgICAgQ2hhbmdlOjpDaGFuZ2VBZGQKICAgICAgICBDaGFuZ2U6OkNoYW5nZVVwZGF0ZQogICAgICAgIENoYW5nZTo6Q2hhbmdlQ0FCVXBkYXRlCiAgICAgICAgQ2hhbmdlOjpDaGFuZ2VDQUJEZWxldGUKICAgICAgICBDaGFuZ2U6OkNoYW5nZUxpbmtBZGQKICAgICAgICBDaGFuZ2U6OkNoYW5nZUxpbmtEZWxldGUKICAgICAgICBDaGFuZ2U6OkNoYW5nZUF0dGFjaG1lbnRBZGQKICAgICAgICBDaGFuZ2U6OkNoYW5nZUF0dGFjaG1lbnREZWxldGUKICAgICAgICBDaGFuZ2U6OkNoYW5nZURlbGV0ZQogICAgICAgIENoYW5nZTo6Q2hhbmdlUGxhbm5lZFN0YXJ0VGltZVJlYWNoZWQKICAgICAgICBDaGFuZ2U6OkNoYW5nZVBsYW5uZWRFbmRUaW1lUmVhY2hlZAogICAgICAgIENoYW5nZTo6Q2hhbmdlQWN0dWFsU3RhcnRUaW1lUmVhY2hlZAogICAgICAgIENoYW5nZTo6Q2hhbmdlQWN0dWFsRW5kVGltZVJlYWNoZWQKICAgICAgICBDaGFuZ2U6OkNoYW5nZVJlcXVlc3RlZFRpbWVSZWFjaGVkCiAgICAgICAgQ2hhbmdlOjpBY3Rpb25FeGVjdXRlCiAgICAgICAgV29ya09yZGVyOjpXb3JrT3JkZXJBZGQKICAgICAgICBXb3JrT3JkZXI6OldvcmtPcmRlclVwZGF0ZQogICAgICAgIFdvcmtPcmRlcjo6V29ya09yZGVyTGlua0FkZAogICAgICAgIFdvcmtPcmRlcjo6V29ya09yZGVyTGlua0RlbGV0ZQogICAgICAgIFdvcmtPcmRlcjo6V29ya09yZGVyQXR0YWNobWVudEFkZAogICAgICAgIFdvcmtPcmRlcjo6V29ya09yZGVyQXR0YWNobWVudERlbGV0ZQogICAgICAgIFdvcmtPcmRlcjo6V29ya09yZGVyRGVsZXRlCiAgICAgICAgV29ya09yZGVyOjpXb3JrT3JkZXJQbGFubmVkU3RhcnRUaW1lUmVhY2hlZAogICAgICAgIFdvcmtPcmRlcjo6V29ya09yZGVyUGxhbm5lZEVuZFRpbWVSZWFjaGVkCiAgICAgICAgV29ya09yZGVyOjpXb3JrT3JkZXJBY3R1YWxTdGFydFRpbWVSZWFjaGVkCiAgICAgICAgV29ya09yZGVyOjpXb3JrT3JkZXJBY3R1YWxFbmRUaW1lUmVhY2hlZAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgZW50cmllcwogICAgZm9yIG15ICRUeXBlIChATm90aWZpY2F0aW9uVHlwZXMpIHsKCiAgICAgICAgIyB0aGVyZSBhcmUgbm90aWZpY2F0aW9uIGZvciBhZ2VudHMgYW5kIGN1c3RvbWVycwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICdERUxFVEUgRlJPTSBub3RpZmljYXRpb25zICcKICAgICAgICAgICAgICAgIC4gIldIRVJFIG5vdGlmaWNhdGlvbl9sYW5ndWFnZSBJTiAoJ2VuJywgJ2RlJyApICIKICAgICAgICAgICAgICAgIC4gJ0FORCAoIG5vdGlmaWNhdGlvbl90eXBlID0gPyBPUiBub3RpZmljYXRpb25fdHlwZSA9ID8gKScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcIkFnZW50Ojoke1R5cGV9IiwgXCJDdXN0b21lcjo6JHtUeXBlfSIsIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYwICQgJERhdGU6IDIwMTAvMDUvMjEgMTA6MjI6MTIgJAoKPWN1dAo=
ITSM::ChangeManagement::Category
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Category
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Impact
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
1 very low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
2 low
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
3 normal
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
4 high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Priority
5 very high
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
requested
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
pending approval
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
rejected
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
approved
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
in progress
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
pending pir
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
successful
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
failed
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
canceled
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::Change::State
retracted
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
created
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
accepted
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
ready
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
in progress
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
closed
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::State
canceled
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
approval
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
workorder
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
backout
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
decision
1
current_timestamp
1
current_timestamp
1
ITSM::ChangeManagement::WorkOrder::Type
pir
1
current_timestamp
1
current_timestamp
1
ChangeAdd
1
current_timestamp
1
current_timestamp
1
ChangeUpdate
1
current_timestamp
1
current_timestamp
1
ChangeDelete
1
current_timestamp
1
current_timestamp
1
ChangeCABUpdate
1
current_timestamp
1
current_timestamp
1
ChangeCABDelete
1
current_timestamp
1
current_timestamp
1
ChangeLinkAdd
1
current_timestamp
1
current_timestamp
1
ChangeLinkDelete
1
current_timestamp
1
current_timestamp
1
ChangeAttachmentAdd
1
current_timestamp
1
current_timestamp
1
ChangeAttachmentDelete
1
current_timestamp
1
current_timestamp
1
WorkOrderAdd
1
current_timestamp
1
current_timestamp
1
WorkOrderUpdate
1
current_timestamp
1
current_timestamp
1
WorkOrderDelete
1
current_timestamp
1
current_timestamp
1
WorkOrderLinkAdd
1
current_timestamp
1
current_timestamp
1
WorkOrderLinkDelete
1
current_timestamp
1
current_timestamp
1
WorkOrderAttachmentAdd
1
current_timestamp
1
current_timestamp
1
WorkOrderAttachmentDelete
1
current_timestamp
1
current_timestamp
1
ChangePlannedStartTimeReached
1
current_timestamp
1
current_timestamp
1
ChangePlannedEndTimeReached
1
current_timestamp
1
current_timestamp
1
ChangeActualStartTimeReached
1
current_timestamp
1
current_timestamp
1
ChangeActualEndTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderPlannedStartTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderPlannedEndTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderActualStartTimeReached
1
current_timestamp
1
current_timestamp
1
WorkOrderActualEndTimeReached
1
current_timestamp
1
current_timestamp
1
ChangeRequestedTimeReached
1
current_timestamp
1
current_timestamp
1
ConditionAdd
1
current_timestamp
1
current_timestamp
1
ConditionUpdate
1
current_timestamp
1
current_timestamp
1
ConditionDelete
1
current_timestamp
1
current_timestamp
1
ConditionDeleteAll
1
current_timestamp
1
current_timestamp
1
ExpressionAdd
1
current_timestamp
1
current_timestamp
1
ExpressionUpdate
1
current_timestamp
1
current_timestamp
1
ExpressionDelete
1
current_timestamp
1
current_timestamp
1
ExpressionDeleteAll
1
current_timestamp
1
current_timestamp
1
ActionAdd
1
current_timestamp
1
current_timestamp
1
ActionUpdate
1
current_timestamp
1
current_timestamp
1
ActionDelete
1
current_timestamp
1
current_timestamp
1
ActionDeleteAll
1
current_timestamp
1
current_timestamp
1
ActionExecute
1
current_timestamp
1
current_timestamp
1
ChangeNotificationSent
1
current_timestamp
1
current_timestamp
1
WorkOrderNotificationSent
1
current_timestamp
1
current_timestamp
1
RfC
1
current_timestamp
1
current_timestamp
1
ITSMChange
ITSMWorkOrder
ChangeStateID
ChangeTitle
CategoryID
ImpactID
PriorityID
ChangeManagerID
ChangeBuilderID
RequestedTime
PlannedStartTime
PlannedEndTime
ActualStartTime
ActualEndTime
PlannedEffort
AccountedTime
WorkOrderNumber
WorkOrderStateID
WorkOrderTypeID
WorkOrderTitle
WorkOrderAgentID
ChangeFreeKey1
ChangeFreeKey2
ChangeFreeKey3
ChangeFreeKey4
ChangeFreeKey5
ChangeFreeKey6
ChangeFreeKey7
ChangeFreeKey8
ChangeFreeKey9
ChangeFreeKey10
ChangeFreeKey11
ChangeFreeKey12
ChangeFreeKey13
ChangeFreeKey14
ChangeFreeKey15
ChangeFreeKey16
ChangeFreeKey17
ChangeFreeKey18
ChangeFreeKey19
ChangeFreeKey20
ChangeFreeKey21
ChangeFreeKey22
ChangeFreeKey23
ChangeFreeKey24
ChangeFreeKey25
ChangeFreeKey26
ChangeFreeKey27
ChangeFreeKey28
ChangeFreeKey29
ChangeFreeKey30
ChangeFreeKey31
ChangeFreeKey32
ChangeFreeKey33
ChangeFreeKey34
ChangeFreeKey35
ChangeFreeKey36
ChangeFreeKey37
ChangeFreeKey38
ChangeFreeKey39
ChangeFreeKey40
ChangeFreeKey41
ChangeFreeKey42
ChangeFreeKey43
ChangeFreeKey44
ChangeFreeKey45
ChangeFreeKey46
ChangeFreeKey47
ChangeFreeKey48
ChangeFreeKey49
ChangeFreeKey50
ChangeFreeText1
ChangeFreeText2
ChangeFreeText3
ChangeFreeText4
ChangeFreeText5
ChangeFreeText6
ChangeFreeText7
ChangeFreeText8
ChangeFreeText9
ChangeFreeText10
ChangeFreeText11
ChangeFreeText12
ChangeFreeText13
ChangeFreeText14
ChangeFreeText15
ChangeFreeText16
ChangeFreeText17
ChangeFreeText18
ChangeFreeText19
ChangeFreeText20
ChangeFreeText21
ChangeFreeText22
ChangeFreeText23
ChangeFreeText24
ChangeFreeText25
ChangeFreeText26
ChangeFreeText27
ChangeFreeText28
ChangeFreeText29
ChangeFreeText30
ChangeFreeText31
ChangeFreeText32
ChangeFreeText33
ChangeFreeText34
ChangeFreeText35
ChangeFreeText36
ChangeFreeText37
ChangeFreeText38
ChangeFreeText39
ChangeFreeText40
ChangeFreeText41
ChangeFreeText42
ChangeFreeText43
ChangeFreeText44
ChangeFreeText45
ChangeFreeText46
ChangeFreeText47
ChangeFreeText48
ChangeFreeText49
ChangeFreeText50
WorkOrderFreeKey1
WorkOrderFreeKey2
WorkOrderFreeKey3
WorkOrderFreeKey4
WorkOrderFreeKey5
WorkOrderFreeKey6
WorkOrderFreeKey7
WorkOrderFreeKey8
WorkOrderFreeKey9
WorkOrderFreeKey10
WorkOrderFreeKey11
WorkOrderFreeKey12
WorkOrderFreeKey13
WorkOrderFreeKey14
WorkOrderFreeKey15
WorkOrderFreeKey16
WorkOrderFreeKey17
WorkOrderFreeKey18
WorkOrderFreeKey19
WorkOrderFreeKey20
WorkOrderFreeKey21
WorkOrderFreeKey22
WorkOrderFreeKey23
WorkOrderFreeKey24
WorkOrderFreeKey25
WorkOrderFreeKey26
WorkOrderFreeKey27
WorkOrderFreeKey28
WorkOrderFreeKey29
WorkOrderFreeKey30
WorkOrderFreeKey31
WorkOrderFreeKey32
WorkOrderFreeKey33
WorkOrderFreeKey34
WorkOrderFreeKey35
WorkOrderFreeKey36
WorkOrderFreeKey37
WorkOrderFreeKey38
WorkOrderFreeKey39
WorkOrderFreeKey40
WorkOrderFreeKey41
WorkOrderFreeKey42
WorkOrderFreeKey43
WorkOrderFreeKey44
WorkOrderFreeKey45
WorkOrderFreeKey46
WorkOrderFreeKey47
WorkOrderFreeKey48
WorkOrderFreeKey49
WorkOrderFreeKey50
WorkOrderFreeText1
WorkOrderFreeText2
WorkOrderFreeText3
WorkOrderFreeText4
WorkOrderFreeText5
WorkOrderFreeText6
WorkOrderFreeText7
WorkOrderFreeText8
WorkOrderFreeText9
WorkOrderFreeText10
WorkOrderFreeText11
WorkOrderFreeText12
WorkOrderFreeText13
WorkOrderFreeText14
WorkOrderFreeText15
WorkOrderFreeText16
WorkOrderFreeText17
WorkOrderFreeText18
WorkOrderFreeText19
WorkOrderFreeText20
WorkOrderFreeText21
WorkOrderFreeText22
WorkOrderFreeText23
WorkOrderFreeText24
WorkOrderFreeText25
WorkOrderFreeText26
WorkOrderFreeText27
WorkOrderFreeText28
WorkOrderFreeText29
WorkOrderFreeText30
WorkOrderFreeText31
WorkOrderFreeText32
WorkOrderFreeText33
WorkOrderFreeText34
WorkOrderFreeText35
WorkOrderFreeText36
WorkOrderFreeText37
WorkOrderFreeText38
WorkOrderFreeText39
WorkOrderFreeText40
WorkOrderFreeText41
WorkOrderFreeText42
WorkOrderFreeText43
WorkOrderFreeText44
WorkOrderFreeText45
WorkOrderFreeText46
WorkOrderFreeText47
WorkOrderFreeText48
WorkOrderFreeText49
WorkOrderFreeText50
is
is not
is empty
is not empty
is greater than
is less than
is before
is after
contains
not contains
begins with
ends with
set
lock
ChangeBuilder
OldChangeBuilder
ChangeManager
OldChangeManager
CABCustomers
CABAgents
WorkOrderAgents
WorkOrderAgent
OldWorkOrderAgent
ChangeInitiators
GroupITSMChange
GroupITSMChangeBuilder
GroupITSMChangeManager
ITSMChange
1
current_timestamp
1
current_timestamp
1
ITSMWorkOrder
1
current_timestamp
1
current_timestamp
1
CAB
1
current_timestamp
1
current_timestamp
1
ITSMCondition
1
current_timestamp
1
current_timestamp
1
ChangeNotificationSent
1
current_timestamp
1
current_timestamp
1
WorkOrderNotificationSent
1
current_timestamp
1
current_timestamp
1
ChangeFreeKey1
ChangeFreeKey2
ChangeFreeKey3
ChangeFreeKey4
ChangeFreeKey5
ChangeFreeKey6
ChangeFreeKey7
ChangeFreeKey8
ChangeFreeKey9
ChangeFreeKey10
ChangeFreeKey11
ChangeFreeKey12
ChangeFreeKey13
ChangeFreeKey14
ChangeFreeKey15
ChangeFreeKey16
ChangeFreeKey17
ChangeFreeKey18
ChangeFreeKey19
ChangeFreeKey20
ChangeFreeKey21
ChangeFreeKey22
ChangeFreeKey23
ChangeFreeKey24
ChangeFreeKey25
ChangeFreeKey26
ChangeFreeKey27
ChangeFreeKey28
ChangeFreeKey29
ChangeFreeKey30
ChangeFreeKey31
ChangeFreeKey32
ChangeFreeKey33
ChangeFreeKey34
ChangeFreeKey35
ChangeFreeKey36
ChangeFreeKey37
ChangeFreeKey38
ChangeFreeKey39
ChangeFreeKey40
ChangeFreeKey41
ChangeFreeKey42
ChangeFreeKey43
ChangeFreeKey44
ChangeFreeKey45
ChangeFreeKey46
ChangeFreeKey47
ChangeFreeKey48
ChangeFreeKey49
ChangeFreeKey50
ChangeFreeText1
ChangeFreeText2
ChangeFreeText3
ChangeFreeText4
ChangeFreeText5
ChangeFreeText6
ChangeFreeText7
ChangeFreeText8
ChangeFreeText9
ChangeFreeText10
ChangeFreeText11
ChangeFreeText12
ChangeFreeText13
ChangeFreeText14
ChangeFreeText15
ChangeFreeText16
ChangeFreeText17
ChangeFreeText18
ChangeFreeText19
ChangeFreeText20
ChangeFreeText21
ChangeFreeText22
ChangeFreeText23
ChangeFreeText24
ChangeFreeText25
ChangeFreeText26
ChangeFreeText27
ChangeFreeText28
ChangeFreeText29
ChangeFreeText30
ChangeFreeText31
ChangeFreeText32
ChangeFreeText33
ChangeFreeText34
ChangeFreeText35
ChangeFreeText36
ChangeFreeText37
ChangeFreeText38
ChangeFreeText39
ChangeFreeText40
ChangeFreeText41
ChangeFreeText42
ChangeFreeText43
ChangeFreeText44
ChangeFreeText45
ChangeFreeText46
ChangeFreeText47
ChangeFreeText48
ChangeFreeText49
ChangeFreeText50
WorkOrderFreeKey1
WorkOrderFreeKey2
WorkOrderFreeKey3
WorkOrderFreeKey4
WorkOrderFreeKey5
WorkOrderFreeKey6
WorkOrderFreeKey7
WorkOrderFreeKey8
WorkOrderFreeKey9
WorkOrderFreeKey10
WorkOrderFreeKey11
WorkOrderFreeKey12
WorkOrderFreeKey13
WorkOrderFreeKey14
WorkOrderFreeKey15
WorkOrderFreeKey16
WorkOrderFreeKey17
WorkOrderFreeKey18
WorkOrderFreeKey19
WorkOrderFreeKey20
WorkOrderFreeKey21
WorkOrderFreeKey22
WorkOrderFreeKey23
WorkOrderFreeKey24
WorkOrderFreeKey25
WorkOrderFreeKey26
WorkOrderFreeKey27
WorkOrderFreeKey28
WorkOrderFreeKey29
WorkOrderFreeKey30
WorkOrderFreeKey31
WorkOrderFreeKey32
WorkOrderFreeKey33
WorkOrderFreeKey34
WorkOrderFreeKey35
WorkOrderFreeKey36
WorkOrderFreeKey37
WorkOrderFreeKey38
WorkOrderFreeKey39
WorkOrderFreeKey40
WorkOrderFreeKey41
WorkOrderFreeKey42
WorkOrderFreeKey43
WorkOrderFreeKey44
WorkOrderFreeKey45
WorkOrderFreeKey46
WorkOrderFreeKey47
WorkOrderFreeKey48
WorkOrderFreeKey49
WorkOrderFreeKey50
WorkOrderFreeText1
WorkOrderFreeText2
WorkOrderFreeText3
WorkOrderFreeText4
WorkOrderFreeText5
WorkOrderFreeText6
WorkOrderFreeText7
WorkOrderFreeText8
WorkOrderFreeText9
WorkOrderFreeText10
WorkOrderFreeText11
WorkOrderFreeText12
WorkOrderFreeText13
WorkOrderFreeText14
WorkOrderFreeText15
WorkOrderFreeText16
WorkOrderFreeText17
WorkOrderFreeText18
WorkOrderFreeText19
WorkOrderFreeText20
WorkOrderFreeText21
WorkOrderFreeText22
WorkOrderFreeText23
WorkOrderFreeText24
WorkOrderFreeText25
WorkOrderFreeText26
WorkOrderFreeText27
WorkOrderFreeText28
WorkOrderFreeText29
WorkOrderFreeText30
WorkOrderFreeText31
WorkOrderFreeText32
WorkOrderFreeText33
WorkOrderFreeText34
WorkOrderFreeText35
WorkOrderFreeText36
WorkOrderFreeText37
WorkOrderFreeText38
WorkOrderFreeText39
WorkOrderFreeText40
WorkOrderFreeText41
WorkOrderFreeText42
WorkOrderFreeText43
WorkOrderFreeText44
WorkOrderFreeText45
WorkOrderFreeText46
WorkOrderFreeText47
WorkOrderFreeText48
WorkOrderFreeText49
WorkOrderFreeText50