ITSMIncidentProblemManagement
1.1.92
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Build for OTRS::ITSM 1.2.0 beta2.
Build for OTRS::ITSM 1.2.0 beta1.
The OTRS::ITSM Incident and Problem Management package.
Das OTRS::ITSM Incident und Problem Management Paket.
2.3.x
ITSMCore
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . 'ITSMIncidentProblemManagement';
# 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::' . 'ITSMIncidentProblemManagement';
# 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 = 'CodeReinstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . 'ITSMIncidentProblemManagement';
# 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."
);
}
}
2008-07-16 11:11:42
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNVGlja2V0LnhtbCx2IDEuNCAyMDA4LzA3LzAzIDE1OjExOjM4IG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZGRpdGlvbmFsIElUU00gVGlja2V0IEZpZWxkczwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGlja2V0RGVjaXNpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRUaWNrZXREZWNpc2lvbiBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50VGlja2V0RGVjaXNpb24tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+VGlja2V0IERlY2lzaW9uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5EZWNpc2lvbjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzMxNS1BZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBsaW5rIGluIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFp1c+R0emxpY2hlIElUU00gRmVsZGVyLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFRpY2tldGFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkNoYW5nZSB0aGUgSVRTTSBmaWVsZHMhPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkJmFtcDtUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn08L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzIwLUxpbmsiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBhIGxpbmsgdG8gbGluayBhIHRpY2tldCB3aXRoIGFub3RoZXIgb2JqZWN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGVpbiBMaW5rIGltIE1lbvwgZGVyIFRpY2tldGFuc2ljaHQgYW5nZXplaWd0LCBtaXQgZGVtIGVpbiBUaWNrZXQgbWl0IGVpbmVtIGFuZGVyZW4gT2JqZWt0IHZlcmtu/HBmdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkxpbmsgdGhpcyB0aWNrZXQgdG8gYW4gb3RoZXIgb2JqZWN0cyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRMaW5rT2JqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRMaW5rT2JqZWN0JmFtcDtTb3VyY2VPYmplY3Q9VGlja2V0JmFtcDtTb3VyY2VLZXk9JFFEYXRheyJUaWNrZXRJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzQyMC1EZWNpc2lvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGRlY2lzaW9uIGxpbmsgaW4gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgRW50c2NoZWlkdW5nLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIFRpY2tldGFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVEZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+RGVjaXNpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5BZGQgYSBkZWNpc2lvbiBub3RlITwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudFRpY2tldERlY2lzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj5BY3Rpb249QWdlbnRUaWNrZXREZWNpc2lvbiZhbXA7VGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1Blcm1pc3Npb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhpcyBvcHRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJlbvZ0aWd0ZSBSZWNodGUgenVyIEJlYXJiZWl0dW5nIGRlcyBUaWNrZXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1JlcXVpcmVkTG9jayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQuIEluIGNhc2UgdGhlIHRpY2tldCBpc24ndCBsb2NrZWQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgdGlja2V0IG93bmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5lIFRpY2tldC1TcGVycmUgd2lyZCBiZW72dGlndC4gV2VubiBUaWNrZXQgbmljaHQgZ2VzcGVycnQgaXN0LCB3aXJkIGRhcyBUaWNrZXQgYXV0b21hdGlzY2ggZ2VzcGVycnQgdW5kIGRlciBBZ2VudCBhbHMgQmVzaXR6ZXIgZ2VzZXR6dC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpY2tldFR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHRpY2tldCB0eXBlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkZXIgVGlja2V0LVR5cCBnZXNldHp0IHdlcmRlbiBzb2xsIChUaWNrZXQ6OlR5cGUgbXVzcyBha3RpdiBzZWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHNlcnZpY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRlciBTZXJ2aWNlIGdlc2V0enQgd2VyZGVuIHNvbGwgKFRpY2tldDo6U2VydmljZSBtdXNzIGFrdGl2IHNlaW4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjT3duZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIG93bmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRlciBCZXNpdHplciBnZXNldHp0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB5b3Ugd2FudCB0byBzZXQgdGhlIHJlc3BvbnNpYmxlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRlciBWZXJhbnR3b3J0bGljaGUgZ2VzZXR6dCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N0YXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V291bGQgeW91IGxpa2UgdG8gc2V0IHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQ/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlNvbGwgZGVyIFN0YXR1cyBlaW5lcyBUaWNrZXRzIGdlc2V0enQgd2VyZGVuIGv2bm5lbiwgd2VubiBlaW5lIE5vdGl6IGR1cmNoIGVpbmVuIEFnZW50IGFuZ2VsZWd0IHdpcmQ/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IG5leHQgc3RhdGVzIGFmdGVyIGFkZGluZyBhIG5vdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk7kY2hzdG32Z2xpY2hlIFN0YXR1cyBuYWNoIGRlbSBIaW56dWb8Z2VuIGVpbmVyIE5vdGl6LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5vcGVuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyByZW1pbmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXV0bzwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU3RhdGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBuZXh0IHN0YXRlIGFmdGVyIGFuIGVtYWlsIHRpY2tldC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmRt5N9pZyBhdXNnZXfkaGx0ZXIgbuRjaHN0ZXIgU3RhdHVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPm9wZW48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjTm90ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgbm90ZSBmaWVsZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVpbmdhYmVt9mdsaWNoa2VpdCBm/HIgTm90aXouPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdWJqZWN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBub3RlIHN1YmplY3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkdGV4dCBpbSBCZXRyZWZmIGVpbmVyIE5vdGl6LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPiRUZXh0eyJOb3RlIn08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjQm9keSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbm90ZSB0ZXh0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZHRleHQgaW0gVGV4dGZlbGQgZWluZXIgTm90aXouPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxUZXh0QXJlYT48L1RleHRBcmVhPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNJbnZvbHZlZEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBzZWxlY3Rpb24gb2YgaW52b2x2ZWQgYWdlbnRzPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BdXN3YWhsIGRlciBpbnZvbHZpZXJ0ZW4gQWdlbnRzIGFuemVpZ2VuPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSW5mb3JtQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHNlbGVjdGlvbiBvZiBhZ2VudHMgdG8gaW5mb3JtPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BdXN3YWhsIGRlciB6dSBpbmZvcm1pZXJlbmRlbiBBZ2VudHMgYW56ZWlnZW4/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNBcnRpY2xlVHlwZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IG5vdGUgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+Vm9yZWluZ2VzdGVsbHRlciBOb3RpenR5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ub3RlLWludGVybmFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0FydGljbGVUeXBlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNwZWNpZnkgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgeW91IHdhbnQgdG8gdXNlIGluIHlvdXIgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGv2bm5lbiBkaWUgdmVyc2NoaWVkZW5lbiBOb3Rpei1UeXBlbiBmZXN0Z2VsZWd0IHdlcmRlbiwgZGllIGlubmVyaGFsYiBkZXMgU3lzdGVtcyB2ZXJ3ZW5kZXQgd2VyZGVuIHNvbGxlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtaW50ZXJuYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtZXh0ZXJuYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtcmVwb3J0Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1ByaW9yaXR5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBwcmlvcml0eSBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5N9mdsaWNoa2VpdCBlaW5lIFByaW9yaXTkdCBhdXN6dXfkaGxlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1ByaW9yaXR5RGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgcHJpb3JpdHkgb3B0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmYXVsdCBBdXN3YWhsIGRlciBQcmlvcml05HQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MyBub3JtYWw8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjVGl0bGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHRpdGxlIGZpZWxkcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RWluZ2FiZW32Z2xpY2hrZWl0IGb8ciBUaXRsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpY2tldEZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gdGlja2V0IGZyZWUgdGV4dCBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5HZXplaWd0ZSBUaWNrZXQtRnJlaS1UZXh0LUZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpY2tldEZyZWVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gZnJlZSB0aW1lIG9wdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkdlemVpZ3RlIEZyZWktWmVpdC1GZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0FydGljbGVGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIGFydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkdlemVpZ3RlIEFydGlrZWwtRnJlaS1UZXh0LUZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSGlzdG9yeVR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IaXN0b3J5IHR5cGUgZm9yIHRoaXMgYWN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaXN0b3JpZW50eXAgZvxyIGRpZXNlIEFrdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5BZGROb3RlPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0hpc3RvcnlDb21tZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGlzdG9yeSBjb21tZW50IGZvciB0aGlzIGFjdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGlzdG9yaWVua29tbWVudGFyIGb8ciBkaWVzZSBBa3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+JSVGcmVlVGV4dDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+UmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgb3B0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZW72dGlndGUgUmVjaHRlIHp1ciBCZWFyYmVpdHVuZyBkZXMgVGlja2V0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNSZXF1aXJlZExvY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkLiBJbiBjYXNlIHRoZSB0aWNrZXQgaXNuJ3QgbG9ja2VkLCB0aGUgdGlja2V0cyBnZXQgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIHRpY2tldCBvd25lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RWluZSBUaWNrZXQtU3BlcnJlIHdpcmQgYmVu9nRpZ3QgYnp3LiB3ZW5uIFRpY2tldCBuaWNodCBnZXNwZXJydCBpc3QsIHdpcmQgZGFzIFRpY2tldCBhdXRvbWF0aXNjaCBnZXNwZXJydCB1bmQgZGVyIEFnZW50IGFscyBCZXNpdHplciBnZXNldHp0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjVGlja2V0VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNldCB0aGUgdGlja2V0IHR5cGUgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRlciBUaWNrZXQtVHlwIGdlc2V0enQgd2VyZGVuIHNvbGwgKFRpY2tldDo6VHlwZSBtdXNzIGFrdGl2IHNlaW4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNldCB0aGUgc2VydmljZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIFNlcnZpY2UgZ2VzZXR6dCB3ZXJkZW4gc29sbCAoVGlja2V0OjpTZXJ2aWNlIG11c3MgYWt0aXYgc2VpbikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNPd25lciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNldCB0aGUgb3duZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIEJlc2l0emVyIGdlc2V0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNSZXNwb25zaWJsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklmIHlvdSB3YW50IHRvIHNldCB0aGUgcmVzcG9uc2libGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIFZlcmFudHdvcnRsaWNoZSBnZXNldHp0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Xb3VsZCB5b3UgbGlrZSB0byBzZXQgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGlmIGEgbm90ZSBpcyBjcmVhdGVkIGJ5IGFuIGFnZW50PzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Tb2xsIGRlciBTdGF0dXMgZWluZXMgVGlja2V0cyBnZXNldHp0IHdlcmRlbiBr9m5uZW4sIHdlbm4gZWluZSBOb3RpeiBkdXJjaCBlaW5lbiBBZ2VudCBhbmdlbGVndCB3aXJkPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGVUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBuZXh0IHN0YXRlcyBhZnRlciBhZGRpbmcgYSBub3RlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5O5GNoc3Rt9mdsaWNoZSBTdGF0dXMgbmFjaCBkZW0gSGluenVm/GdlbiBlaW5lciBOb3Rpei48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPmNsb3NlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgcmVtaW5kZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIGF1dG88L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N0YXRlRGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbmV4dCBzdGF0ZSBhZnRlciBhbiBlbWFpbCB0aWNrZXQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkbeTfaWcgYXVzZ2V35GhsdGVyIG7kY2hzdGVyIFN0YXR1cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5vcGVuPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI05vdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IG5vdGUgZmllbGRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5nYWJlbfZnbGljaGtlaXQgZvxyIE5vdGl6LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3ViamVjdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgbm90ZSBzdWJqZWN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZHRleHQgaW0gQmV0cmVmZiBlaW5lciBOb3Rpei48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4kVGV4dHsiRGVjaXNpb24ifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNCb2R5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBub3RlIHRleHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkdGV4dCBpbSBUZXh0ZmVsZCBlaW5lciBOb3Rpei48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFRleHRBcmVhPiRUZXh0eyJSZWFzb24ifTo8L1RleHRBcmVhPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJbnZvbHZlZEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBzZWxlY3Rpb24gb2YgaW52b2x2ZWQgYWdlbnRzPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BdXN3YWhsIGRlciBpbnZvbHZpZXJ0ZW4gQWdlbnRzIGFuemVpZ2VuPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSW5mb3JtQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHNlbGVjdGlvbiBvZiBhZ2VudHMgdG8gaW5mb3JtPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BdXN3YWhsIGRlciB6dSBpbmZvcm1pZXJlbmRlbiBBZ2VudHMgYW56ZWlnZW4/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNBcnRpY2xlVHlwZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IG5vdGUgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+Vm9yZWluZ2VzdGVsbHRlciBOb3RpenR5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ub3RlLWludGVybmFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0FydGljbGVUeXBlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNwZWNpZnkgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzLCB0aGF0IHlvdSB3YW50IHRvIHVzZSBpbiB5b3VyIHN5c3RlbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gZGllIHZlcnNjaGllZGVuZW4gTm90aXotVHlwZW4gZmVzdGdlbGVndCB3ZXJkZW4sIGRpZSBpbm5lcmhhbGIgZGVzIFN5c3RlbXMgdmVyd2VuZGV0IHdlcmRlbiBzb2xsZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWludGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWV4dGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLXJlcG9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNQcmlvcml0eSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgcHJpb3JpdHkgb3B0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TfZnbGljaGtlaXQgZGVyIEF1c3dhaGwgZvxyIGRpZSBQcmlvcml05HQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNQcmlvcml0eURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IHByaW9yaXR5IG9wdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmF1bHQgQXVzd2FobCBkZXIgUHJpb3JpdOR0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjMgbm9ybWFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1RpdGxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB0aXRsZSBmaWVsZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkVpbmdhYmVt9mdsaWNoa2VpdCBm/HIgVGl0bGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHRpY2tldCBmcmVlIHRleHQgb3B0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+R2V6ZWlndGUgVGlja2V0LUZyZWktVGV4dC1GZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaWNrZXRGcmVlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIGZyZWUgdGltZSBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5HZXplaWd0ZSBGcmVpLVplaXQtRmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNBcnRpY2xlRnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93biBhcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5HZXplaWd0ZSBBcnRpa2VsLUZyZWktVGV4dC1GZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0hpc3RvcnlUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGlzdG9yeSB0eXBlIGZvciB0aGlzIGFjdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGlzdG9yaWVudHlwIGb8ciBkaWVzZSBBa3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+QWRkTm90ZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNIaXN0b3J5Q29tbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhpc3RvcnkgY29tbWVudCBmb3IgdGhpcyBhY3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpc3RvcmllbmtvbW1lbnRhciBm/HIgZGllc2UgQWt0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPiUlTm90ZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN0YXRzOjpEeW5hbWljT2JqZWN0UmVnaXN0cmF0aW9uIyMjSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5IZXJlIHlvdSBjYW4gZGVjaWRlIGlmIHRoZSBzdGF0cyBtb2R1bGUgbWF5IGdlbmVyYXRlIHN0YXRzIGFib3V0IGl0c20gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUgc3R1ZmYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga/ZubmVuIFNpZSBmZXN0bGVnZW4sIG9iIGRhcyBTdGF0aXN0aWstTW9kdWwgYXVjaCBTdGF0aXN0aWtlbiD8YmVyIElUU00tVGlja2V0LUVyc3Rs9nN1bmdzcmF0ZSBEaW5nZSBnZW5lcmllcmVuIGRhcmYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3RhdHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBkZWNpZGUgaWYgdGhlIHN0YXRzIG1vZHVsZSBtYXkgZ2VuZXJhdGUgc3RhdHMgYWJvdXQgaXRzbSB0aWNrZXQgc29sdXRpb24gYXZlcmFnZSBzdHVmZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gU2llIGZlc3RsZWdlbiwgb2IgZGFzIFN0YXRpc3Rpay1Nb2R1bCBhdWNoIFN0YXRpc3Rpa2VuIPxiZXIgSVRTTS1UaWNrZXQtTPZzdW5nc3plaXQtRHVyY2hzY25pdHQgRGluZ2UgZ2VuZXJpZXJlbiBkYXJmLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN0YXRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpY2tldElUU01UaWNrZXQueG1sLHYgMS42IDIwMDgvMDcvMDMgMDk6MzQ6MTggdWIgRXhwICQ8L0NWUz4KICAgIDxDVlM+JE9sZElkOiBUaWNrZXQueG1sLHYgMS4xNDcuMi43IDIwMDgvMDMvMTYgMTk6MjE6NTEgbWFydGluIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OlR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQsIHlvdSBjYW4gZGVmaW5lIHRpY2tldCB0eXBlcyBmb3IgdGlja2V0cyAoZS4gZy4gaW5jaWRlbnQsIHByb2JsZW0sIGNoYW5nZSwgLi4uKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkYXMgVGlja2V0LVR5cCBGZWF0dWVzIGFrdGl2aWVydCBpc3QsIGv2bm5lbiBUaWNrZXQgVHlwZW4gcHJvIFRpY2tldCBnZXNldHp0IHdlcmRlbiAoei4gQi4gaW5jaWRlbnQsIHByb2JsZW0sIGNoYW5nZSwgLi4uKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlS2V5MTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGZyZWUga2V5IGZpZWxkIDEzIGZvciB0aWNrZXRzLiBXaXRoIHRoaXMgc2V0dGluZyB5b3UgY2FuIGRlZmluZSBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBGcmVpU2NobPxzc2VsRmVsZGVzIDEzIGb8ciBUaWNrZXRzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgVGlja2V0YXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JpdGljYWxpdHlJRCI+Q3JpdGljYWxpdHlJRDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTMgZm9yIHRpY2tldHMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDEzIGb8ciBUaWNrZXRzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgVGlja2V0YXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj5ETyBOT1QgQUNUSVZBVEUgVGlja2V0RnJlZVRleHQxMy4gR0VORVJBTCBDQVRBTE9HIElTIFVTRUQuPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZUtleTE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxNCBmb3IgdGlja2V0cy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVNjaGz8c3NlbEZlbGRlcyAxNCBm/HIgVGlja2V0cy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFRpY2tldGF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkltcGFjdElEIj5JbXBhY3RJRDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIEZyZWVUZXh0RmllbGQgMTQgZm9yIHRpY2tldHMuIFdpdGggdGhpcyBzZXR0aW5nIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIEZyZWlUZXh0RmVsZGVzIDE0IGb8ciBUaWNrZXRzLiBIaWVy/GJlciBr9m5uZW4genVz5HR6bGljaGUgVGlja2V0YXR0cmlidXRlIGRlZmluaWVydCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj5ETyBOT1QgQUNUSVZBVEUgVGlja2V0RnJlZVRleHQxNC4gR0VORVJBTCBDQVRBTE9HIElTIFVTRUQuPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRleHQxNDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE0IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNCB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjMgbm9ybWFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZUtleTE1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxNSBmb3IgdGlja2V0cy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVNjaGz8c3NlbEZlbGRlcyAxNSBm/HIgVGlja2V0cy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFRpY2tldGF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJldmlldyBSZXF1aXJlZCI+UmV2aWV3IFJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRleHQxNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxNSBmb3IgdGlja2V0cy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTUgZvxyIFRpY2tldHMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBUaWNrZXRhdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRleHQxNTo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE1IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNSB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZUtleTE2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBmcmVlIGtleSBmaWVsZCAxNiBmb3IgdGlja2V0cy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVNjaGz8c3NlbEZlbGRlcyAxNiBm/HIgVGlja2V0cy4gSGllcvxiZXIga/ZubmVuIHp1c+R0emxpY2hlIFRpY2tldGF0dHJpYnV0ZSBkZWZpbmllcnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlY2lzaW9uIFJlc3VsdCI+RGVjaXNpb24gUmVzdWx0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRleHQxNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgRnJlZVRleHRGaWVsZCAxNiBmb3IgdGlja2V0cy4gV2l0aCB0aGlzIHNldHRpbmcgeW91IGNhbiBkZWZpbmUgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgRnJlaVRleHRGZWxkZXMgMTYgZvxyIFRpY2tldHMuIEhpZXL8YmVyIGv2bm5lbiB6dXPkdHpsaWNoZSBUaWNrZXRhdHRyaWJ1dGUgZGVmaW5pZXJ0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQZW5kaW5nIj5QZW5kaW5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmUtYXBwcm92ZWQiPlByZS1hcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXBwcm92ZWQiPkFwcHJvdmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3N0cG9uZWQiPlBvc3Rwb25lZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUmVqZWN0ZWQiPlJlamVjdGVkPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRleHQxNjo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiBGcmVlVGV4dEZpZWxkIDE2IGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIGRlZmluZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBTdGFuZGFyZC1BdXN3YWhsIGRlcyBGcmVpVGV4dEZlbGRlcyAxNiB3ZW5uIG1laHJlcmUgT3B0aW9uZW4gZGVmaW5pZXJ0IHNpbmQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlBlbmRpbmc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZUtleTMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbmUgdGhlIGtleSBvZiBUaWNrZXRGcmVlVGltZSBmaWVsZCAzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlcyBTY2hsdWVzc2VscyB2b24gVGlja2V0RnJlZVRpbWUgRmVsZCAzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5SZXBhaXIgU3RhcnQgVGltZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lUGVyaW9kMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgcGVyaW9kLCB3aGljaCBjYW4gc2VsZWN0ZWQgaW4gVGlja2V0RnJlZVRpbWUgZmllbGQgMy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgWmVpdHNwYW5uZSwgZGllIGltIFRpY2tldEZyZWVUaW1lIEZlbGQgMyBzZWxla3RpZXJ0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RQYXN0Ij41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kRnV0dXJlIj41PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVLZXk0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBrZXkgb2YgVGlja2V0RnJlZVRpbWUgZmllbGQgNC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgU2NobHVlc3NlbHMgdm9uIFRpY2tldEZyZWVUaW1lIEZlbGQgNC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+UmVjb3ZlcnkgU3RhcnQgVGltZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lUGVyaW9kNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgcGVyaW9kLCB3aGljaCBjYW4gc2VsZWN0ZWQgaW4gVGlja2V0RnJlZVRpbWUgZmllbGQgNC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgWmVpdHNwYW5uZSwgZGllIGltIFRpY2tldEZyZWVUaW1lIEZlbGQgNCBzZWxla3RpZXJ0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RQYXN0Ij41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kRnV0dXJlIj41PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVLZXk1IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBrZXkgb2YgVGlja2V0RnJlZVRpbWUgZmllbGQgNS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgU2NobHVlc3NlbHMgdm9uIFRpY2tldEZyZWVUaW1lIEZlbGQgNS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+RGVjaXNpb24gRGF0ZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lUGVyaW9kNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSB0aGUgcGVyaW9kLCB3aGljaCBjYW4gc2VsZWN0ZWQgaW4gVGlja2V0RnJlZVRpbWUgZmllbGQgNS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgWmVpdHNwYW5uZSwgZGllIGltIFRpY2tldEZyZWVUaW1lIEZlbGQgNSBzZWxla3RpZXJ0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RQYXN0Ij41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kRnV0dXJlIj41PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVLZXk2IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBrZXkgb2YgVGlja2V0RnJlZVRpbWUgZmllbGQgNi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXMgU2NobHVlc3NlbHMgdm9uIFRpY2tldEZyZWVUaW1lIEZlbGQgNi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+RHVlIERhdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZURpZmY2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBkaWZmZXJlbmNlIChpbiBzZWNvbmRzKSBvZiB0aGUgZGVmYXVsdHZhbHVlIGluIFRpY2tldEZyZWVUaW1lIGZpZWxkIDYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVzIFVudGVyc2NoaWVkcyAoaW4gU2VrdW5kZW4pIGRlcyBEZWZhdWx0d2VydHMgdm9uIFRpY2tldEZyZWVUaW1lIEZlbGQgNi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MjU5MjAwPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVQZXJpb2Q2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lIHRoZSBwZXJpb2QsIHdoaWNoIGNhbiBzZWxlY3RlZCBpbiBUaWNrZXRGcmVlVGltZSBmaWVsZCA2LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBaZWl0c3Bhbm5lLCBkaWUgaW0gVGlja2V0RnJlZVRpbWUgRmVsZCA2IHNlbGVrdGllcnQgd2VyZGVuIGthbm4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZFBhc3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RGdXR1cmUiPjk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudFRpY2tldEZyZWVUZXh0IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRUaWNrZXRGcmVlVGV4dC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UaWNrZXQgRnJlZVRleHQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkZyZWUgRmllbGRzPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpY2tldDwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENsb3NlIyMjVGlja2V0RnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93biB0aWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuZ2V6ZWlndGUgVGlja2V0LUZyZWktVGV4dC1GZWxkZXIuIE32Z2xpY2hlIEVpbnN0ZWxsdW5nZW46IDAgPSBEZWFrdGl2aWVydCwgMSA9IEFrdGl2aWVydCwgMiA9IEFrdGl2aWVydCB1bmQgUGZsaWNodGZlbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdDbG9zZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE1Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZSMjI1RpY2tldEZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gdGlja2V0IGZyZWUgdGV4dCBvcHRpb25zLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbmdlemVpZ3RlIFRpY2tldC1GcmVpLVRleHQtRmVsZGVyLiBN9mdsaWNoZSBFaW5zdGVsbHVuZ2VuOiAwID0gRGVha3RpdmllcnQsIDEgPSBBa3RpdmllcnQsIDIgPSBBa3RpdmllcnQgdW5kIFBmbGljaHRmZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Q29tcG9zZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI3Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI4Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI5Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE1Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RW1haWwjIyNUaWNrZXRGcmVlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIGZyZWUgdGltZSBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5HZXplaWd0ZSBGcmVpLVplaXQtRmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RW1haWxOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmUjIyNUaWNrZXRGcmVlVGltZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIGZyZWUgdGltZSBvcHRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5HZXplaWd0ZSBGcmVpLVplaXQtRmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UGhvbmVOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSB0aWNrZXQgdHlwZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPldlbm4gZGVyIFRpY2tldC1UeXAgZ2VzZXR6dCB3ZXJkZW4gc29sbCAoVGlja2V0OjpUeXBlIG11c3MgYWt0aXYgc2VpbikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQcmlvcml0eTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SWYgeW91IHdhbnQgdG8gc2V0IHRoZSBzZXJ2aWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2VubiBkZXIgU2VydmljZSBnZXNldHp0IHdlcmRlbiBzb2xsIChUaWNrZXQ6OlNlcnZpY2UgbXVzcyBha3RpdiBzZWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1ByaW9yaXR5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRTZWFyY2gjIyNUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3duIHRpY2tldCBmcmVlIHRleHQgb3B0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+R2V6ZWlndGUgVGlja2V0LUZyZWktVGV4dC1GZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFNlYXJjaCMjI1RpY2tldEZyZWVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvd24gZnJlZSB0aW1lIG9wdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkdlemVpZ3RlIEZyZWktWmVpdC1GZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMTAtRnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBmcmVlIHRleHQgbGluayBpbiBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MaW5rIGb8ciAiRnJlaWZlbGRlciIgaW0gTWVu/CBkZXIgVGlja2V0YW5zaWNodCBhbnplaWdlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+RnJlZSBGaWVsZHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5DaGFuZ2UgdGhlIHRpY2tldCBmcmVlIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRGcmVlVGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0RnJlZVRleHQmYW1wO1RpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMjAtTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGEgbGluayB0byBsaW5rIGEgdGlja2V0IHdpdGggYW5vdGhlciBvYmplY3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZWluIExpbmsgaW0gTWVu/CBkZXIgVGlja2V0YW5zaWNodCBhbmdlemVpZ3QsIG1pdCBkZW0gZWluIFRpY2tldCBtaXQgZWluZW0gYW5kZXJlbiBPYmpla3QgdmVya278cGZ0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+TGluayB0aGlzIHRpY2tldCB0byBhbiBvdGhlciBvYmplY3RzITwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudExpbmtPYmplY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudExpbmtPYmplY3QmYW1wO1NvdXJjZU9iamVjdD1UaWNrZXQmYW1wO1NvdXJjZUlEPSRRRGF0YXsiVGlja2V0SUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNVGlja2V0LnBtIC0gdGhlIGJ1bGdhcmlhbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBiZ19JVFNNVGlja2V0LnBtLHYgMS4xIDIwMDgvMDYvMzAgMjA6MzY6MTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnyvDg6e3gIOTg8uAnOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ9Dl+OXt6OUnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ87x7e7i4O3o5Sc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnxODy4CDn4CDw5fjg4uDt5Sc7CiAgICAkTGFuZy0+eydBZGQgZGVjaXNpb24gdG8gdGlja2V0J30gICAgICAgPSAnxO7h4OLoIPDl+OXt6OUg6vrsIOHo6+Xy4Cc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAn0OXn8+vy4PIg7vIg8OX45e3o5fLuJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICfI5+jx6uLgIO/w5ePr5ebk4O3lJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICfv8Ojq6/735e0g8SDu4fXu5O3uIPDl+OXt6OUnOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ8Tu7/rr7ejy5evt6CBJVFNNIO/u6+Xy4Cc7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnz/Du7OXt6CBJVFNNIO/u6+Xy4PLgIO3gIOHo6+Xy4Cc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnwvDl7OUg7eAg8fLg8PLo8ODt5SDt4CDw5ezu7fLgJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICfC8OXs5SDt4CDx8uDw8ujw4O3lIO3gIOL65/Hy4O3u4v/i4O3l8u4nOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNVGlja2V0LnBtIC0gdGhlIGN6ZWNoIHRyYW5zbGF0aW9uIG9mIElUU01UaWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGN6X0lUU01UaWNrZXQucG0sdiAxLjEgMjAwOC8wNi8zMCAyMDozNjoxMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0R1ZSBEYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdLb25lxI1uw60gZGF0dW0nOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ8WYZcWhZW7DrSc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnRMWvdm9kJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdEYXR1bSByb3pob2RudXTDrSc7CiAgICAkTGFuZy0+eydBZGQgZGVjaXNpb24gdG8gdGlja2V0J30gICAgICAgPSAnRG9kYXQgxZllxaFlbsOtIGsgdGlrZXR1JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdWw71zbGVkZWsgcm96aG9kbnV0w60nOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1Z5xb5hZHVqZSBwxZllaGxlZCc7CiAgICAkTGFuZy0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gICAgICAgPSAnVXphdsWZZW4gcyBvYmNob2Ruw61tIHJvemhvZG51dMOtbSc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAnRG9kYXRlxI1uw6kgSVRTTSBwb2xlJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdabcSbbml0IElUU00gcG9sw60gdGlrZXR1JzsKICAgICRMYW5nLT57J1JlcGFpciBTdGFydCBUaW1lJ30gICAgICAgICAgICA9ICfEjGFzIHphaMOhamVuw60gb3ByYXZ5JzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICfEjGFzIHphaMOhamVuw60gb2Jub3ZlbsOtJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNVGlja2V0LnBtIC0gdGhlIGdlcm1hbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9JVFNNVGlja2V0LnBtLHYgMS4xIDIwMDgvMDYvMzAgMjA6MzY6MTEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgRGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRuRsbGlna2VpdHNkYXR1bSc7CiAgICAkTGFuZy0+eydEZWNpc2lvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnRW50c2NoZWlkdW5nJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWdy/G5kdW5nJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdFbnRzY2hlaWR1bmdzZGF0dW0nOwogICAgJExhbmctPnsnQWRkIGRlY2lzaW9uIHRvIHRpY2tldCd9ICAgICAgID0gJ0VudHNjaGVpZHVuZyBhbiBUaWNrZXQgaORuZ2VuJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdFbnRzY2hlaWR1bmcnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ05hY2hiZWFyYmVpdHVuZyBlcmZvcmRlcmxpY2gnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ3Byb3Zpc29yaXNjaCBnZXNjaGxvc3Nlbic7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAnWnVz5HR6bGljaGUgSVRTTSBGZWxkZXInOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ8RuZGVybiBkZXIgSVRTTSBGZWxkZXIgZGVzIFRpY2tldHMnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ1JlcGFyYXR1ciBTdGFydHplaXQnOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ1dpZWRlcmhlcnN0ZWxsdW5nIFN0YXJ0emVpdCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0gLSBhZGRpdGlvbmFsIGl0c20gZmllbGRzIGZvciB0aWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0sdiAxLjEgMjAwOC8wNy8wMiAxNzowNjozMSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5wbSx2IDEuMzggMjAwOC8wNy8wMiAxMzozOTowNSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KI3BhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZyZWVUZXh0OwpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDsKIyAtLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CiAgICBteSBASW5mb3JtVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW5mb3JtVXNlcklEJyApOwogICAgJFNlbGYtPntJbmZvcm1Vc2VySUR9ID0gXEBJbmZvcm1Vc2VySUQ7CiAgICBteSBASW52b2x2ZWRVc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbnZvbHZlZFVzZXJJRCcgKTsKICAgICRTZWxmLT57SW52b2x2ZWRVc2VySUR9ID0gXEBJbnZvbHZlZFVzZXJJRDsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5lZWQgVGlja2V0SUQgaXMgZ2l2ZW4hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBpZiAoCiAgICAgICAgISRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrSXNUaWNrZXRMb2NrZWQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgc2hvdyBsb2NrIHN0YXRlCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtOdW1iZXJ9ICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIG93bmVyIHRvIGRvIHRoaXMgYWN0aW9uISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVRpY2tldCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIGZvciAoCiAgICAgICAgcXcoCiAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBBcnRpY2xlVHlwZUlEIFRpdGxlIEJvZHkgU3ViamVjdAogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIE5ld093bmVySUQgTmV3T3duZXJUeXBlIE9sZE93bmVySUQgTmV3UmVzcG9uc2libGVJRAogICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgRXhwYW5kCiAgICAgICAgQXR0YWNobWVudFVwbG9hZAogICAgICAgIEF0dGFjaG1lbnREZWxldGUxIEF0dGFjaG1lbnREZWxldGUyIEF0dGFjaG1lbnREZWxldGUzIEF0dGFjaG1lbnREZWxldGU0CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTUgQXR0YWNobWVudERlbGV0ZTYgQXR0YWNobWVudERlbGV0ZTcgQXR0YWNobWVudERlbGV0ZTgKICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTAgQXR0YWNobWVudERlbGV0ZTExIEF0dGFjaG1lbnREZWxldGUxMgogICAgICAgIEF0dGFjaG1lbnREZWxldGUxMyBBdHRhY2htZW50RGVsZXRlMTQgQXR0YWNobWVudERlbGV0ZTE1IEF0dGFjaG1lbnREZWxldGUxNgogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0MTQiKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUHJpb3JpdHlSQyIpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRWxlbWVudENoYW5nZWQiKSB8fCAnJzsKCiAgICAjIHNldCBQcmlvcml0eVJDIGZyb20gY2hhbmdlZCBhamF4IGVsZW1lbnQKICAgIGlmICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnICkKICAgICAgICB8fCAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnVGlja2V0RnJlZVRleHQxNCcgKSAmJiAoICRHZXRQYXJhbXtJbXBhY3RJRH0gICkgKQogICAgKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgIH0KCiAgICAjIHNldCBzZXJ2aWNlIGlkIGZyb20gdGlja2V0CiAgICBpZiAoIWRlZmluZWQoJEdldFBhcmFte1NlcnZpY2VJRH0pICYmICRUaWNrZXR7U2VydmljZUlEfSkgewogICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFRpY2tldHtTZXJ2aWNlSUR9OwogICAgfQoKICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17SW1wYWN0SUR9ICkgewogICAgICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9OwogICAgfQoKICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICk7CgogICAgbXkgJVNlcnZpY2U7CiAgICBpZiAoJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICBpZiAoJEdldFBhcmFte0ltcGFjdElEfSkgewogICAgICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyAtLS0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiVGlja2V0RnJlZUtleSRfIiApOwogICAgICAgICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQkXyIgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0aW1lIHBhcmFtcwogICAgRlJFRVRJTUVOVU1CRVI6CiAgICBmb3IgbXkgJEZyZWVUaW1lTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNyZWF0ZSBmcmVldGltZSBwcmVmaXgKICAgICAgICBteSAkRnJlZVRpbWVQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJEZyZWVUaW1lTnVtYmVyOwoKICAgICAgICAjIGdldCBmb3JtIHBhcmFtcwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFkZGl0aW9uYWwgcGFyYW1zCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gPSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9IHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRGcmVlVGltZU51bWJlciApICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDA7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICAgID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIHRpbWVkYXRhCiAgICAgICAgbXkgJFRpbWVEYXRhQ29tcGxldGUgPSAxOwogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICBuZXh0IFRZUEUgaWYgZGVmaW5lZCAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CgogICAgICAgICAgICAkVGltZURhdGFDb21wbGV0ZSA9IDA7CiAgICAgICAgICAgIGxhc3QgVFlQRTsKICAgICAgICB9CgogICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVIgaWYgJFRpbWVEYXRhQ29tcGxldGU7CgogICAgICAgIGlmICggISRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApIHsKCiAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVI7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVldGltZSBkYXRhIGZyb20gdGlja2V0CiAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lU3RyaW5nCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKTsKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFRpY2tldEZyZWVUaW1lU3RyaW5nICk7CgogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTWludXRlJyB9ID0gJE1pbnV0ZTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdIb3VyJyB9ICAgPSAkSG91cjsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdEYXknIH0gICAgPSAkRGF5OwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01vbnRoJyB9ICA9ICRNb250aDsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdZZWFyJyB9ICAgPSAkWWVhcjsKICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgIGlmICggJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgIG15ICRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpIHx8IDcwOwogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhePi4rfC57NCwkU2l6ZX0pKD86XHN8XHopLyQxXG4vZ207CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBzdG9yZSBhY3Rpb24KICAgICAgICBteSAlRXJyb3IgPSAoKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKTsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgICAgICAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiU3ViamVjdCBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiQm9keSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBGcmVlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlRpY2tldEZyZWVUZXh0RmllbGQkXyBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFteyJBdHRhY2htZW50RGVsZXRlJF8ifSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9ICkgewogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cwogICAgICAgICAgICA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGNoZWNrIGV4cGFuZAogICAgICAgIGlmICggJEdldFBhcmFte0V4cGFuZH0gKSB7CiAgICAgICAgICAgICVFcnJvciA9ICgpOwogICAgICAgICAgICAkRXJyb3J7IkV4cGFuZCJ9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUVycm9yLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17VGl0bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZVNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtTTEFJRH0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyAmJiAkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICA9PiAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gInRleHQvcGxhaW47IGNoYXJzZXQ9JFNlbGYtPntMYXlvdXRPYmplY3R9LT57J1VzZXJDaGFyc2V0J30iLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCA9PgogICAgICAgICAgICAgICAgICAgIFsgQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sIEB7ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9IH0sIF0sCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBOb0FnZW50Tm90aWZ5ID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzRGF0YSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgICAgICBmb3IgbXkgJFJlZiAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJXskUmVmfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCgkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSkgfHwgISRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEtleSA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gMTMsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgS2V5ID0+ICdJbXBhY3RJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0gfHwgJycsCiAgICAgICAgICAgIENvdW50ZXIgPT4gMTQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKIyAtLS0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGltZQogICAgICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlVGltZTsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdTZWN1bmRlJyB9ID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJVRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwgUHJlZml4ID0+ICdUaWNrZXRGcmVlVGltZScgLiAkXwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgICVUaW1lLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCAgID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApOwoKICAgICAgICAgICAgIyBzZXQgdW5sb2NrIG9uIGNsb3NlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPSRTZWxmLT57VGlja2V0SUR9JkFydGljbGVJRD0kQXJ0aWNsZUlEIgogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAkSW1wYWN0TGlzdC0+eycnfSA9ICctJzsKCiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQojIC0tLQogICAgZWxzZSB7CgogICAgICAgICMgZmlsbHVwIHZhcnMKICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17Qm9keX0gKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICk7CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXtTdWJqZWN0fSApICYmICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgJUdldFBhcmFtLCAlVGlja2V0LCAlVGlja2V0RnJlZVRleHRIVE1MLCAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgIEltcGFjdElEID0+ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0sCiAgICAgICAgICAgIE5ld1ByaW9yaXR5SUQgPT4gJFRpY2tldHtQcmlvcml0eUlEfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgIG15ICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VydmljZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgIG15ICVTZXJ2aWNlID0gKCAnJywgJy0nICk7CiAgICAgICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICBPbkNoYW5nZSA9PgojICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2xkIG93bmVyCiAgICAgICAgbXkgQE9sZFVzZXJJbmZvID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgJFBhcmFte093bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld093bmVySUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMCkiLAogICAgICAgICk7CiAgICAgICAgbXkgJVVzZXJIYXNoID0gKCk7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhJVVzZXJIYXNoICkgewogICAgICAgICAgICAkVXNlckhhc2h7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBteSAkT2xkT3duZXJTZWxlY3RlZElEID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkUGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gLiAnMSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHN0cmluZwogICAgICAgICRQYXJhbXtPbGRPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRPbGRPd25lclNlbGVjdGVkSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMikiLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17TmV3T3duZXJUeXBlfSAmJiAkUGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyApIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok9sZCd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpOZXcnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVySnMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0gfHwgJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CiAgICAgICAgbXkgJVN0YXRlICAgICA9ICgpOwogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFN0YXRlTGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJVN0YXRlTGlzdCApIHsKICAgICAgICAgICAgaWYgKCRfKSB7CiAgICAgICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL3BlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlUGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGNyZWF0ZSBpbXBhY3Qgc3RyaW5nCiAgICAgICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtJbXBhY3RzfSwKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ltcGFjdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwojIC0tLQogICAgICAgIG15ICVQcmlvcml0eTsKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAlUHJpb3JpdHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlSnMnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZ2VudCBsaXN0CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ25vdGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte09wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbmZvcm1Vc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGludm9sdmVkCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbnZvbHZlZEFnZW50fSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5JbnZvbHZlZEFnZW50cyggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgbXkgJVVzZXJIYXNoID0gKCk7CiAgICAgICAgICAgIG15ICRDb3VudGVyICA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQFVzZXJJRHMgKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCAhJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17SW52b2x2ZWRBZ2VudFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbnZvbHZlZFVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52b2x2ZWRBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTcGVsbENoZWNrZXInKQogICAgICAgICAgICAmJiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJERhdGFSZWYgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlID0gKCk7CiAgICAgICAgaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5vdGVzCiAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CiAgICAgICAgbXkgJU5vdGVUeXBlcyAgICAgICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICBUYWJsZSA9PiAnYXJ0aWNsZV90eXBlJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgV2hhdCAgPT4gJ2lkLCBuYW1lJwogICAgICAgICk7CiAgICAgICAgZm9yICgga2V5cyAlTm90ZVR5cGVzICkgewogICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skX30gfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17QXJ0aWNsZVR5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVOb3RlVHlwZXMsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAlQXJ0aWNsZVR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydUaWNrZXRGcmVlVGltZSd9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiMgLS0tCiMgSVRTTQojIC0tLQojICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEZyZWVUZXh0JywgRGF0YSA9PiBcJVBhcmFtICk7CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkJywgRGF0YSA9PiBcJVBhcmFtKTsKIyAtLS0KfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Q2xvc2UucG0gLSBjbG9zZSBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRDbG9zZS5wbSx2IDEuMSAyMDA4LzA3LzAyIDE2OjI4OjI3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldENsb3NlLnBtLHYgMS40NSAyMDA4LzA3LzAyIDEzOjM5OjA1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldENsb3NlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKICAgIG15IEBJbmZvcm1Vc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CiAgICAkU2VsZi0+e0luZm9ybVVzZXJJRH0gPSBcQEluZm9ybVVzZXJJRDsKICAgIG15IEBJbnZvbHZlZFVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwogICAgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gPSBcQEludm9sdmVkVXNlcklEOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBUaWNrZXRJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBGUkVFVElNRU5VTUJFUjoKICAgIGZvciBteSAkRnJlZVRpbWVOdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY3JlYXRlIGZyZWV0aW1lIHByZWZpeAogICAgICAgIG15ICRGcmVlVGltZVByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkRnJlZVRpbWVOdW1iZXI7CgogICAgICAgICMgZ2V0IGZvcm0gcGFyYW1zCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYWRkaXRpb25hbCBwYXJhbXMKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSA9ICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gfHwgMDsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJEZyZWVUaW1lTnVtYmVyICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMDsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgICAgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgdGltZWRhdGEKICAgICAgICBteSAkVGltZURhdGFDb21wbGV0ZSA9IDE7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiBkZWZpbmVkICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKCiAgICAgICAgICAgICRUaW1lRGF0YUNvbXBsZXRlID0gMDsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUiBpZiAkVGltZURhdGFDb21wbGV0ZTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgZGVsZXRlICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yICggMSAuLiAzICkgewogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZVRleHQkXyIgKTsKICAgIH0KCiAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgbXkgJFNpemUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJykgfHwgNzA7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKF4+Lit8Lns0LCRTaXplfSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFteyRffSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGF0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJTdWJqZWN0IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJCb2R5IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2UgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17IkF0dGFjaG1lbnREZWxldGUkXyJ9ICkgewogICAgICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJF8sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzCiAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kIn0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtUaXRsZX0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NlcnZpY2VJRH0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NMQUlEfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICRHZXRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgID0+ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiIsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAidGV4dC9wbGFpbjsgY2hhcnNldD0kU2VsZi0+e0xheW91dE9iamVjdH0tPnsnVXNlckNoYXJzZXQnfSIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEID0+CiAgICAgICAgICAgICAgICAgICAgWyBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSwgXSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgICAgIGZvciBteSAkUmVmIChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRSZWZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9ICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2UKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKTsKICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgdmFycwogICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXtCb2R5fSApICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFte1N1YmplY3R9ICkgJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sICVUaWNrZXQsICVUaWNrZXRGcmVlVGV4dEhUTUwsICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgyKSIsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok5ldyd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSB8fCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSApIHsKICAgICAgICBteSAlU3RhdGUgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkU3RhdGVMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBpZiAoJF8pIHsKICAgICAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvcGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1NwZWxsQ2hlY2tlcicpCiAgICAgICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkRGF0YVJlZiAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGUgPSAoKTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBteSAlRGVmYXVsdE5vdGVUeXBlcyA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gfTsKICAgICAgICBteSAlTm90ZVR5cGVzICAgICAgICA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgIFRhYmxlID0+ICdhcnRpY2xlX3R5cGUnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBXaGF0ICA9PiAnaWQsIG5hbWUnCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRffSB9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVJRCcsCiAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J1RpY2tldEZyZWVUaW1lJ30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAiVGlja2V0RnJlZVRleHQkS2V5IiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICJUaWNrZXRGcmVlS2V5JEtleSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRpbWUgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lQ2hlY2sgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXkgLiAnVXNlZCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVGaWVsZCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJEtleSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldENsb3NlJywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RGVjaXNpb24ucG0gLSB0byBhZGQgbm90ZXMgKGRlY2lzaW9uKSB0byBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXREZWNpc2lvbi5wbSx2IDEuMSAyMDA4LzA3LzAyIDE3OjA2OjMxIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUucG0sdiAxLjUwIDIwMDgvMDcvMDIgMTM6Mzk6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiNwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXROb3RlOwpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXREZWNpc2lvbjsKIyAtLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CiAgICBteSBASW5mb3JtVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW5mb3JtVXNlcklEJyApOwogICAgJFNlbGYtPntJbmZvcm1Vc2VySUR9ID0gXEBJbmZvcm1Vc2VySUQ7CiAgICBteSBASW52b2x2ZWRVc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbnZvbHZlZFVzZXJJRCcgKTsKICAgICRTZWxmLT57SW52b2x2ZWRVc2VySUR9ID0gXEBJbnZvbHZlZFVzZXJJRDsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5lZWQgVGlja2V0SUQgaXMgZ2l2ZW4hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBpZiAoCiAgICAgICAgISRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrSXNUaWNrZXRMb2NrZWQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgc2hvdyBsb2NrIHN0YXRlCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtOdW1iZXJ9ICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIG93bmVyIHRvIGRvIHRoaXMgYWN0aW9uISIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVRpY2tldCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIGZvciAoCiAgICAgICAgcXcoCiAgICAgICAgTmV3U3RhdGVJRCBOZXdQcmlvcml0eUlEIFRpbWVVbml0cyBBcnRpY2xlVHlwZUlEIFRpdGxlIEJvZHkgU3ViamVjdAogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIE5ld093bmVySUQgTmV3T3duZXJUeXBlIE9sZE93bmVySUQgTmV3UmVzcG9uc2libGVJRAogICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgRXhwYW5kCiAgICAgICAgQXR0YWNobWVudFVwbG9hZAogICAgICAgIEF0dGFjaG1lbnREZWxldGUxIEF0dGFjaG1lbnREZWxldGUyIEF0dGFjaG1lbnREZWxldGUzIEF0dGFjaG1lbnREZWxldGU0CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTUgQXR0YWNobWVudERlbGV0ZTYgQXR0YWNobWVudERlbGV0ZTcgQXR0YWNobWVudERlbGV0ZTgKICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTAgQXR0YWNobWVudERlbGV0ZTExIEF0dGFjaG1lbnREZWxldGUxMgogICAgICAgIEF0dGFjaG1lbnREZWxldGUxMyBBdHRhY2htZW50RGVsZXRlMTQgQXR0YWNobWVudERlbGV0ZTE1IEF0dGFjaG1lbnREZWxldGUxNgogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0MTQiKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUHJpb3JpdHlSQyIpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRWxlbWVudENoYW5nZWQiKSB8fCAnJzsKCiAgICAjIHNldCBQcmlvcml0eVJDIGZyb20gY2hhbmdlZCBhamF4IGVsZW1lbnQKICAgIGlmICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnICkKICAgICAgICB8fCAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnVGlja2V0RnJlZVRleHQxNCcgKSAmJiAoICRHZXRQYXJhbXtJbXBhY3RJRH0gICkgKQogICAgKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgIH0KCiAgICAjIHNldCBzZXJ2aWNlIGlkIGZyb20gdGlja2V0CiAgICBpZiAoIWRlZmluZWQoJEdldFBhcmFte1NlcnZpY2VJRH0pICYmICRUaWNrZXR7U2VydmljZUlEfSkgewogICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFRpY2tldHtTZXJ2aWNlSUR9OwogICAgfQoKICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17SW1wYWN0SUR9ICkgewogICAgICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gPSAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9OwogICAgfQoKICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICk7CgogICAgbXkgJVNlcnZpY2U7CiAgICBpZiAoJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICBpZiAoJEdldFBhcmFte0ltcGFjdElEfSkgewogICAgICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyAtLS0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiVGlja2V0RnJlZUtleSRfIiApOwogICAgICAgICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQkXyIgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0aW1lIHBhcmFtcwogICAgRlJFRVRJTUVOVU1CRVI6CiAgICBmb3IgbXkgJEZyZWVUaW1lTnVtYmVyICggMSAuLiA2ICkgewoKICAgICAgICAjIGNyZWF0ZSBmcmVldGltZSBwcmVmaXgKICAgICAgICBteSAkRnJlZVRpbWVQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJEZyZWVUaW1lTnVtYmVyOwoKICAgICAgICAjIGdldCBmb3JtIHBhcmFtcwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFkZGl0aW9uYWwgcGFyYW1zCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gPSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9IHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRGcmVlVGltZU51bWJlciApICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDA7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICAgID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIHRpbWVkYXRhCiAgICAgICAgbXkgJFRpbWVEYXRhQ29tcGxldGUgPSAxOwogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICBuZXh0IFRZUEUgaWYgZGVmaW5lZCAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CgogICAgICAgICAgICAkVGltZURhdGFDb21wbGV0ZSA9IDA7CiAgICAgICAgICAgIGxhc3QgVFlQRTsKICAgICAgICB9CgogICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVIgaWYgJFRpbWVEYXRhQ29tcGxldGU7CgogICAgICAgIGlmICggISRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApIHsKCiAgICAgICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVI7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVldGltZSBkYXRhIGZyb20gdGlja2V0CiAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lU3RyaW5nCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKTsKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFRpY2tldEZyZWVUaW1lU3RyaW5nICk7CgogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gICA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTWludXRlJyB9ID0gJE1pbnV0ZTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdIb3VyJyB9ICAgPSAkSG91cjsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdEYXknIH0gICAgPSAkRGF5OwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01vbnRoJyB9ICA9ICRNb250aDsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdZZWFyJyB9ICAgPSAkWWVhcjsKICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgIGlmICggJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgIG15ICRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpIHx8IDcwOwogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhePi4rfC57NCwkU2l6ZX0pKD86XHN8XHopLyQxXG4vZ207CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBzdG9yZSBhY3Rpb24KICAgICAgICBteSAlRXJyb3IgPSAoKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKTsKCiAgICAgICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICAgICAgICAgICAgICBmb3IgKHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiU3ViamVjdCBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiQm9keSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXF1aXJlZCBGcmVlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlRpY2tldEZyZWVUZXh0RmllbGQkXyBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICcqIGludmFsaWQnOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFteyJBdHRhY2htZW50RGVsZXRlJF8ifSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9ICkgewogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cwogICAgICAgICAgICA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGNoZWNrIGV4cGFuZAogICAgICAgIGlmICggJEdldFBhcmFte0V4cGFuZH0gKSB7CiAgICAgICAgICAgICVFcnJvciA9ICgpOwogICAgICAgICAgICAkRXJyb3J7IkV4cGFuZCJ9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUVycm9yLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17VGl0bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZVNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtTTEFJRH0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyAmJiAkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICA9PiAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gInRleHQvcGxhaW47IGNoYXJzZXQ9JFNlbGYtPntMYXlvdXRPYmplY3R9LT57J1VzZXJDaGFyc2V0J30iLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCA9PgogICAgICAgICAgICAgICAgICAgIFsgQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sIEB7ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9IH0sIF0sCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBOb0FnZW50Tm90aWZ5ID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzRGF0YSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgICAgICBmb3IgbXkgJFJlZiAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJXskUmVmfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCgkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSkgfHwgISRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEtleSA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gMTMsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgS2V5ID0+ICdJbXBhY3RJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0gfHwgJycsCiAgICAgICAgICAgIENvdW50ZXIgPT4gMTQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKIyAtLS0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGltZQogICAgICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlVGltZTsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdTZWN1bmRlJyB9ID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJVRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwgUHJlZml4ID0+ICdUaWNrZXRGcmVlVGltZScgLiAkXwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgICVUaW1lLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCAgID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApOwoKICAgICAgICAgICAgIyBzZXQgdW5sb2NrIG9uIGNsb3NlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tJlRpY2tldElEPSRTZWxmLT57VGlja2V0SUR9JkFydGljbGVJRD0kQXJ0aWNsZUlEIgogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAkSW1wYWN0TGlzdC0+eycnfSA9ICctJzsKCiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZEpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQojIC0tLQogICAgZWxzZSB7CgogICAgICAgICMgZmlsbHVwIHZhcnMKICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17Qm9keX0gKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICk7CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXtTdWJqZWN0fSApICYmICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgJUdldFBhcmFtLCAlVGlja2V0LCAlVGlja2V0RnJlZVRleHRIVE1MLCAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgIEltcGFjdElEID0+ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0sCiAgICAgICAgICAgIE5ld1ByaW9yaXR5SUQgPT4gJFRpY2tldHtQcmlvcml0eUlEfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgIG15ICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VydmljZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgIG15ICVTZXJ2aWNlID0gKCAnJywgJy0nICk7CiAgICAgICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICBPbkNoYW5nZSA9PgojICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2xkIG93bmVyCiAgICAgICAgbXkgQE9sZFVzZXJJbmZvID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgJFBhcmFte093bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld093bmVySUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMCkiLAogICAgICAgICk7CiAgICAgICAgbXkgJVVzZXJIYXNoID0gKCk7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAhJVVzZXJIYXNoICkgewogICAgICAgICAgICAkVXNlckhhc2h7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBteSAkT2xkT3duZXJTZWxlY3RlZElEID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkUGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gLiAnMSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHN0cmluZwogICAgICAgICRQYXJhbXtPbGRPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRPbGRPd25lclNlbGVjdGVkSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBPbkNsaWNrICAgID0+ICJjaGFuZ2Vfc2VsZWN0ZWQoMikiLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17TmV3T3duZXJUeXBlfSAmJiAkUGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyApIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok9sZCd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpOZXcnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVySnMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0gfHwgJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CiAgICAgICAgbXkgJVN0YXRlICAgICA9ICgpOwogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFN0YXRlTGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlU3RhdGVMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJVN0YXRlTGlzdCApIHsKICAgICAgICAgICAgaWYgKCRfKSB7CiAgICAgICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL3BlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBEaWZmVGltZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlUGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGNyZWF0ZSBpbXBhY3Qgc3RyaW5nCiAgICAgICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtJbXBhY3RzfSwKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ltcGFjdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwojIC0tLQogICAgICAgIG15ICVQcmlvcml0eTsKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAlUHJpb3JpdHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlSnMnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZ2VudCBsaXN0CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ25vdGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte09wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbmZvcm1Vc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGludm9sdmVkCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbnZvbHZlZEFnZW50fSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5JbnZvbHZlZEFnZW50cyggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgbXkgJVVzZXJIYXNoID0gKCk7CiAgICAgICAgICAgIG15ICRDb3VudGVyICA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQFVzZXJJRHMgKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCAhJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17SW52b2x2ZWRBZ2VudFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICA9PiBcJVVzZXJIYXNoLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdJbnZvbHZlZFVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52b2x2ZWRBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTcGVsbENoZWNrZXInKQogICAgICAgICAgICAmJiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJERhdGFSZWYgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFydGljbGVUeXBlSUQgc3RyaW5nCiAgICAgICAgbXkgJUFydGljbGVUeXBlID0gKCk7CiAgICAgICAgaWYgKCAhJFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtBcnRpY2xlVHlwZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBvc3NpYmxlIG5vdGVzCiAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CiAgICAgICAgbXkgJU5vdGVUeXBlcyAgICAgICAgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICBUYWJsZSA9PiAnYXJ0aWNsZV90eXBlJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgV2hhdCAgPT4gJ2lkLCBuYW1lJwogICAgICAgICk7CiAgICAgICAgZm9yICgga2V5cyAlTm90ZVR5cGVzICkgewogICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skX30gfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17QXJ0aWNsZVR5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVOb3RlVHlwZXMsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAlQXJ0aWNsZVR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+eydUaWNrZXRGcmVlVGltZSd9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiMgLS0tCiMgSVRTTQojIC0tLQojICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE5vdGUnLCBEYXRhID0+IFwlUGFyYW0gKTsKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dChUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RGVjaXNpb24nLCBEYXRhID0+IFwlUGFyYW0pOwojIC0tLQp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RW1haWwucG0gLSB0byBjb21wb3NlIGluaXRpYWwgZW1haWwgdG8gY3VzdG9tZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0RW1haWwucG0sdiAxLjQgMjAwOC8wNy8wNyAyMzo0MTo0NSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRFbWFpbC5wbSx2IDEuNjggMjAwOC8wNi8zMCAyMDoxNjozMyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBNYWlsOjpBZGRyZXNzOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKCiAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwvICkgewogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIGZvciAoCiAgICAgICAgcXcoQXR0YWNobWVudFVwbG9hZAogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIFRvIENjIEJjYyBUaW1lVW5pdHMgUHJpb3JpdHlJRCBTdWJqZWN0IEJvZHkKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIE93bmVyQWxsIFJlc3BvbnNpYmxlQWxsCiAgICAgICAgTmV3UmVzcG9uc2libGVJRCBOZXdVc2VySUQKICAgICAgICBOZXh0U3RhdGVJRAogICAgICAgIEF0dGFjaG1lbnREZWxldGUxIEF0dGFjaG1lbnREZWxldGUyIEF0dGFjaG1lbnREZWxldGUzIEF0dGFjaG1lbnREZWxldGU0CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTUgQXR0YWNobWVudERlbGV0ZTYgQXR0YWNobWVudERlbGV0ZTcgQXR0YWNobWVudERlbGV0ZTgKICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTAgQXR0YWNobWVudERlbGV0ZTExIEF0dGFjaG1lbnREZWxldGUxMgogICAgICAgIEF0dGFjaG1lbnREZWxldGUxMyBBdHRhY2htZW50RGVsZXRlMTQgQXR0YWNobWVudERlbGV0ZTE1IEF0dGFjaG1lbnREZWxldGUxNgogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdUaWNrZXRGcmVlVGV4dDE0Jyk7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdQcmlvcml0eVJDJyk7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcpIHx8ICcnOwoKICAgICMgY2hlY2sgaWYgcHJpb3JpdHkgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCiAgICBpZiAoICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJwogICAgICAgIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgIG15ICVTZXJ2aWNlOwogICAgbXkgJEltcGFjdExpc3QgPSB7fTsKICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwogICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CgogICAgICAgICMgcmVjYWxjdWxhdGUgaW1wYWN0IGlmIGltcGFjdCBpcyBub3Qgc2V0IHVudGlsIG5vdwogICAgICAgIGlmICggISRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXRGcmVlVGV4dDE0OjpEZWZhdWx0U2VsZWN0aW9uJyk7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IGltcGFjdCBpZAogICAgICAgICAgICBteSAlSW1wYWN0TGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEltcGFjdExpc3R9OwogICAgICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ICAgPSAkSW1wYWN0TGlzdFJldmVyc2V7JERlZmF1bHRTZWxlY3Rpb259OwogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICkgewoKICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgICAgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDYgKSB7CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICJUaWNrZXRGcmVlVGltZSIgLiAkXyAuICRUeXBlIH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAiVGlja2V0RnJlZVRpbWUiIC4gJF8gLiAkVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnT3B0aW9uYWwnIH0KICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJF8gKSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkXyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdVc2VkJyB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZUtleSRfIiApOwogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlVGV4dCRfIiApOwogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSB8fCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAjIGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKCiAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aWNrZXQgaWQhCiAgICAgICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gfHwgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgKSB7CgogICAgICAgICAgICAjIG5hdmlnYXRpb24gYmFyCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIG5vdGlmeSBpbmZvCiAgICAgICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJ1RpY2tldCAiJXMiIGNyZWF0ZWQhIiwgIicgLiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgTGluayA9PiAnJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JyAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc3BsaXQgYXJ0aWNsZSBpZiBnaXZlbgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbnMKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVEZWZhdWx0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZURlZmF1bHR7ICdUaWNrZXRGcmVlS2V5JyAuICRfIH0gPSAkR2V0UGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICRfIH0KICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVLZXknIC4gJF8gLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVEZWZhdWx0eyAnVGlja2V0RnJlZVRleHQnIC4gJF8gfSA9ICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRfIH0KICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUZXh0JyAuICRfIC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldEZyZWVEZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwKICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCAlUGFyYW0sIFRpY2tldCA9PiBcJUdldFBhcmFtLCApOwoKICAgICAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgZGVmYXVsdCBzZWxlY3Rpb25zCiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZURlZmF1bHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlRGVmYXVsdHsgJ0FydGljbGVGcmVlS2V5JyAuICRfIH0gPSAkR2V0UGFyYW17ICdBcnRpY2xlRnJlZUtleScgLiAkXyB9CiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdBcnRpY2xlRnJlZUtleScgLiAkXyAuICc6OkRlZmF1bHRTZWxlY3Rpb24nICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVEZWZhdWx0eyAnQXJ0aWNsZUZyZWVUZXh0JyAuICRfIH0gPSAkR2V0UGFyYW17ICdBcnRpY2xlRnJlZVRleHQnIC4gJF8gfQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnQXJ0aWNsZUZyZWVUZXh0JyAuICRfIC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IHsgJUdldFBhcmFtLCAlQXJ0aWNsZUZyZWVEZWZhdWx0LCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHJlZiggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgKSBlcQogICAgICAgICAgICAgICAgJ0hBU0gnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVKb2JzCiAgICAgICAgICAgICAgICAgICAgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0VtYWlsTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoIFF1ZXVlSUQgPT4gMSApLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKCBRdWV1ZUlEID0+IDEgKSwKICAgICAgICAgICAgICAgIFR5cGVzICAgICAgPT4gJFNlbGYtPl9HZXRUeXBlcyggUXVldWVJRCA9PiAxICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgID0+ICRTZWxmLT5fR2V0U2VydmljZXMoIFF1ZXVlSUQgPT4gMSwgKSwKICAgICAgICAgICAgICAgIFNMQXMgICAgICAgPT4gJFNlbGYtPl9HZXRTTEFzKCBRdWV1ZUlEID0+IDEsICVHZXRQYXJhbSApLAogICAgICAgICAgICAgICAgVXNlcnMgICAgICA9PiAkU2VsZi0+X0dldFVzZXJzKCksCiAgICAgICAgICAgICAgICBGcm9tTGlzdCAgID0+ICRTZWxmLT5fR2V0VG9zKCksCiAgICAgICAgICAgICAgICBUbyAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSwKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICksCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJycsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJycsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4ge30sCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYW5kIGFydGljbGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CiAgICAgICAgbXkgJUVycm9yICAgICAgID0gKCk7CiAgICAgICAgbXkgJE5leHRTdGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV4dFN0YXRlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVN0YXRlRGF0YSAgID0gKCk7CiAgICAgICAgaWYgKCROZXh0U3RhdGVJRCkgewogICAgICAgICAgICAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJE5leHRTdGF0ZUlELCApOwogICAgICAgIH0KICAgICAgICBteSAkTmV4dFN0YXRlICAgICAgICA9ICRTdGF0ZURhdGF7TmFtZX07CiAgICAgICAgbXkgJE5ld1Jlc3BvbnNpYmxlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdSZXNwb25zaWJsZUlEJyApIHx8ICcnOwogICAgICAgIG15ICROZXdVc2VySUQgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3VXNlcklEJyApIHx8ICcnOwogICAgICAgIG15ICREZXN0ICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkRnJvbSApID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZW5kZXIgcXVldWUgZnJvbQogICAgICAgIG15ICVRdWV1ZSAgICAgPSAoKTsKICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApOwogICAgICAgICAgICAlUXVldWUgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApOwogICAgICAgIH0KICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgJEdldFBhcmFte0Zyb219ICAgICAgICAgICAgICAgPSAkUXVldWV7RW1haWx9OwogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSAgICAgICAgICAgID0gJE5ld1F1ZXVlSUQ7CiAgICAgICAgJEdldFBhcmFte0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAkRXhwYW5kQ3VzdG9tZXJOYW1lOwoKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ093bmVyQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsZWFyVG8nICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAnJzsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGZvciAoIDEgLi4gMiApIHsKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJFeHBhbmRDdXN0b21lck5hbWUkXyIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICRfID09IDEgJiYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRfID09IDIgJiYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayByZXF1aXJlZCBGcmVlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ317J1RpY2tldEZyZWVUZXh0J317JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICAmJiAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJUaWNrZXRGcmVlVGV4dEZpZWxkJF8gaW52YWxpZCJ9ID0gJ2ludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtLCApOwoKICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHsiQXJ0aWNsZUZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFteyJBdHRhY2htZW50RGVsZXRlJF8ifSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9ICkgewogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICJmaWxlX3VwbG9hZCIsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIEV4cGFuZCBDdXN0b21lciBOYW1lCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAoKTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gKCk7CiAgICAgICAgICAgICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBqdXN0IG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cwogICAgICAgICAgICAjIGlmIGp1c3Qgb25lLCBmaWxsdXAgQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0gPSAwOwogICAgICAgICAgICBmb3IgKCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0rKzsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH0gICAgID0gJEN1c3RvbWVyVXNlckxpc3R7JF99OwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0gPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fTsKICAgICAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kQ3VzdG9tZXJOYW1lIn0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBtb3JlIHRoZSBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMsIHNob3cgbGlzdAogICAgICAgICAgICAjIGFuZCBjbGVhbiBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGRvbid0IGNoZWNrIGVtYWlsIHN5bnRheCBvbiBtdWx0aSBjdXN0b21lciBzZWxlY3QKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KCBLZXkgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLCBWYWx1ZSA9PiAwICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFteyJUb09wdGlvbnMifSA9IFwlQ3VzdG9tZXJVc2VyTGlzdDsKCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRvIGlmIHRoZXJlIGlzIG5vIGN1c3RvbWVyIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7IkV4cGFuZEN1c3RvbWVyTmFtZSJ9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAyICkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyVXNlckxpc3R7JF99OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEVycm9yeyJFeHBhbmRDdXN0b21lck5hbWUifSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhID0gKCk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoJEN1c3RvbWVyVXNlcikgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQ3VzdG9tZXJJRCkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgICAgIGZvciAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoICRHZXRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyIkXyBpbnZhbGlkIn0gLj0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXtUb30gJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSAhPSAxICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydUbyBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSAmJiAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDAgKSB7CiAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdCBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgfQogICAgICAgIGlmICggISROZXdRdWV1ZUlEICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydEZXN0aW5hdGlvbiBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGRhdGUgaXMgdmFsaWQKICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgIDwgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZSBpbnZhbGlkJ30gPSAnaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIG15ICVBcnRpY2xlUGFyYW0gPSAoKTsKICAgICAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgZm9yICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtID0gKAogICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLCAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgJUVycm9yID0gKCAlRXJyb3IsICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2VzCiAgICAgICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSB8fD0gJyc7CiAgICAgICAgICAgIGlmICggISRTZXJ2aWNlcy0+eyAkR2V0UGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoZWFkZXIKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0VtYWlsTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcnMgICA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBVc2VyU2VsZWN0ZWQgICAgID0+ICROZXdVc2VySUQsCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnNTZWxlY3RlZCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSApLAogICAgICAgICAgICAgICAgTmV4dFN0YXRlICAgICAgICAgICAgICAgID0+ICROZXh0U3RhdGUsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICAgICAgUHJpb3JpdGllcyAgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAxICksCiAgICAgICAgICAgICAgICBUeXBlcyAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPl9HZXRUeXBlcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAxICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyA9PiAkU2VsZi0+X0dldFNMQXMoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwgJUdldFBhcmFtICksCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBGcm9tTGlzdCAgICAgPT4gJFNlbGYtPl9HZXRUb3MoKSwKICAgICAgICAgICAgICAgIEZyb21TZWxlY3RlZCA9PiAkRGVzdCwKICAgICAgICAgICAgICAgIFRvT3B0aW9ucyAgICA9PiAkUGFyYW17VG9PcHRpb25zfSwKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte1N1YmplY3R9ICksCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFNpZ25hdHVyZSAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgIG15IEBUaWNrZXRJRHMgPSAoKTsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyICYmICRTZWxmLT57Q29uZmlnfS0+e1Nob3duQ3VzdG9tZXJUaWNrZXRzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBzZWNvbmRhcnkgY3VzdG9tZXIgaWRzCiAgICAgICAgICAgICAgICBteSBAQ3VzdG9tZXJJRHMgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVySURzKCBVc2VyID0+ICRDdXN0b21lclVzZXIgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBvd24gY3VzdG9tZXIgaWQKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCggQEN1c3RvbWVySURzLCAkQ3VzdG9tZXJEYXRhe1VzZXJDdXN0b21lcklEfSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEBDdXN0b21lcklEcykgewogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Nob3duQ3VzdG9tZXJUaWNrZXRzfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVMYXN0Q3VzdG9tZXJBcnRpY2xlKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgYWNsIGFjdGlvbnMKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gJy0nLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJUFjbEFjdGlvbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgdGlja2V0IHRpdGxlCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUaXRsZScpICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIHRpY2tldCBtZW51IG1vZHVsZXMKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJU1lbnVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSB9OwogICAgICAgICAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldCAgID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0wgICAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEFydGljbGV7JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRffSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEFydGljbGV7IkZyZWVUZXh0JF8ifSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7IkZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3TGl0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEFnZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7QWdlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJwogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgdGlja2V0LCBkbyBkYiBpbnNlcnQKICAgICAgICBteSAkVGlja2V0SUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnQ3JpdGljYWxpdHlJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgIENvdW50ZXIgID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgIENvdW50ZXIgID0+IDE0LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGltZQogICAgICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlVGltZTsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdTZWN1bmRlJyB9ID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJVRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdUaWNrZXRGcmVlVGltZScgLiAkXywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoKCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmYgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgbXkgJFRuID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRuLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICAgICAgKTsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gIlxuXG4iIC4gJFNpZ25hdHVyZTsKCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBlbWFpbAogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVTZW5kKAogICAgICAgICAgICBOb0FnZW50Tm90aWZ5ICA9PiAkTm9BZ2VudE5vdGlmeSwKICAgICAgICAgICAgQXR0YWNobWVudCAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgICAgPT4gJ2VtYWlsLWV4dGVybmFsJywKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICA9PiAiJFF1ZXVle1JlYWxOYW1lfSA8JFF1ZXVle0VtYWlsfT4iLAogICAgICAgICAgICBUbyAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9CiAgICAgICAgICAgICAgICB8fCAiXCVcJSRHZXRQYXJhbXtUb30sICRHZXRQYXJhbXtDY30sICRHZXRQYXJhbXtCY2N9IiwKICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICgkQXJ0aWNsZUlEKSB7CgogICAgICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIHNldCBvd25lciAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBlbHNlIHNldCBvd25lciB0byBjdXJyZW50IGFnZW50IGJ1dCBkbyBub3QgbG9jayBpdAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCByZXNwb25zaWJsZSAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgICAgIGlmICgkTmV3UmVzcG9uc2libGVJRCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdWxkIGkgc2V0IGFuIHVubG9jaz8KICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJE5leHRTdGF0ZUlEICk7CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICAgICAgICAgI2dldCB0aGUgdGVtcG9yYXJpbHkgbGlua3MKICAgICAgICAgICAgbXkgJFRlbXBMaW5rTGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICAgICA9PiAnVGVtcG9yYXJ5JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFRlbXBMaW5rTGlzdCAmJiByZWYgJFRlbXBMaW5rTGlzdCBlcSAnSEFTSCcgJiYgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldE9iamVjdE9yZyAoIGtleXMgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHR5cGVsaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFRlbXBMaW5rTGlzdC0+eyRUYXJnZXRPYmplY3RPcmd9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKCBrZXlzICV7JFR5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGlyZWN0aW9uTGlzdCA9ICRUeXBlTGlzdC0+eyRUeXBlfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldEtleU9yZyAoIGtleXMgJXsgJERpcmVjdGlvbkxpc3QtPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdGVtcCBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJFRhcmdldE9iamVjdE9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MiAgICA9PiAkVGFyZ2V0S2V5T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlT2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlS2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0T2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSAgICA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlyZWN0aW9uIGVxICdUYXJnZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlT2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgICAgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwZXJtYW5lbnRseSBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFNvdXJjZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgLS0tCgogICAgICAgICAgICAjIGdldCByZWRpcmVjdCBzY3JlZW4KICAgICAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1VzZXJDcmVhdGVOZXh0TWFza30KICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcmVmZXJlbmNlc0dyb3VwcycpLT57Q3JlYXRlTmV4dE1hc2t9LT57RGF0YVNlbGVjdGVkfQogICAgICAgICAgICAgICAgfHwgJ0FnZW50VGlja2V0RW1haWwnOwoKICAgICAgICAgICAgIyByZWRpcmVjdAogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW4mU3ViYWN0aW9uPUNyZWF0ZWQmVGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICREZXN0ICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKICAgICAgICBteSAkUXVldWVJRCAgICAgID0gJyc7CiAgICAgICAgaWYgKCAkRGVzdCA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAkUXVldWVJRCA9ICQxOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNpZ25hdHVyZSA9ICcnOwogICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPl9HZXRTaWduYXR1cmUoIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKICAgICAgICB9CiAgICAgICAgbXkgJFVzZXJzID0gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUmVzcG9uc2libGVVc2VycyA9ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgMSApOwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKCBRdWV1ZUlEID0+ICRRdWV1ZUlEIHx8IDEgKTsKICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcyggUXVldWVJRCA9PiAkUXVldWVJRCB8fCAxLCAlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgQFRpY2tldEZyZWVUZXh0Q29uZmlnID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0tleSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDb25maWdWYWx1ZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnVmFsdWUpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTaWduYXR1cmUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUmVzcG9uc2libGVVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAojIC0tLQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFN1YmFjdGlvbiEhJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbicsCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXMgPSAoKTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+R2V0U3Vic2NyaWJlZFVzZXJJRHNCeVF1ZXVlSUQoJVBhcmFtKTsKICAgICAgICBmb3IgKCBrZXlzICVBbGxHcm91cHNNZW1iZXJzICkgewogICAgICAgICAgICBteSAkSGl0ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVSUQgKEBVc2VySURzKSB7CiAgICAgICAgICAgICAgICBpZiAoICRVSUQgZXEgJF8gKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzaG93IHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3J3JywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICApOwogICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JF99ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVByaW9yaXRpZXMgPSAoKTsKCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVHlwZSA9ICgpOwoKICAgICMgZ2V0IHR5cGUKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU2VydmljZSA9ICgpOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIGlmICggKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApICYmICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTTEEgPSAoKTsKCiAgICAjIGdldCBzbGEKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zID0gKCk7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+eydUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbid9ICkgewogICAgICAgICVOZXdUb3MgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPnsnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nfSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3MgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgICAgICBUYWJsZSA9PiAnc3lzdGVtX2FkZHJlc3MnLAogICAgICAgICAgICAgICAgV2hhdCAgPT4gJ3F1ZXVlX2lkLCBpZCcsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgQ2xhbXAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBrZXlzICVUb3MgKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTaWduYXR1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICBteSAlUXVldWUgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICAkU2lnbmF0dXJlID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICRTaWduYXR1cmUgPX4gcy88T1RSU19GSVJTVF9OQU1FPi8kU2VsZi0+e1VzZXJGaXJzdG5hbWV9L2c7CiAgICAkU2lnbmF0dXJlID1+IHMvPE9UUlNfTEFTVF9OQU1FPi8kU2VsZi0+e1VzZXJMYXN0bmFtZX0vZzsKCiAgICAjIGN1cnJlbnQgdXNlcgogICAgbXkgJVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkVXNlcktleSAoIGtleXMgJVVzZXIgKSB7CiAgICAgICAgaWYgKCAkVXNlcnskVXNlcktleX0gKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPX4gcy88T1RSU19BZ2VudF8kVXNlcktleT4vJFVzZXJ7JFVzZXJLZXl9L2dpOwogICAgICAgICAgICAkU2lnbmF0dXJlID1+IHMvPE9UUlNfQ1VSUkVOVF8kVXNlcktleT4vJFVzZXJ7JFVzZXJLZXl9L2dpOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlcGxhY2Ugb3RoZXIgbmVlZGVkIHN0dWZmCiAgICAkU2lnbmF0dXJlID1+IHMvPE9UUlNfRklSU1RfTkFNRT4vJFNlbGYtPntVc2VyRmlyc3RuYW1lfS9nOwogICAgJFNpZ25hdHVyZSA9fiBzLzxPVFJTX0xBU1RfTkFNRT4vJFNlbGYtPntVc2VyTGFzdG5hbWV9L2c7CgogICAgIyBjbGVhbnVwCiAgICAkU2lnbmF0dXJlID1+IHMvPE9UUlNfQWdlbnRfLis/Pi8tL2dpOwogICAgJFNpZ25hdHVyZSA9fiBzLzxPVFJTX0NVUlJFTlRfLis/Pi8tL2dpOwoKICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgJFNpZ25hdHVyZSA9fiBzezxPVFJTX0NPTkZJR18oLis/KT59eyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCQxKX1lZ3g7CiAgICAkU2lnbmF0dXJlID1+IHMvPE9UUlNfQ09ORklHXy4rPz4vLS9naTsKICAgIHJldHVybiAkU2lnbmF0dXJlOwp9CgpzdWIgX01hc2tFbWFpbE5ldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtGb3JtSUR9ID0gJFNlbGYtPntGb3JtSUR9OwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgIyBidWlsZCBzdHJpbmcKICAgICRQYXJhbXtVc2Vyc30tPnsnJ30gPSAnLSc7CiAgICAkUGFyYW17J09wdGlvblN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17VXNlcnN9LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1VzZXJTZWxlY3RlZH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICk7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICRQYXJhbXsnTmV4dFN0YXRlc1N0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgRGF0YSAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgU2VsZWN0ZWQgPT4gJFBhcmFte05leHRTdGF0ZX0gfHwgJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSwKICAgICk7CgogICAgIyBidWlsZCBmcm9tIHN0cmluZwogICAgaWYgKCAkUGFyYW17VG9PcHRpb25zfSAmJiAleyAkUGFyYW17VG9PcHRpb25zfSB9ICkgewogICAgICAgICRQYXJhbXsnQ3VzdG9tZXJVc2VyU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17VG9PcHRpb25zfSwKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgTWF4ICA9PiA3MCwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgdG8gc3RyaW5nCiAgICBteSAlTmV3VG8gPSAoKTsKICAgIGlmICggJFBhcmFte0Zyb21MaXN0fSApIHsKICAgICAgICBmb3IgKCBrZXlzICV7ICRQYXJhbXtGcm9tTGlzdH0gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkX3x8JFBhcmFte0Zyb21MaXN0fS0+eyRffSJ9ID0gJFBhcmFte0Zyb21MaXN0fS0+eyRffTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICRQYXJhbXsnRnJvbVN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIE11bHRpcGxlICAgICAgID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdTaWduYXR1cmUnLAogICAgICAgICAgICAgICAgICAgICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ093bmVyQWxsJywKICAgICAgICAgICAgICAgICAgICAnUmVzcG9uc2libGVBbGwnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17J0Zyb21TdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtGcm9tU2VsZWN0ZWR9LAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnU2lnbmF0dXJlJywKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3VzdG9tZXIgaW5mbyBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgIE1heCAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2VNYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJyogJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRffSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkUGFyYW17J1R5cGVTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1R5cGVzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ093bmVyQWxsJywKICAgICAgICAgICAgICAgICAgICAnUmVzcG9uc2libGVBbGwnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHNlcnZpY2Ugc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAkUGFyYW17J1NlcnZpY2VTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgJFBhcmFteydTTEFTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdEZXN0JywKICAgICAgICAgICAgICAgICAgICAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ093bmVyQWxsJywKICAgICAgICAgICAgICAgICAgICAnUmVzcG9uc2libGVBbGwnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIGNyZWF0ZSBpbXBhY3Qgc3RyaW5nCiAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgIE9uQ2hhbmdlICAgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgQWpheCAgICAgICA9PiB7CiAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICB9LAogICAgKTsKICAgIGlmICggJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAkUGFyYW17UHJpb3JpdHlJRH0gPSAkUGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgfQojIC0tLQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fTsKICAgIH0KICAgICRQYXJhbXsnUHJpb3JpdHlTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1ByaW9yaXRpZXN9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgIFNlbGVjdGVkICAgPT4gJFBhcmFte1ByaW9yaXR5fSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJVBhcmFtLAogICAgICAgIEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICApOwoKICAgICMgZnJvbSB1cGRhdGUKICAgIGlmICggISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRnJvbVVwZGF0ZVN1Ym1pdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBvd25lciBzZWxlY3Rpb24KICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld093bmVyU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPd25lclNlbGVjdGlvbkFsbEpTJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb25BbGxTdWJtaXQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHJlc3BvbnNpYmxlIHNlbGVjdGlvbgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UmVzcG9uc2libGVTZWxlY3Rpb24nKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30tPnsnJ30gPSAnLSc7CiAgICAgICAgJFBhcmFteydSZXNwb25zaWJsZU9wdGlvblN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzU2VsZWN0ZWR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb25BbGxKUycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uQWxsU3VibWl0JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnVGlja2V0RnJlZVRleHQnfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J1RpY2tldEZyZWVUaW1lJ30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50LCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0FydGljbGVGcmVlVGV4dCd9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50LCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTcGVsbENoZWNrZXInKQogICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWRkcmVzcyBib29rCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWRkcmVzc0Jvb2snLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBmb3IgbXkgJERhdGFSZWYgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRleHQgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gIlRpY2tldEZyZWVUZXh0JEtleSIsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAiVGlja2V0RnJlZUtleSRLZXkiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0aW1lIGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lQ2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUNoZWNrID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5IC4gJ1VzZWQnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lRmllbGQgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXksCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRLZXkgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRFbWFpbCcsIERhdGEgPT4gXCVQYXJhbSApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RnJlZVRleHQucG0gLSBmcmVlIHRleHQgZm9yIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5wbSx2IDEuMSAyMDA4LzA3LzAyIDE2OjI4OjI3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldEZyZWVUZXh0LnBtLHYgMS4zOCAyMDA4LzA3LzAyIDEzOjM5OjA1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZyZWVUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKICAgIG15IEBJbmZvcm1Vc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CiAgICAkU2VsZi0+e0luZm9ybVVzZXJJRH0gPSBcQEluZm9ybVVzZXJJRDsKICAgIG15IEBJbnZvbHZlZFVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwogICAgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gPSBcQEludm9sdmVkVXNlcklEOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBUaWNrZXRJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBGUkVFVElNRU5VTUJFUjoKICAgIGZvciBteSAkRnJlZVRpbWVOdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY3JlYXRlIGZyZWV0aW1lIHByZWZpeAogICAgICAgIG15ICRGcmVlVGltZVByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkRnJlZVRpbWVOdW1iZXI7CgogICAgICAgICMgZ2V0IGZvcm0gcGFyYW1zCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYWRkaXRpb25hbCBwYXJhbXMKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSA9ICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gfHwgMDsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJEZyZWVUaW1lTnVtYmVyICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMDsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgICAgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgdGltZWRhdGEKICAgICAgICBteSAkVGltZURhdGFDb21wbGV0ZSA9IDE7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiBkZWZpbmVkICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKCiAgICAgICAgICAgICRUaW1lRGF0YUNvbXBsZXRlID0gMDsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUiBpZiAkVGltZURhdGFDb21wbGV0ZTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgZGVsZXRlICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yICggMSAuLiAzICkgewogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZVRleHQkXyIgKTsKICAgIH0KCiAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgbXkgJFNpemUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJykgfHwgNzA7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKF4+Lit8Lns0LCRTaXplfSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFteyRffSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGF0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJTdWJqZWN0IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJCb2R5IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2UgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17IkF0dGFjaG1lbnREZWxldGUkXyJ9ICkgewogICAgICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJF8sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzCiAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kIn0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtUaXRsZX0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NlcnZpY2VJRH0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NMQUlEfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICRHZXRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgID0+ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiIsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAidGV4dC9wbGFpbjsgY2hhcnNldD0kU2VsZi0+e0xheW91dE9iamVjdH0tPnsnVXNlckNoYXJzZXQnfSIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEID0+CiAgICAgICAgICAgICAgICAgICAgWyBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSwgXSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgICAgIGZvciBteSAkUmVmIChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRSZWZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9ICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2UKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKTsKICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgdmFycwogICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXtCb2R5fSApICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFte1N1YmplY3R9ICkgJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sICVUaWNrZXQsICVUaWNrZXRGcmVlVGV4dEhUTUwsICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgyKSIsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok5ldyd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSB8fCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSApIHsKICAgICAgICBteSAlU3RhdGUgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkU3RhdGVMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBpZiAoJF8pIHsKICAgICAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvcGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1NwZWxsQ2hlY2tlcicpCiAgICAgICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkRGF0YVJlZiAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGUgPSAoKTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBteSAlRGVmYXVsdE5vdGVUeXBlcyA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gfTsKICAgICAgICBteSAlTm90ZVR5cGVzICAgICAgICA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgIFRhYmxlID0+ICdhcnRpY2xlX3R5cGUnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBXaGF0ICA9PiAnaWQsIG5hbWUnCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRffSB9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVJRCcsCiAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J1RpY2tldEZyZWVUaW1lJ30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAiVGlja2V0RnJlZVRleHQkS2V5IiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICJUaWNrZXRGcmVlS2V5JEtleSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRpbWUgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lQ2hlY2sgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXkgLiAnVXNlZCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVGaWVsZCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJEtleSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEZyZWVUZXh0JywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Tm90ZS5wbSAtIHRvIGFkZCBub3RlcyB0byBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXROb3RlLnBtLHYgMS4zIDIwMDgvMDcvMDIgMTM6NDM6NTEgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0Tm90ZS5wbSx2IDEuNTAgMjAwOC8wNy8wMiAxMzozOTowNSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXROb3RlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKICAgIG15IEBJbmZvcm1Vc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CiAgICAkU2VsZi0+e0luZm9ybVVzZXJJRH0gPSBcQEluZm9ybVVzZXJJRDsKICAgIG15IEBJbnZvbHZlZFVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwogICAgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gPSBcQEludm9sdmVkVXNlcklEOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBUaWNrZXRJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBGUkVFVElNRU5VTUJFUjoKICAgIGZvciBteSAkRnJlZVRpbWVOdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY3JlYXRlIGZyZWV0aW1lIHByZWZpeAogICAgICAgIG15ICRGcmVlVGltZVByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkRnJlZVRpbWVOdW1iZXI7CgogICAgICAgICMgZ2V0IGZvcm0gcGFyYW1zCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYWRkaXRpb25hbCBwYXJhbXMKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSA9ICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gfHwgMDsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJEZyZWVUaW1lTnVtYmVyICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMDsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgICAgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgdGltZWRhdGEKICAgICAgICBteSAkVGltZURhdGFDb21wbGV0ZSA9IDE7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiBkZWZpbmVkICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKCiAgICAgICAgICAgICRUaW1lRGF0YUNvbXBsZXRlID0gMDsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUiBpZiAkVGltZURhdGFDb21wbGV0ZTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgZGVsZXRlICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yICggMSAuLiAzICkgewogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZVRleHQkXyIgKTsKICAgIH0KCiAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgbXkgJFNpemUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJykgfHwgNzA7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKF4+Lit8Lns0LCRTaXplfSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFteyRffSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGF0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJTdWJqZWN0IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJCb2R5IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2UgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17IkF0dGFjaG1lbnREZWxldGUkXyJ9ICkgewogICAgICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJF8sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzCiAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kIn0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtUaXRsZX0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NlcnZpY2VJRH0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NMQUlEfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICRHZXRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgID0+ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiIsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAidGV4dC9wbGFpbjsgY2hhcnNldD0kU2VsZi0+e0xheW91dE9iamVjdH0tPnsnVXNlckNoYXJzZXQnfSIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEID0+CiAgICAgICAgICAgICAgICAgICAgWyBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSwgXSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgICAgIGZvciBteSAkUmVmIChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRSZWZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9ICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2UKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKTsKICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgdmFycwogICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXtCb2R5fSApICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFte1N1YmplY3R9ICkgJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sICVUaWNrZXQsICVUaWNrZXRGcmVlVGV4dEhUTUwsICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgyKSIsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok5ldyd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSB8fCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSApIHsKICAgICAgICBteSAlU3RhdGUgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkU3RhdGVMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBpZiAoJF8pIHsKICAgICAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvcGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1NwZWxsQ2hlY2tlcicpCiAgICAgICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkRGF0YVJlZiAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGUgPSAoKTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBteSAlRGVmYXVsdE5vdGVUeXBlcyA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gfTsKICAgICAgICBteSAlTm90ZVR5cGVzICAgICAgICA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgIFRhYmxlID0+ICdhcnRpY2xlX3R5cGUnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBXaGF0ICA9PiAnaWQsIG5hbWUnCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRffSB9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVJRCcsCiAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J1RpY2tldEZyZWVUaW1lJ30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAiVGlja2V0RnJlZVRleHQkS2V5IiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICJUaWNrZXRGcmVlS2V5JEtleSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRpbWUgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lQ2hlY2sgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXkgLiAnVXNlZCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVGaWVsZCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJEtleSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE5vdGUnLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0T3duZXIucG0gLSBzZXQgdGlja2V0IG93bmVyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldE93bmVyLnBtLHYgMS4xIDIwMDgvMDcvMDIgMTY6Mjg6MjcgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0T3duZXIucG0sdiAxLjQzIDIwMDgvMDcvMDIgMTM6Mzk6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0T3duZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkIFRpY2tldElEIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSBvd25lciB0byBkbyB0aGlzIGFjdGlvbiEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBmb3IgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBOZXdPd25lcklEIE5ld093bmVyVHlwZSBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZAogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQKICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgIEF0dGFjaG1lbnREZWxldGU1IEF0dGFjaG1lbnREZWxldGU2IEF0dGFjaG1lbnREZWxldGU3IEF0dGFjaG1lbnREZWxldGU4CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTkgQXR0YWNobWVudERlbGV0ZTEwIEF0dGFjaG1lbnREZWxldGUxMSBBdHRhY2htZW50RGVsZXRlMTIKICAgICAgICBBdHRhY2htZW50RGVsZXRlMTMgQXR0YWNobWVudERlbGV0ZTE0IEF0dGFjaG1lbnREZWxldGUxNSBBdHRhY2htZW50RGVsZXRlMTYKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dDE0Iik7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlByaW9yaXR5UkMiKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkVsZW1lbnRDaGFuZ2VkIikgfHwgJyc7CgogICAgIyBzZXQgUHJpb3JpdHlSQyBmcm9tIGNoYW5nZWQgYWpheCBlbGVtZW50CiAgICBpZiAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyApCiAgICAgICAgfHwgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnICkgJiYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICApICkKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgaWYgKCFkZWZpbmVkKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSAmJiAkVGlja2V0e1NlcnZpY2VJRH0pIHsKICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgIH0KCiAgICAjIHNldCBpbXBhY3QgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fTsKICAgIH0KCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtJbXBhY3RJRH0pIHsKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIEZSRUVUSU1FTlVNQkVSOgogICAgZm9yIG15ICRGcmVlVGltZU51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgIyBjcmVhdGUgZnJlZXRpbWUgcHJlZml4CiAgICAgICAgbXkgJEZyZWVUaW1lUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRGcmVlVGltZU51bWJlcjsKCiAgICAgICAgIyBnZXQgZm9ybSBwYXJhbXMKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGcmVlVGltZVByZWZpeCAuICRUeXBlICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhZGRpdGlvbmFsIHBhcmFtcwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ID0gJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkRnJlZVRpbWVOdW1iZXIgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAwOwogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSB0aW1lZGF0YQogICAgICAgIG15ICRUaW1lRGF0YUNvbXBsZXRlID0gMTsKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIGRlZmluZWQgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwoKICAgICAgICAgICAgJFRpbWVEYXRhQ29tcGxldGUgPSAwOwogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSIGlmICRUaW1lRGF0YUNvbXBsZXRlOwoKICAgICAgICBpZiAoICEkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZXRpbWUgZGF0YSBmcm9tIHRpY2tldAogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZVN0cmluZwogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRUaWNrZXRGcmVlVGltZVN0cmluZyApOwoKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01pbnV0ZScgfSA9ICRNaW51dGU7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnSG91cicgfSAgID0gJEhvdXI7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnWWVhcicgfSAgID0gJFllYXI7CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZUtleSRfIiApOwogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICBteSAkU2l6ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSB8fCA3MDsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oXj4uK3wuezQsJFNpemV9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yID0gKCk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9ICk7CgogICAgICAgICAgICAjIGNoZWNrIHN0YXRlIHR5cGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBkYXRlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlN1YmplY3QgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYm9keQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IkJvZHkgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskX30gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJUaWNrZXRGcmVlVGV4dEZpZWxkJF8gaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMKICAgICAgICAgICAgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9yeyJFeHBhbmQifSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1RpdGxlfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUaXRsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17U2VydmljZUlEfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlU2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17U0xBSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQVNldCgKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte09sZE93bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbm90ZQogICAgICAgIG15ICRBcnRpY2xlSUQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgPT4gIiRTZWxmLT57VXNlckZpcnN0bmFtZX0gJFNlbGYtPntVc2VyTGFzdG5hbWV9IDwkU2VsZi0+e1VzZXJFbWFpbH0+IiwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L3BsYWluOyBjaGFyc2V0PSRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eydVc2VyQ2hhcnNldCd9IiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4KICAgICAgICAgICAgICAgICAgICBbIEB7ICRTZWxmLT57SW5mb3JtVXNlcklEfSB9LCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9LCBdLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSA9PiAwLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgIG15IEBBdHRhY2htZW50RGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICAgICAgZm9yIG15ICRSZWYgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICV7JFJlZn0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGV4dAogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICgoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0pIHx8ICEkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBLZXkgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDb3VudGVyID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEtleSA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkR2V0UGFyYW17SW1wYWN0SUR9IHx8ICcnLAogICAgICAgICAgICBDb3VudGVyID0+IDE0LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVRpbWU7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnU2VjdW5kZScgfSA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdVc2VkJyB9ICkgewogICAgICAgICAgICAgICAgICAgICVUaW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sIFByZWZpeCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJF8KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwcmlvcml0eQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSAmJiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdW5sb2NrIHRoZSB0aWNrZXQgYWZ0ZXIgY2xvc2UKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSApOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSZBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CgogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2UgewoKICAgICAgICAjIGZpbGx1cCB2YXJzCiAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFte0JvZHl9ICkgJiYgJFNlbGYtPntDb25maWd9LT57Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApOwogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17U3ViamVjdH0gKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICApOwoKICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICVHZXRQYXJhbSwgJVRpY2tldCwgJVRpY2tldEZyZWVUZXh0SFRNTCwgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICBJbXBhY3RJRCA9PiAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9LAogICAgICAgICAgICBOZXdQcmlvcml0eUlEID0+ICRUaWNrZXR7UHJpb3JpdHlJRH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZSA9ICggJycsICctJyApOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgT25DaGFuZ2UgPT4KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IG9sZCBvd25lcgogICAgICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRQYXJhbXtPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDApIiwKICAgICAgICApOwogICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgIGlmIChAT2xkVXNlckluZm8pIHsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBPbGRVc2VySW5mbyApIHsKICAgICAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgICAgIGlmICggISRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggISVVc2VySGFzaCApIHsKICAgICAgICAgICAgJFVzZXJIYXNoeycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgbXkgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICcnOwogICAgICAgIGlmICggJFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJFBhcmFte09sZE93bmVySUR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9IC4gJzEnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzdHJpbmcKICAgICAgICAkUGFyYW17T2xkT3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkT2xkT3duZXJTZWxlY3RlZElELAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdPbGRPd25lcklEJywKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDIpIiwKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte05ld093bmVyVHlwZX0gJiYgJFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpPbGQnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6TmV3J30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lckpzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZXNwb25zaWJsZQogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9IHx8ICRUaWNrZXR7UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgIG15ICVTdGF0ZSAgICAgPSAoKTsKICAgICAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRTdGF0ZUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3U3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgICRQYXJhbXtTdGF0ZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yICggc29ydCBrZXlzICVTdGF0ZUxpc3QgKSB7CiAgICAgICAgICAgIGlmICgkXykgewogICAgICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZVBlbmRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgICAgICRQYXJhbXsnSW1wYWN0U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBhY3QnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgJVByaW9yaXR5LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZUpzJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SW52b2x2ZWRBZ2VudHMoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgICAgICBteSAkQ291bnRlciAgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIGlmICggISRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3BlbGxDaGVja2VyJykKICAgICAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICREYXRhUmVmICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBBcnRpY2xlVHlwZUlEIHN0cmluZwogICAgICAgIG15ICVBcnRpY2xlVHlwZSA9ICgpOwogICAgICAgIGlmICggISRQYXJhbXtBcnRpY2xlVHlwZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17QXJ0aWNsZVR5cGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwb3NzaWJsZSBub3RlcwogICAgICAgIG15ICVEZWZhdWx0Tm90ZVR5cGVzID0gJXsgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgIG15ICVOb3RlVHlwZXMgICAgICAgID0gJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgVGFibGUgPT4gJ2FydGljbGVfdHlwZScsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFdoYXQgID0+ICdpZCwgbmFtZScKICAgICAgICApOwogICAgICAgIGZvciAoIGtleXMgJU5vdGVUeXBlcyApIHsKICAgICAgICAgICAgaWYgKCAhJERlZmF1bHROb3RlVHlwZXN7ICROb3RlVHlwZXN7JF99IH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJE5vdGVUeXBlc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlTm90ZVR5cGVzLAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUlEJywKICAgICAgICAgICAgJUFydGljbGVUeXBlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnVGlja2V0RnJlZVRpbWUnfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICJUaWNrZXRGcmVlVGV4dCRLZXkiLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gIlRpY2tldEZyZWVLZXkkS2V5IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGltZSBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZUNoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVDaGVjayA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSAuICdVc2VkJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUZpZWxkID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkS2V5ICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3duZXInLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGVuZGluZy5wbSAtIHNldCB0aWNrZXQgdG8gcGVuZGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQZW5kaW5nLnBtLHYgMS4xIDIwMDgvMDcvMDIgMTY6Mjg6MjcgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UGVuZGluZy5wbSx2IDEuNDggMjAwOC8wNy8wMiAxMzozOTowNSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQZW5kaW5nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKICAgIG15IEBJbmZvcm1Vc2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CiAgICAkU2VsZi0+e0luZm9ybVVzZXJJRH0gPSBcQEluZm9ybVVzZXJJRDsKICAgIG15IEBJbnZvbHZlZFVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwogICAgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gPSBcQEludm9sdmVkVXNlcklEOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTmVlZCBUaWNrZXRJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e051bWJlcn0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIEFydGljbGVUeXBlSUQgVGl0bGUgQm9keSBTdWJqZWN0CiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdPd25lclR5cGUgT2xkT3duZXJJRCBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGlja2V0RnJlZVRleHQxNCIpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJQcmlvcml0eVJDIik7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFbGVtZW50Q2hhbmdlZCIpIHx8ICcnOwoKICAgICMgc2V0IFByaW9yaXR5UkMgZnJvbSBjaGFuZ2VkIGFqYXggZWxlbWVudAogICAgaWYgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgKQogICAgICAgIHx8ICggKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JyApICYmICggJEdldFBhcmFte0ltcGFjdElEfSAgKSApCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICghZGVmaW5lZCgkR2V0UGFyYW17U2VydmljZUlEfSkgJiYgJFRpY2tldHtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAkVGlja2V0e1NlcnZpY2VJRH07CiAgICB9CgogICAgIyBzZXQgaW1wYWN0IGZyb20gdGlja2V0CiAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSA9ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH07CiAgICB9CgogICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgKTsKCiAgICBteSAlU2VydmljZTsKICAgIGlmICgkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17SW1wYWN0SUR9KSB7CiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBGUkVFVElNRU5VTUJFUjoKICAgIGZvciBteSAkRnJlZVRpbWVOdW1iZXIgKCAxIC4uIDYgKSB7CgogICAgICAgICMgY3JlYXRlIGZyZWV0aW1lIHByZWZpeAogICAgICAgIG15ICRGcmVlVGltZVByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkRnJlZVRpbWVOdW1iZXI7CgogICAgICAgICMgZ2V0IGZvcm0gcGFyYW1zCiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICRUeXBlIH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYWRkaXRpb25hbCBwYXJhbXMKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSA9ICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gfHwgMDsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJEZyZWVUaW1lTnVtYmVyICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMDsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgICAgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgdGltZWRhdGEKICAgICAgICBteSAkVGltZURhdGFDb21wbGV0ZSA9IDE7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiBkZWZpbmVkICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKCiAgICAgICAgICAgICRUaW1lRGF0YUNvbXBsZXRlID0gMDsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUiBpZiAkVGltZURhdGFDb21wbGV0ZTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChxdyhVc2VkIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlKSkgewogICAgICAgICAgICAgICAgZGVsZXRlICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWV0aW1lIGRhdGEgZnJvbSB0aWNrZXQKICAgICAgICBteSAkVGlja2V0RnJlZVRpbWVTdHJpbmcKICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaWNrZXR7JEZyZWVUaW1lUHJlZml4fSApOwogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIgKQogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSggU3lzdGVtVGltZSA9PiAkVGlja2V0RnJlZVRpbWVTdHJpbmcgKTsKCiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNaW51dGUnIH0gPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgfQoKICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yICggMSAuLiAzICkgewogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZVRleHQkXyIgKTsKICAgIH0KCiAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgbXkgJFNpemUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJykgfHwgNzA7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKF4+Lit8Lns0LCRTaXplfSkoPzpcc3xceikvJDFcbi9nbTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvciA9ICgpOwoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgdGltZQogICAgICAgIGlmICggJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBteSAlU3RhdGVEYXRhCiAgICAgICAgICAgICAgICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciAocXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFteyRffSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZGF0ZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJTdWJqZWN0IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJCb2R5IGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JF99ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICcqIGludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2UgaW52YWxpZCd9ID0gJyogaW52YWxpZCc7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17IkF0dGFjaG1lbnREZWxldGUkXyJ9ICkgewogICAgICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJF8sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXR0YWNobWVudFVwbG9hZH0gKSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzCiAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kIn0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dCA9ICgpOwogICAgICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRXJyb3IsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXtUaXRsZX0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NlcnZpY2VJRH0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1NMQUlEfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICRHZXRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm9BZ2VudE5vdGlmeX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgID0+ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiIsCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAidGV4dC9wbGFpbjsgY2hhcnNldD0kU2VsZi0+e0xheW91dE9iamVjdH0tPnsnVXNlckNoYXJzZXQnfSIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEID0+CiAgICAgICAgICAgICAgICAgICAgWyBAeyAkU2VsZi0+e0luZm9ybVVzZXJJRH0gfSwgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSwgXSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgICAgIGZvciBteSAkUmVmIChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRSZWZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiVGlja2V0RnJlZUtleSRfIn0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yICggMSAuLiA2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVUaW1lOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdZZWFyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0RheScgfSAgICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdIb3VyJyB9ICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1NlY3VuZGUnIH0gPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnVXNlZCcgfSApIHsKICAgICAgICAgICAgICAgICAgICAlVGltZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLCBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRfCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpbWUsCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9ICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2UKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKTsKICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mQXJ0aWNsZUlEPSRBcnRpY2xlSUQiCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwoKICAgICAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNlIHsKCiAgICAgICAgIyBmaWxsdXAgdmFycwogICAgICAgIGlmICggIWRlZmluZWQoICRHZXRQYXJhbXtCb2R5fSApICYmICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFte1N1YmplY3R9ICkgJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dCA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSggVGlja2V0ID0+IFwlR2V0UGFyYW0gKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyJBcnRpY2xlRnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAlR2V0UGFyYW0sICVUaWNrZXQsICVUaWNrZXRGcmVlVGV4dEhUTUwsICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSwKICAgICAgICAgICAgTmV3UHJpb3JpdHlJRCA9PiAkVGlja2V0e1ByaW9yaXR5SUR9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJVNlcnZpY2UgPSAoICcnLCAnLScgKTsKICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgIE9uQ2hhbmdlID0+CiMgICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQSA9ICgpOwogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgIE9uQ2hhbmdlID0+CiAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldElEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgwKSIsCiAgICAgICAgKTsKICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIE9uQ2xpY2sgICAgPT4gImNoYW5nZV9zZWxlY3RlZCgyKSIsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFteydOZXdPd25lclR5cGU6Ok5ldyd9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSB8fCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSApIHsKICAgICAgICBteSAlU3RhdGUgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkU3RhdGVMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWR9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBpZiAoJF8pIHsKICAgICAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvcGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERpZmZUaW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgY3JlYXRlIGltcGFjdCBzdHJpbmcKICAgICAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wYWN0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiMgLS0tCiAgICAgICAgbXkgJVByaW9yaXR5OwogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGVKcycsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgbXkgJVNob3duVXNlcnMgICAgICAgPSAoKTsKICAgICAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRffSA9ICRBbGxHcm91cHNNZW1iZXJzeyRffTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0luZm9ybVVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaW52b2x2ZWQKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICBteSBAVXNlcklEcyAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkludm9sdmVkQWdlbnRzKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICBteSAlVXNlckhhc2ggPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIgID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAVXNlcklEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoICEkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbnZvbHZlZEFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1NwZWxsQ2hlY2tlcicpCiAgICAgICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NwZWxsQ2hlY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkRGF0YVJlZiAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGUgPSAoKTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZURlZmF1bHR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFBhcmFte0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcG9zc2libGUgbm90ZXMKICAgICAgICBteSAlRGVmYXVsdE5vdGVUeXBlcyA9ICV7ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlc30gfTsKICAgICAgICBteSAlTm90ZVR5cGVzICAgICAgICA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgIFRhYmxlID0+ICdhcnRpY2xlX3R5cGUnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBXaGF0ICA9PiAnaWQsIG5hbWUnCiAgICAgICAgKTsKICAgICAgICBmb3IgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRffSB9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVJRCcsCiAgICAgICAgICAgICVBcnRpY2xlVHlwZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J1RpY2tldEZyZWVUaW1lJ30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAiVGlja2V0RnJlZVRleHQkS2V5IiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICJUaWNrZXRGcmVlS2V5JEtleSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRpbWUgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lQ2hlY2sgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXkgLiAnVXNlZCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVGaWVsZCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJEtleSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFBlbmRpbmcnLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGhvbmUucG0gLSB0byBoYW5kbGUgcGhvbmUgY2FsbHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0UGhvbmUucG0sdiAxLjYgMjAwOC8wNy8wNyAyMzo0MTo0NSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRQaG9uZS5wbSx2IDEuNzggMjAwOC8wNy8wMiAxMDoxMToyMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQaG9uZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIE1haWw6OkFkZHJlc3M7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBmb3IgKAogICAgICAgIHF3KEF0dGFjaG1lbnRVcGxvYWQgQXJ0aWNsZUlEIExpbmtUaWNrZXRJRCBQcmlvcml0eUlEIE5ld1VzZXJJRAogICAgICAgIEZyb20gU3ViamVjdCBCb2R5IE5leHRTdGF0ZUlEIFRpbWVVbml0cwogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlCiAgICAgICAgTmV3UmVzcG9uc2libGVJRCBSZXNwb25zaWJsZUFsbCBPd25lckFsbCBUeXBlSUQgU2VydmljZUlEIFNMQUlECiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMCBBdHRhY2htZW50RGVsZXRlMTEgQXR0YWNobWVudERlbGV0ZTEyCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEzIEF0dGFjaG1lbnREZWxldGUxNCBBdHRhY2htZW50RGVsZXRlMTUgQXR0YWNobWVudERlbGV0ZTE2CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1RpY2tldEZyZWVUZXh0MTQnKTsKICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJykgfHwgJyc7CgogICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgIGlmICggICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnCiAgICAgICAgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnVGlja2V0RnJlZVRleHQxNCcKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgbXkgJVNlcnZpY2U7CiAgICBteSAkSW1wYWN0TGlzdCA9IHt9OwogICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CiAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0ltcGFjdElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICREZWZhdWx0U2VsZWN0aW9uID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldEZyZWVUZXh0MTQ6OkRlZmF1bHRTZWxlY3Rpb24nKTsKCiAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0IGlkCiAgICAgICAgICAgIG15ICVJbXBhY3RMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJXskSW1wYWN0TGlzdH07CiAgICAgICAgICAgICRHZXRQYXJhbXtJbXBhY3RJRH0gICA9ICRJbXBhY3RMaXN0UmV2ZXJzZXskRGVmYXVsdFNlbGVjdGlvbn07CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gKSB7CgogICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5SUQgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICBJbXBhY3RJRCAgICAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgIlRpY2tldEZyZWVUaW1lIiAuICRfIC4gJFR5cGUgfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICJUaWNrZXRGcmVlVGltZSIgLiAkXyAuICRUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdPcHRpb25hbCcgfQogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkXyApIHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRfICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlS2V5JF8iICk7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9CiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aWNrZXQgaWQhCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAgICAgIyBub3RpZnkgaW5mbwogICAgICAgICAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICdUaWNrZXQgIiVzIiBjcmVhdGVkISIsICInIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgTGluayA9PiAnJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JyAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRQaG9uZS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3BsaXQgYXJ0aWNsZSBpZiBnaXZlbgogICAgICAgICMgZ2V0IEFydGljbGVJRAogICAgICAgIG15ICVBcnRpY2xlICAgICAgPSAoKTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhID0gKCk7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSApOwogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xle1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmaWxsIGZyZWUgdGV4dCBmaWVsZHMKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0gPSAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSA9ICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZmlsbCBmcmVlIHRpbWUgZmllbGRzCiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgLiAnVXNlZCcgfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkKICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ1llYXInIH0gICA9ICRZZWFyOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ0RheScgfSAgICA9ICREYXk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ0hvdXInIH0gICA9ICRIb3VyOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCAuICdNaW51dGUnIH0gPSAkTWluOwoKICAgICAgICAgICAgICAgICAgICAjIGRvIGFnZW50IHRpbWUgem9uZSB0cmFuc2xhdGlvbgogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBhdHRhY2htZW50cwogICAgICAgICAgICBteSAlQXJ0aWNsZUluZGV4ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIGtleXMgJUFydGljbGVJbmRleCApIHsKICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEICAgID0+ICRJbmRleCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgb3JpZ2luYWwgY29udGVudCBpc24ndCB0ZXh0L3BsYWluIG9yIHRleHQvaHRtbCwgZG9uJ3QgdXNlIGl0CiAgICAgICAgICAgIGlmICggJEFydGljbGV7J0NvbnRlbnRUeXBlJ30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xleydDb250ZW50VHlwZSd9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPX4gcy9cPC4rP1w+Ly9nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEFydGljbGV7J0NvbnRlbnRUeXBlJ30gIX4gL3RleHRcL3BsYWluL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAnLT4gbm8gcXVvdGFibGUgbWVzc2FnZSA8LSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRBcnRpY2xle0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZXtGcm9tfSA9ICRDdXN0b21lclVzZXJMaXN0eyRffTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVEZWZhdWx0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFRpY2tldEZyZWVEZWZhdWx0eyAnVGlja2V0RnJlZUtleScgLiAkXyB9ID0gJEdldFBhcmFteyAnVGlja2V0RnJlZUtleScgLiAkXyB9CiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVLZXknIC4gJF8gLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICAkVGlja2V0RnJlZURlZmF1bHR7ICdUaWNrZXRGcmVlVGV4dCcgLiAkXyB9ID0gJEdldFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJF8gfQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGV4dCcgLiAkXyAuICc6OkRlZmF1bHRTZWxlY3Rpb24nICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZVRleHQkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlRGVmYXVsdCwKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZnJlZSB0aW1lCiAgICAgICAgbXkgJVRpY2tldEZyZWVUaW1lSFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlRGF0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBkZWZhdWx0IHNlbGVjdGlvbnMKICAgICAgICBteSAlQXJ0aWNsZUZyZWVEZWZhdWx0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAkQXJ0aWNsZUZyZWVEZWZhdWx0eyAnQXJ0aWNsZUZyZWVLZXknIC4gJF8gfSA9ICRHZXRQYXJhbXsgJ0FydGljbGVGcmVlS2V5JyAuICRfIH0KICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnQXJ0aWNsZUZyZWVLZXknIC4gJF8gLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVEZWZhdWx0eyAnQXJ0aWNsZUZyZWVUZXh0JyAuICRfIH0gPSAkR2V0UGFyYW17ICdBcnRpY2xlRnJlZVRleHQnIC4gJF8gfQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdBcnRpY2xlRnJlZVRleHQnIC4gJF8gLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgIH0KCiAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IHsgJUdldFBhcmFtLCAlQXJ0aWNsZUZyZWVEZWZhdWx0LCB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMKICAgICAgICAgICAgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxICksCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBJbXBhY3RzICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgUHJpb3JpdGllcyA9PiAkU2VsZi0+X0dldFByaW9yaXRpZXMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxICksCiAgICAgICAgICAgIFR5cGVzICAgICAgPT4gJFNlbGYtPl9HZXRUeXBlcyggUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEgKSwKICAgICAgICAgICAgU2VydmljZXMgICA9PiAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgU0xBcyA9PiAkU2VsZi0+X0dldFNMQXMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxLCAlR2V0UGFyYW0gKSwKICAgICAgICAgICAgVXNlcnMgICAgICAgICAgICA9PiAkU2VsZi0+X0dldFVzZXJzKCBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gKSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFVzZXJzKCBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gKSwKICAgICAgICAgICAgVG8gPT4gJFNlbGYtPl9HZXRUb3MoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSApLAogICAgICAgICAgICBGcm9tICAgID0+ICRBcnRpY2xle0Zyb219LAogICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xle1N1YmplY3R9CiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSwKICAgICAgICAgICAgQm9keSA9PiAkQXJ0aWNsZXtCb2R5fQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9ICksCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQXJ0aWNsZXtDdXN0b21lcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgTGlua1RpY2tldElEID0+ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9IHx8ICcnLAoKICAgICAgICAgICAgIyAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKICAgICAgICBteSAlRXJyb3IgICAgID0gKCk7CiAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICgpOwogICAgICAgIGlmICggJEdldFBhcmFte05leHRTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkTmV4dFN0YXRlID0gJFN0YXRlRGF0YXtOYW1lfSB8fCAnJzsKICAgICAgICBteSAkRGVzdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgKCAkTmV3UXVldWVJRCwgJFRvICkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdFeHBhbmRDdXN0b21lck5hbWUnICkKICAgICAgICAgICAgfHwgMDsKCiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPd25lckFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtPd25lckFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXNwb25zaWJsZUFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhckZyb20nICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICcnOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgZm9yICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkV4cGFuZEN1c3RvbWVyTmFtZSRfIiApIHx8IDA7CiAgICAgICAgICAgIGlmICggJF8gPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJF8gPT0gMiAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0KICAgICAgICAgICAgICAgID1+IHMvKF4+Lit8Lns0LCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKX0pKD86XHN8XHopLyQxXG4vZ207CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHBlbmRpbmcgZGF0ZQogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICdpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJEYXRlIGludmFsaWQifSA9ICdpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFteyJBdHRhY2htZW50RGVsZXRlJF8ifSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9ICkgewogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICJmaWxlX3VwbG9hZCIsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmcmVlIHRleHQgY29uZmlnIG9wdGlvbnMKICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVLZXkkXyJ9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIlRpY2tldEZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfXsnVGlja2V0RnJlZVRleHQnfS0+eyRffSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSBlcSAnJwogICAgICAgICAgICAgICAgJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAwCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsiVGlja2V0RnJlZVRleHRGaWVsZCRfIGludmFsaWQifSA9ICdpbnZhbGlkJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSwgKTsKCiAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZXhwYW5kIGN1c3RvbWVyIG5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICgpOwogICAgICAgIGlmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAxICkgewoKICAgICAgICAgICAgIyBzZWFyY2ggY3VzdG9tZXIKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAoKTsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID0gMDsKICAgICAgICAgICAgZm9yICgga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9Kys7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9ICAgICA9ICRDdXN0b21lclVzZXJMaXN0eyRffTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fTsKICAgICAgICAgICAgICAgICRFcnJvcnsiRXhwYW5kQ3VzdG9tZXJOYW1lIn0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBtb3JlIHRoZSBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMsIHNob3cgbGlzdAogICAgICAgICAgICAjIGFuZCBjbGVhbiBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIGRvbid0IGNoZWNrIGVtYWlsIHN5bnRheCBvbiBtdWx0aSBjdXN0b21lciBzZWxlY3QKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KCBLZXkgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLCBWYWx1ZSA9PiAwICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwogICAgICAgICAgICAgICAgJFBhcmFteyJGcm9tT3B0aW9ucyJ9ID0gXCVDdXN0b21lclVzZXJMaXN0OwoKICAgICAgICAgICAgICAgICMgY2xlYXIgZnJvbSBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7IkV4cGFuZEN1c3RvbWVyTmFtZSJ9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAyICkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkQ3VzdG9tZXJVc2VyTGlzdHskX307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyAnanVzdCcgbm8gc3VibWl0CiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDQgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhID0gKCk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFte0Zyb219ICkgKSB7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgJEVycm9yeydGcm9tIGludmFsaWQnfSAuPSAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICEkR2V0UGFyYW17RnJvbX0gJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSAhPSAxICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydGcm9tIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICYmICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMCApIHsKICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0IGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAwICkgewogICAgICAgICAgICAkRXJyb3J7J0Rlc3RpbmF0aW9uIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlIGludmFsaWQnfSA9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyBnZXQgc2VydmljZXMKICAgICAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8PSAnJzsKICAgICAgICAgICAgaWYgKCAhJFNlcnZpY2VzLT57ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhlYWRlcgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICMgaHRtbCBvdXRwdXQKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tQaG9uZU5ldygKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJzID0+CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9HZXRVc2VycyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCwgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSApLAogICAgICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VyU2VsZWN0ZWQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgTmV4dFN0YXRlcyAgICAgICAgICAgICAgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEgKSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZSAgICAgICAgICAgICAgID0+ICROZXh0U3RhdGUsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgSW1wYWN0cyAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICAgICAgUHJpb3JpdGllcyAgICAgICAgICAgICAgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEgKSwKICAgICAgICAgICAgICAgIFR5cGVzICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0VHlwZXMoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSApLAogICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyA9PiAkU2VsZi0+X0dldFNMQXMoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwgJUdldFBhcmFtICksCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBGcm9tT3B0aW9ucyAgPT4gJFBhcmFte0Zyb21PcHRpb25zfSwKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICA9PiAkU2VsZi0+X0dldFRvcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApLAogICAgICAgICAgICAgICAgVG9TZWxlY3RlZCAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgY3VzdG9tZXIgdGlja2V0cwogICAgICAgICAgICBteSBAVGlja2V0SURzID0gKCk7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlciAmJiAkU2VsZi0+e0NvbmZpZ30tPntTaG93bkN1c3RvbWVyVGlja2V0c30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgc2Vjb25kYXJ5IGN1c3RvbWVyIGlkcwogICAgICAgICAgICAgICAgbXkgQEN1c3RvbWVySURzID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lcklEcygKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IG93biBjdXN0b21lciBpZAogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKCBAQ3VzdG9tZXJJRHMsICRDdXN0b21lckRhdGF7VXNlckN1c3RvbWVySUR9ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKEBDdXN0b21lcklEcykgewogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Nob3duQ3VzdG9tZXJUaWNrZXRzfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewogICAgICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVMYXN0Q3VzdG9tZXJBcnRpY2xlKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgYWNsIGFjdGlvbnMKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gJy0nLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJUFjbEFjdGlvbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgdGlja2V0IHRpdGxlCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUaXRsZScpICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIHRpY2tldCBtZW51IG1vZHVsZXMKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJU1lbnVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSB9OwogICAgICAgICAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENvdW50ZXIgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXQgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNMICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xleyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXskX30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xleyJGcmVlVGV4dCRfIn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJEFydGljbGV7IkZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFF1ZXVlVGlja2V0Vmlld0xpdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoIEFnZSA9PiAkQXJ0aWNsZXtBZ2V9LCBTcGFjZSA9PiAnICcgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFNMQUlEICAgICAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVyTm8gICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAxNCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGltZQogICAgICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSApCiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlVGltZTsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnWWVhcicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01vbnRoJyB9ICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdEYXknIH0gICAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnSG91cicgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ01pbnV0ZScgfSAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdTZWN1bmRlJyB9ID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJVRpbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdUaWNrZXRGcmVlVGltZScgLiAkXywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBvd25lciBpcyBnaXZlbiAodGhlbiBzZW5kIG5vIGFnZW50IG5vdGlmeSkKICAgICAgICBteSAkTm9BZ2VudE5vdGlmeSA9IDA7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3VXNlcklEfSApIHsKICAgICAgICAgICAgJE5vQWdlbnROb3RpZnkgPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBOb0FnZW50Tm90aWZ5ICAgID0+ICROb0FnZW50Tm90aWZ5LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57U2VuZGVyVHlwZX0sCiAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlICAgICAgPT4gInRleHQvcGxhaW47IGNoYXJzZXQ9JFNlbGYtPntMYXlvdXRPYmplY3R9LT57J1VzZXJDaGFyc2V0J30iLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgICAgIE9yaWdIZWFkZXIgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIEZyb20gICAgPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBzZXQgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17IkFydGljbGVGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdVc2VySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGVsc2Ugc2V0IG93bmVyIHRvIGN1cnJlbnQgYWdlbnQgYnV0IGRvIG5vdCBsb2NrIGl0CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgU2VuZE5vTm90aWZpY2F0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFJlZiAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJXskUmVmfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIGxpbmsgdGlja2V0cwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TGlua1RpY2tldElEfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U3BsaXRMaW5rVHlwZX0KICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9CiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgPSAkR2V0UGFyYW17TGlua1RpY2tldElEfTsKICAgICAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBsaW5rIHRoZSB0aWNrZXRzCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3VsZCBpIHNldCBhbiB1bmxvY2s/CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gKTsKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgICAgICAgICAjZ2V0IHRoZSB0ZW1wb3JhcmlseSBsaW5rcwogICAgICAgICAgICBteSAkVGVtcExpbmtMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3QoCiAgICAgICAgICAgICAgICBPYmplY3QgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgU3RhdGUgICAgID0+ICdUZW1wb3JhcnknLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkVGVtcExpbmtMaXN0ICYmIHJlZiAkVGVtcExpbmtMaXN0IGVxICdIQVNIJyAmJiAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0T3JnICgga2V5cyAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdHlwZWxpc3QKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZUxpc3QgPSAkVGVtcExpbmtMaXN0LT57JFRhcmdldE9iamVjdE9yZ307CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0S2V5T3JnICgga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAkVGFyZ2V0T2JqZWN0T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRUYXJnZXRLZXlPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0S2V5ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSAgICA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldE9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBlcm1hbmVudGx5IGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkU291cmNlT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyAtLS0KCiAgICAgICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgICAgICBteSAkTmV4dFNjcmVlbiA9ICRTZWxmLT57VXNlckNyZWF0ZU5leHRNYXNrfQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1ByZWZlcmVuY2VzR3JvdXBzJyktPntDcmVhdGVOZXh0TWFza30tPntEYXRhU2VsZWN0ZWR9CiAgICAgICAgICAgICAgICB8fCAnQWdlbnRUaWNrZXRQaG9uZSc7CgogICAgICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbiZTdWJhY3Rpb249Q3JlYXRlZCZUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJERlc3QgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApOwogICAgICAgIG15ICRRdWV1ZUlEICAgICAgPSAnJzsKICAgICAgICBpZiAoICREZXN0ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJDE7CiAgICAgICAgfQogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKCBRdWV1ZUlEID0+ICRRdWV1ZUlEIHx8IDEgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcyggUXVldWVJRCA9PiAkUXVldWVJRCB8fCAxICk7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgMSwgJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15IEBUaWNrZXRGcmVlVGV4dENvbmZpZyA9ICgpOwogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRDb25maWdLZXkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZUtleSRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnS2V5KSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkQ29uZmlnVmFsdWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiVGlja2V0RnJlZVRleHQkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ1ZhbHVlKSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ1ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUmVzcG9uc2libGVVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAojIC0tLQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFN1YmFjdGlvbiEhJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbicsCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXMgPSAoKTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+R2V0U3Vic2NyaWJlZFVzZXJJRHNCeVF1ZXVlSUQoJVBhcmFtKTsKICAgICAgICBmb3IgKCBrZXlzICVBbGxHcm91cHNNZW1iZXJzICkgewogICAgICAgICAgICBteSAkSGl0ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRVSUQgKEBVc2VySURzKSB7CiAgICAgICAgICAgICAgICBpZiAoICRVSUQgZXEgJF8gKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgIH0KCiAgICAjIHNob3cgYWxsIHVzZXJzIHdobyBhcmUgcncgaW4gdGhlIHF1ZXVlIGdyb3VwCiAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAncncnLAogICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICk7CiAgICAgICAgZm9yICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skX30gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlUHJpb3JpdGllcyA9ICgpOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUeXBlID0gKCk7CgogICAgIyBnZXQgdHlwZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2aWNlID0gKCk7CgogICAgIyBnZXQgc2VydmljZQogICAgaWYgKCAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgJiYgJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVNMQSA9ICgpOwoKICAgICMgZ2V0IHNsYQogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3MgPSAoKTsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT57J1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJ30gKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+eydUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbid9IH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvcyA9ICgpOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVUb3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgICAgIFRhYmxlID0+ICdzeXN0ZW1fYWRkcmVzcycsCiAgICAgICAgICAgICAgICBXaGF0ICA9PiAncXVldWVfaWQsIGlkJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICBDbGFtcCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIGZvciBteSAkUXVldWVJRCAoIGtleXMgJVRvcyApIHsKICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICMgcGVybWlzc2lvbiBjaGVjaywgY2FuIHdlIGNyZWF0ZSBuZXcgdGlja2V0cyBpbiBxdWV1ZQogICAgICAgICAgICBuZXh0IGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblN0cmluZycpCiAgICAgICAgICAgICAgICB8fCAnPFJlYWxuYW1lPiA8PEVtYWlsPj4gLSBRdWV1ZTogPFF1ZXVlPic7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWU+LyRRdWV1ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZUNvbW1lbnQ+LyRRdWV1ZURhdGF7Q29tbWVudH0vZzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgbmUgJ1F1ZXVlJyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVTeXN0ZW1BZGRyZXNzRGF0YSA9ICRTZWxmLT57U3lzdGVtQWRkcmVzc30tPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwogICAgcmV0dXJuIFwlTmV3VG9zOwp9CgpzdWIgX01hc2tQaG9uZU5ldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtGb3JtSUR9ID0gJFNlbGYtPntGb3JtSUR9OwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgIyBidWlsZCBzdHJpbmcKICAgICRQYXJhbXsnT3B0aW9uU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1VzZXJzfSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1VzZXJTZWxlY3RlZH0sCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgJFBhcmFteydOZXh0U3RhdGVzU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte05leHRTdGF0ZX0gfHwgJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSwKICAgICk7CgogICAgIyBidWlsZCBmcm9tIHN0cmluZwogICAgaWYgKCAkUGFyYW17RnJvbU9wdGlvbnN9ICYmICV7ICRQYXJhbXtGcm9tT3B0aW9uc30gfSApIHsKICAgICAgICAkUGFyYW17J0N1c3RvbWVyVXNlclN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRQYXJhbXtGcm9tT3B0aW9uc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdDdXN0b21lclVzZXInLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICA9PiA3MCwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc28gc3RyaW5nCiAgICBteSAlTmV3VG8gPSAoKTsKICAgIGlmICggJFBhcmFte1RvfSApIHsKICAgICAgICBmb3IgKCBrZXlzICV7ICRQYXJhbXtUb30gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkX3x8JFBhcmFte1RvfS0+eyRffSJ9ID0gJFBhcmFte1RvfS0+eyRffTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICRQYXJhbXsnVG9TdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRQYXJhbXtUb1NlbGVjdGVkfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnT3duZXJBbGwnLAogICAgICAgICAgICAgICAgICAgICdSZXNwb25zaWJsZUFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXsnVG9TdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtUb1NlbGVjdGVkfSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnT3duZXJBbGwnLAogICAgICAgICAgICAgICAgICAgICdSZXNwb25zaWJsZUFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtDdXN0b21lckRhdGF9LAogICAgICAgICAgICBNYXggID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciAoIGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICcqICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskX30gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0eXBlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFteydUeXBlU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtUeXBlc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBzZXJ2aWNlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgJFBhcmFteydTZXJ2aWNlU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTZXJ2aWNlc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmRDdXN0b21lck5hbWUudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQogICAgICAgICAgICBBamF4ID0+IHsKICAgICAgICAgICAgICAgIFVwZGF0ZSA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIERlcGVuZCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnT3duZXJBbGwnLAogICAgICAgICAgICAgICAgICAgICdSZXNwb25zaWJsZUFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXsnU0xBU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTTEFzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICBPbkNoYW5nZSA9PgogICAgICAgICAgICAgICAgImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdPd25lckFsbCcsCiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNpYmxlQWxsJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdBSkFYVXBkYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICBPbkNoYW5nZSAgID0+ICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUHJpb3JpdHlSQy52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgIEFqYXggICAgICAgPT4gewogICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5SUR9ID0gJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgIH0KIyAtLS0KCiAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgaWYgKCAhJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eX0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17J1ByaW9yaXR5U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtQcmlvcml0aWVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBTZWxlY3RlZElEICAgID0+ICRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtQcmlvcml0eX0sCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgKTsKCiAgICAjIHBlbmRpbmcgZGF0YSBzdHJpbmcKICAgICRQYXJhbXtQZW5kaW5nRGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBEaWZmVGltZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICk7CgogICAgIyB0byB1cGRhdGUKICAgIGlmICggISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9VcGRhdGVTdWJtaXQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdPd25lclNlbGVjdGlvbicpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb25BbGxKUycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uQWxsU3VibWl0JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyByZXNwb25zaWJsZSBzZWxlY3Rpb24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgJiYKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UmVzcG9uc2libGVTZWxlY3Rpb24nKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17J1Jlc3BvbnNpYmxlT3B0aW9uU3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb25BbGxKUycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uQWxsU3VibWl0JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnVGlja2V0RnJlZVRleHQnfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J1RpY2tldEZyZWVUaW1lJ30tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50LCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57J0FydGljbGVGcmVlVGV4dCd9LT57JENvdW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50LCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNKcycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTcGVsbENoZWNrZXInKQogICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIGZvciBteSAkRGF0YVJlZiAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICApOwogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGV4dCBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dENoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAiVGlja2V0RnJlZVRleHQkS2V5IiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICJUaWNrZXRGcmVlS2V5JEtleSIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGphdmEgc2NyaXB0IGNoZWNrIGZvciByZXF1aXJlZCBmcmVlIHRpbWUgZmllbGRzIGJ5IGZvcm0gc3VibWl0CiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9IH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskS2V5fSA9PSAyICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVDaGVja0pzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lQ2hlY2sgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRLZXkgLiAnVXNlZCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVGaWVsZCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJEtleSApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFBob25lJywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGFnZW50IGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQcmludC5wbSx2IDEuMSAyMDA4LzA3LzAyIDE4OjU5OjA3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW50LnBtLHYgMS41NiAyMDA4LzA2LzI0IDA4OjA0OjAxIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UERGT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQREYtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwogICAgbXkgJFF1ZXVlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFF1ZXVlSUQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICBteSAkQXJ0aWNsZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSB8fCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICkgaWYgISRBY2Nlc3M7CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdHlwZSBsaXN0CiAgICBteSAlTGlua1R5cGVMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+VHlwZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpbmsgZGF0YQogICAgbXkgJUxpbmtEYXRhOwogICAgaWYgKCAkTGlua0xpc3RXaXRoRGF0YSAmJiByZWYgJExpbmtMaXN0V2l0aERhdGEgZXEgJ0hBU0gnICYmICV7JExpbmtMaXN0V2l0aERhdGF9ICkgewogICAgICAgICVMaW5rRGF0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICdTaW1wbGVSYXcnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29udGVudAogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBsb29rdXAgY3JpdGljYWxpdHkKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJy0nOwogICAgaWYgKCRUaWNrZXR7VGlja2V0RnJlZVRleHQxM30pIHsKICAgICAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICAgICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxM319OwogICAgfQogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkVGlja2V0e0ltcGFjdH0gPSAnLSc7CiAgICBpZiAoJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSkgewogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtJbXBhY3R9ID0gJEltcGFjdExpc3QtPnskVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9fTsKICAgIH0KIyAtLS0KICAgIG15IEBBcnRpY2xlQm94ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgaWYgb25seSBvbmUgYXJ0aWNsZSBuZWVkIHByaW50ZWQKICAgIGlmICgkQXJ0aWNsZUlEKSB7CiAgICAgICAgbXkgQE5ld0FydGljbGVCb3g7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlLT57QXJ0aWNsZUlEfSA9PSAkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgQE5ld0FydGljbGVCb3ggPSAoJEFydGljbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChATmV3QXJ0aWNsZUJveCkgewogICAgICAgICAgICBAQXJ0aWNsZUJveCA9IEBOZXdBcnRpY2xlQm94OwogICAgICAgIH0KICAgIH0KCiAgICAkVGlja2V0e1RpY2tldFRpbWVVbml0c30gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICApOwoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VyICAgPT4gJFRpY2tldHtPd25lcn0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgICMgcmVzcG9uc2libGUgaW5mbwogICAgbXkgJVJlc3BvbnNpYmxlSW5mbzsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkVGlja2V0e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAlUmVzcG9uc2libGVJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXIgICA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlfSwKICAgICAgICAgICAgQ2FjaGVkID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIG15ICVDdXN0b21lckRhdGE7CiAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFRpY2tldHtDdXN0b21lcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBDdXN0b21lcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHNvbWUgaHRtbCBxdW90aW5nCiAgICAkVGlja2V0e0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgIEFnZSAgID0+ICRUaWNrZXR7QWdlfSwKICAgICAgICBTcGFjZSA9PiAnICcsCiAgICApOwoKICAgIGlmICggJFRpY2tldHtVbnRpbFRpbWV9ICkgewogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7VW50aWxUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gPSAnLSc7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBwZGYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKICAgICAgICBteSAkUHJpbnRlZEJ5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3ByaW50ZWQgYnknKTsKICAgICAgICBteSAkVGltZSAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICckRW52eyJUaW1lIn0nICk7CiAgICAgICAgbXkgJFVybCAgICAgICA9ICcgJzsKICAgICAgICBpZiAoICRFTlZ7UkVRVUVTVF9VUkl9ICkgewogICAgICAgICAgICAkVXJsID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpCiAgICAgICAgICAgICAgICAuICRFTlZ7UkVRVUVTVF9VUkl9OwogICAgICAgIH0KICAgICAgICBteSAlUGFnZTsKCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgbXkgJEhlYWRlclJpZ2h0ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKICAgICAgICBteSAkSGVhZGxpbmVMZWZ0ID0gJEhlYWRlclJpZ2h0OwogICAgICAgIG15ICRUaXRsZSAgICAgICAgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgaWYgKCAkVGlja2V0e1RpdGxlfSApIHsKICAgICAgICAgICAgJEhlYWRsaW5lTGVmdCA9ICRUaWNrZXR7VGl0bGV9OwogICAgICAgICAgICAkVGl0bGUgLj0gJyAvICcgLiAkVGlja2V0e1RpdGxlfTsKICAgICAgICB9CgogICAgICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luQm90dG9tfSA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJEhlYWRlclJpZ2h0OwogICAgICAgICRQYWdle0hlYWRsaW5lTGVmdH0gPSAkSGVhZGxpbmVMZWZ0OwogICAgICAgICRQYWdle0hlYWRsaW5lUmlnaHR9CiAgICAgICAgICAgID0gJFByaW50ZWRCeSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gLiAnICgnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRW1haWx9IC4gJykgJwogICAgICAgICAgICAuICRUaW1lOwogICAgICAgICRQYWdle0Zvb3RlckxlZnR9ID0gJFVybDsKICAgICAgICAkUGFnZXtQYWdlVGV4dH0gICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQYWdlJyk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSAgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE5ldygKICAgICAgICAgICAgVGl0bGUgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFRpdGxlLAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRJbmZvcygKICAgICAgICAgICAgUGFnZURhdGEgICAgICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSAgICAgID0+IFwlVGlja2V0LAogICAgICAgICAgICBVc2VyRGF0YSAgICAgICAgPT4gXCVVc2VySW5mbywKICAgICAgICAgICAgUmVzcG9uc2libGVEYXRhID0+IFwlUmVzcG9uc2libGVJbmZvLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGV4dCBmaWVsZHMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldEZyZWVUZXh0KAogICAgICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aWNrZXQgZnJlZXRpbWUgZmllbGRzCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRGcmVlVGltZSgKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlua2VkIG9iamVjdHMKICAgICAgICBpZiAoJUxpbmtEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0TGlua2VkT2JqZWN0cygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBMaW5rRGF0YSAgICAgPT4gXCVMaW5rRGF0YSwKICAgICAgICAgICAgICAgIExpbmtUeXBlTGlzdCA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGN1c3RvbWVyIGluZm9zCiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRDdXN0b21lckluZm9zKAogICAgICAgICAgICAgICAgUGFnZURhdGEgICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGFydGljbGVzCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRBcnRpY2xlcygKICAgICAgICAgICAgUGFnZURhdGEgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBBcnRpY2xlRGF0YSA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gdGhlIHBkZiBkb2N1bWVudAogICAgICAgIG15ICRGaWxlbmFtZSA9ICd0aWNrZXRfJyAuICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKICAgICAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKICAgICAgICAkTSA9IHNwcmludGYoICIlMDJkIiwgJE0gKTsKICAgICAgICAkRCA9IHNwcmludGYoICIlMDJkIiwgJEQgKTsKICAgICAgICAkaCA9IHNwcmludGYoICIlMDJkIiwgJGggKTsKICAgICAgICAkbSA9IHNwcmludGYoICIlMDJkIiwgJG0gKTsKICAgICAgICBteSAkUERGU3RyaW5nID0gJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE91dHB1dCgpOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSAuICJfIiAuICIkWS0kTS0kRCIgLiAiXyIgLiAiJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3BkZiIsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRQREZTdHJpbmcsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgaHRtbCBvdXRwdXQKICAgIGVsc2UgewoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRIZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwoKICAgICAgICBpZiAoJUxpbmtEYXRhKSB7CgogICAgICAgICAgICAjIG91dHB1dCBsaW5rIGRhdGEKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAlTGlua0RhdGEgKSB7CgogICAgICAgICAgICAgICAgIyBpbnZlc3RpZ2F0ZSBsaW5rIHR5cGUgbmFtZQogICAgICAgICAgICAgICAgbXkgQExpbmtEYXRhID0gc3BsaXQgcXs6On0sICRMaW5rVHlwZUxpbmtEaXJlY3Rpb247CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayB0eXBlIGRhdGEKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBMaW5rVHlwZU5hbWUgPT4gJExpbmtUeXBlTGlzdHsgJExpbmtEYXRhWzBdIH0tPnsgJExpbmtEYXRhWzFdIC4gJ05hbWUnIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IG9iamVjdCBsaXN0CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRMaW5rRGF0YXskTGlua1R5cGVMaW5rRGlyZWN0aW9ufTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkT2JqZWN0TGlzdC0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHR5cGUgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1R5cGVSb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1N0cmcgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgY3VzdG9tZXIgaW5mb3MKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgTWF4ICA9PiAxMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgdGlja2V0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0hUTUxNYXNrKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQXJ0aWNsZUJveCAgICAgID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICAgICAgUmVzcG9uc2libGVEYXRhID0+IFwlUmVzcG9uc2libGVJbmZvLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVVc2VySW5mbywKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKCiAgICAgICAgIyByZXR1cm4gb3V0cHV0CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0SW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhIFVzZXJEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCAgID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlVXNlckluZm8gPSAleyAkUGFyYW17VXNlckRhdGF9IH07CiAgICBteSAlUGFnZSAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgIyBjcmVhdGUgbGVmdCB0YWJsZQogICAgbXkgJFRhYmxlTGVmdCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTdGF0ZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFRpY2tldHtTdGF0ZX0gKSwKICAgICAgICB9LAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgewojICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ByaW9yaXR5JykgLiAnOicsCiMgICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFRpY2tldHtQcmlvcml0eX0gKSwKIyAgICAgICAgfSwKIyAtLS0KICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdRdWV1ZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1F1ZXVlfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xvY2snKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRUaWNrZXR7TG9ja30gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0N1c3RvbWVySUQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtDdXN0b21lcklEfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ093bmVyJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7T3duZXJ9IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkVXNlckluZm97VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFVzZXJJbmZve1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgcmVzcG9uaWJsZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewogICAgICAgIG15ICRSZXNwb25zaWJsZSA9ICctJzsKICAgICAgICBpZiAoICRUaWNrZXR7UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICAkUmVzcG9uc2libGUKICAgICAgICAgICAgICAgID0gJFRpY2tldHtSZXNwb25zaWJsZX0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtSZXNwb25zaWJsZURhdGF9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyTGFzdG5hbWV9IC4gJyknOwogICAgICAgIH0KICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUmVzcG9uc2libGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3BvbnNpYmxlLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHR5cGUgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VHlwZX0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgc2VydmljZSBhbmQgc2xhIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICBteSAkUm93U2VydmljZSA9IHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgICAgICBteSAkUm93U0xBID0gewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NMQScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1NMQX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NMQSApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15ICRUYWJsZUxlZnRFeHRlbmRlZCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFRpY2tldHtDcml0aWNhbGl0eX0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0ltcGFjdCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVGlja2V0e0ltcGFjdH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ByaW9yaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRUaWNrZXR7UHJpb3JpdHl9KSwKICAgICAgICB9LAogICAgXTsKICAgIHB1c2goQHskVGFibGVMZWZ0fSwgQHskVGFibGVMZWZ0RXh0ZW5kZWR9KTsKIyAtLS0KCiAgICAjIGNyZWF0ZSByaWdodCB0YWJsZQogICAgbXkgJFRhYmxlUmlnaHQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQWdlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e0FnZX0gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBY2NvdW50ZWQgdGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldFRpbWVVbml0c30sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQZW5kaW5nIHRpbGwnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtQZW5kaW5nVW50aWx9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIGZpcnN0IHJlc3BvbnNlIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWV9ICkgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0ZpcnN0IFJlc3BvbnNlIFRpbWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHVwZGF0ZSB0aW1lIHJvdwogICAgaWYgKCBkZWZpbmVkKCAkVGlja2V0e1VwZGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1VwZGF0ZSBUaW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lU2hvcnR7IiRRRGF0YXsiVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHNvbHV0aW9uIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7U29sdXRpb25UaW1lfSApICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTb2x1dGlvbiBUaW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgKSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CgogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNBQUFBQUEnOwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yT2RkfSAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0TGlua2VkT2JqZWN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIExpbmtEYXRhIExpbmtUeXBlTGlzdCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlUGFnZSAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVHlwZUxpc3QgPSAleyAkUGFyYW17TGlua1R5cGVMaXN0fSB9OwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7ICRQYXJhbXtMaW5rRGF0YX0gfSApIHsKCiAgICAgICAgIyBpbnZlc3RpZ2F0ZSBsaW5rIHR5cGUgbmFtZQogICAgICAgIG15IEBMaW5rRGF0YSA9IHNwbGl0IHF7Ojp9LCAkTGlua1R5cGVMaW5rRGlyZWN0aW9uOwogICAgICAgIG15ICRMaW5rVHlwZU5hbWUgPSAkVHlwZUxpc3R7ICRMaW5rRGF0YVswXSB9LT57ICRMaW5rRGF0YVsxXSAuICdOYW1lJyB9OwogICAgICAgICRMaW5rVHlwZU5hbWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkTGlua1R5cGVOYW1lKTsKCiAgICAgICAgIyBkZWZpbmUgaGVhZGxpbmUKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkTGlua1R5cGVOYW1lIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAnJzsKCiAgICAgICAgIyBleHRyYWN0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkUGFyYW17TGlua0RhdGF9LT57JExpbmtUeXBlTGlua0RpcmVjdGlvbn07CgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkT2JqZWN0TGlzdC0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9IHx8PSAnJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRJdGVtLT57VGl0bGV9IHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRpbnVlIHsKICAgICAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xpbmtlZCBPYmplY3RzJyksCiAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICApOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIHRhYmxlIHBhcmFtcwogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldEZyZWVUZXh0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgPSAwOwogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgZ2VuZXJhdGUgdGFibGUKICAgIGZvciAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIGFuZCAxNAogICAgICAgIGlmICgkXyBlcSAxMyB8fCAkXyBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRUaWNrZXR7IlRpY2tldEZyZWVUZXh0JF8ifSBuZSAiIiApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZUtleSRfIn0gLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZVRleHQkXyJ9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIG91dHB1dCB0aWNrZXQgZnJlZXRleHQKICAgIGlmICgkT3V0cHV0KSB7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RpY2tldEZyZWVUZXh0JyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldEZyZWVUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgPSAwOwogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgZ2VuZXJhdGUgdGFibGUKICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRUaWNrZXR7IlRpY2tldEZyZWVUaW1lJF8ifSApIHsKICAgICAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lS2V5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkXyApIHx8ICcnOwogICAgICAgICAgICBteSAkVGlja2V0RnJlZVRpbWUgPSAkVGlja2V0eyJUaWNrZXRGcmVlVGltZSRfIn07CgogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkVGlja2V0RnJlZVRpbWVLZXkgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUaWNrZXRGcmVlVGltZSA9PiAkVGlja2V0RnJlZVRpbWUsIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGltZQogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0RnJlZVRpbWUnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0Q3VzdG9tZXJJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIEN1c3RvbWVyRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgICAgICAgPSAwOwogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICV7ICRQYXJhbXtDdXN0b21lckRhdGF9IH07CiAgICBteSAlUGFnZSAgICAgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKICAgIG15ICRNYXAgPSAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntNYXB9OwoKICAgICMgY2hlY2sgaWYgY3VzdG9tZXIgY29tcGFueSBzdXBwb3J0IGlzIGVuYWJsZWQKICAgIGlmICggJEN1c3RvbWVyRGF0YXtDb25maWd9LT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0gKSB7CiAgICAgICAgbXkgJE1hcDIgPSAkQ3VzdG9tZXJEYXRhe0NvbXBhbnlDb25maWd9LT57TWFwfTsKICAgICAgICBpZiAoJE1hcDIpIHsKICAgICAgICAgICAgcHVzaCggQHskTWFwfSwgQHskTWFwMn0gKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJEZpZWxkICggQHskTWFwfSApIHsKICAgICAgICBpZiAoICR7JEZpZWxkfVszXSAmJiAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfSApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkeyRGaWVsZH1bMV0gKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfTsKCiAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgJE91dHB1dCA9IDE7CiAgICAgICAgfQogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXIgSW5mb3MnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXJ0aWNsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBBcnRpY2xlRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVQYWdlID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICRGaXJzdEFydGljbGUgPSAxOwogICAgZm9yIG15ICRBcnRpY2xlVG1wICggQHsgJFBhcmFte0FydGljbGVEYXRhfSB9ICkgewogICAgICAgIGlmICgkRmlyc3RBcnRpY2xlKSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FydGljbGVzJyksCiAgICAgICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaXJzdEFydGljbGUgPSAwOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNtZW50IHN0cmluZwogICAgICAgIG15ICVBdG1JbmRleCA9ICgpOwogICAgICAgIGlmICggJEFydGljbGV7QXRtc30gKSB7CiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQogICAgICAgIG15ICRBdHRhY2htZW50czsKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkQXR0YWNobWVudHMgLj0gJEZpbGV7RmlsZW5hbWV9IC4gJyAoJyAuICRGaWxle0ZpbGVzaXplfSAuICIpXG4iOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBhcnRpY2xlIGluZm8gdGFibGUKICAgICAgICBteSAlVGFibGVQYXJhbTE7CiAgICAgICAgbXkgJFJvdyA9IDA7CiAgICAgICAgZm9yIChxdyhGcm9tIFRvIENjIFN1YmplY3QpKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7JF99ICkgewogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJF8pIC4gJzonOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXskX307CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifScsCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICApOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2J5Jyk7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAuPSAnICcgLiAkQXJ0aWNsZXtTZW5kZXJUeXBlfTsKICAgICAgICAkUm93Kys7CiAgICAgICAgZm9yICggMSAuLiAzICkgewoKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkXyJ9IC4gJzonOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifTsKICAgICAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7QXJ0aWNsZVR5cGV9OwogICAgICAgICRSb3crKzsKCiAgICAgICAgaWYgKCRBdHRhY2htZW50cykgewogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50JykgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgIGNob21wKCRBdHRhY2htZW50cyk7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXR0YWNobWVudHM7CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBpbmZvcykKICAgICAgICAkVGFibGVQYXJhbTF7VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFtMXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTF7Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGluZm9zKQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgYm9keSkKICAgICAgICBteSAlVGFibGVQYXJhbTI7CiAgICAgICAgJFRhYmxlUGFyYW0ye0NlbGxEYXRhfVswXVswXXtDb250ZW50fSA9ICRBcnRpY2xle0JvZHl9IHx8ICcgJzsKICAgICAgICAkVGFibGVQYXJhbTJ7VHlwZX0gICAgICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JvcmRlcn0gICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnR9ICAgICAgICAgICAgICAgICAgICA9ICdNb25vc3BhY2VkJzsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udFNpemV9ICAgICAgICAgICAgICAgID0gNzsKICAgICAgICAkVGFibGVQYXJhbTJ7QmFja2dyb3VuZENvbG9yfSAgICAgICAgID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nfSAgICAgICAgICAgICAgICAgPSA0OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nVG9wfSAgICAgICAgICAgICAgPSA4OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nQm90dG9tfSAgICAgICAgICAgPSA4OwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBib2R5KQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMiA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMiwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMntTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX0hUTUxNYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvdXRwdXQgcmVzcG9uaWJsZSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlID0gJy0nOwogICAgICAgIGlmICggJFBhcmFte1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgJFJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICA9ICRQYXJhbXtSZXNwb25zaWJsZX0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtSZXNwb25zaWJsZURhdGF9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyTGFzdG5hbWV9IC4gJyknOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4geyBSZXNwb25zaWJsZVN0cmluZyA9PiAkUmVzcG9uc2libGUsIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCB0eXBlLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmljZSBhbmQgc2xhLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFBhcmFte1NlcnZpY2V9IHx8ICctJywKICAgICAgICAgICAgICAgIFNMQSAgICAgPT4gJFBhcmFte1NMQX0gICAgIHx8ICctJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGZpcnN0IHJlc3BvbnNlIHRpbWUKICAgIGlmICggZGVmaW5lZCggJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHVwZGF0ZSB0aW1lCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtVcGRhdGVUaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgc29sdXRpb24gdGltZQogICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17U29sdXRpb25UaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGV4dCAxMyBhbmQgMTQKICAgICAgICBpZiAoJENvdW50IGVxIDEzIHx8ICRDb3VudCBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFte0FydGljbGVJRH0gfHwgJyc7CiAgICBteSBAQXJ0aWNsZUJveCA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjbWVudCBzdHJpbmcKICAgICAgICBteSAlQXRtSW5kZXggPSAoKTsKICAgICAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17IkFydGljbGU6OkFUTSJ9ID0gJyc7CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEZpbGV7RmlsZW5hbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRGaWxle0ZpbGVuYW1lfSApOwogICAgICAgICAgICAkUGFyYW17IkFydGljbGU6OkFUTSJ9CiAgICAgICAgICAgICAgICAuPSAnPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldEF0dGFjaG1lbnQmJwogICAgICAgICAgICAgICAgLiAiQXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0mRmlsZUlEPSRGaWxlSURcIiB0YXJnZXQ9XCJhdHRhY2htZW50XCIgIgogICAgICAgICAgICAgICAgLiAib25tb3VzZW92ZXI9XCJ3aW5kb3cuc3RhdHVzPSdcJFRleHR7XCJEb3dubG9hZFwifTogJEZpbGV7RmlsZW5hbWV9JzsiCiAgICAgICAgICAgICAgICAuICcgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPVwnXCc7Ij4nCiAgICAgICAgICAgICAgICAuICIkRmlsZXtGaWxlbmFtZX08L2E+ICRGaWxle0ZpbGVzaXplfTxicj4iOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICAgICAgaWYgKAogICAgICAgICAgICBteSAkTWltZVR5cGVUZXh0CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKCAlUGFyYW0sICVBcnRpY2xlLCBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Wm9vbScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17IlRleHROb3RlIn0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAkQXJ0aWNsZXsiQm9keSJ9ICAgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIE5ld0xpbmUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TmV3TGluZScpLAogICAgICAgICAgICAgICAgVGV4dCAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICAgICAgICAgIFZNYXggICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBjaGFyc2V0IGNoZWNrCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIG15ICRDaGFyc2V0VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tDaGFyc2V0KAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRDaGFyc2V0ID0+ICRBcnRpY2xle0NvbnRlbnRDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBhcmFteyJBcnRpY2xlOjpUZXh0Tm90ZSJ9ID0gJENoYXJzZXRUZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CgogICAgICAgICMgZG8gc29tZSBzdHJpcHMgJiYgcXVvdGluZwogICAgICAgIGZvciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyRffSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJF8sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRffSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFjY291bnRlZCBhcnRpY2xlIHRpbWUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21UaW1lRGlzcGxheScpICkgewogICAgICAgICAgICBteSAkQXJ0aWNsZVRpbWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICJSb3ciLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xlVGltZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UHJpbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpb3JpdHkucG0gLSBzZXQgdGlja2V0IHByaW9yaXR5CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFByaW9yaXR5LnBtLHYgMS4xIDIwMDgvMDcvMDIgMTY6Mjg6MjcgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UHJpb3JpdHkucG0sdiAxLjM4IDIwMDgvMDcvMDIgMTM6Mzk6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0UHJpb3JpdHk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkIFRpY2tldElEIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSBvd25lciB0byBkbyB0aGlzIGFjdGlvbiEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBmb3IgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBOZXdPd25lcklEIE5ld093bmVyVHlwZSBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZAogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQKICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgIEF0dGFjaG1lbnREZWxldGU1IEF0dGFjaG1lbnREZWxldGU2IEF0dGFjaG1lbnREZWxldGU3IEF0dGFjaG1lbnREZWxldGU4CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTkgQXR0YWNobWVudERlbGV0ZTEwIEF0dGFjaG1lbnREZWxldGUxMSBBdHRhY2htZW50RGVsZXRlMTIKICAgICAgICBBdHRhY2htZW50RGVsZXRlMTMgQXR0YWNobWVudERlbGV0ZTE0IEF0dGFjaG1lbnREZWxldGUxNSBBdHRhY2htZW50RGVsZXRlMTYKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dDE0Iik7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlByaW9yaXR5UkMiKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkVsZW1lbnRDaGFuZ2VkIikgfHwgJyc7CgogICAgIyBzZXQgUHJpb3JpdHlSQyBmcm9tIGNoYW5nZWQgYWpheCBlbGVtZW50CiAgICBpZiAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyApCiAgICAgICAgfHwgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnICkgJiYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICApICkKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgaWYgKCFkZWZpbmVkKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSAmJiAkVGlja2V0e1NlcnZpY2VJRH0pIHsKICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgIH0KCiAgICAjIHNldCBpbXBhY3QgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fTsKICAgIH0KCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtJbXBhY3RJRH0pIHsKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIEZSRUVUSU1FTlVNQkVSOgogICAgZm9yIG15ICRGcmVlVGltZU51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgIyBjcmVhdGUgZnJlZXRpbWUgcHJlZml4CiAgICAgICAgbXkgJEZyZWVUaW1lUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRGcmVlVGltZU51bWJlcjsKCiAgICAgICAgIyBnZXQgZm9ybSBwYXJhbXMKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGcmVlVGltZVByZWZpeCAuICRUeXBlICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhZGRpdGlvbmFsIHBhcmFtcwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ID0gJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkRnJlZVRpbWVOdW1iZXIgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAwOwogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSB0aW1lZGF0YQogICAgICAgIG15ICRUaW1lRGF0YUNvbXBsZXRlID0gMTsKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIGRlZmluZWQgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwoKICAgICAgICAgICAgJFRpbWVEYXRhQ29tcGxldGUgPSAwOwogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSIGlmICRUaW1lRGF0YUNvbXBsZXRlOwoKICAgICAgICBpZiAoICEkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZXRpbWUgZGF0YSBmcm9tIHRpY2tldAogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZVN0cmluZwogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRUaWNrZXRGcmVlVGltZVN0cmluZyApOwoKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01pbnV0ZScgfSA9ICRNaW51dGU7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnSG91cicgfSAgID0gJEhvdXI7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnWWVhcicgfSAgID0gJFllYXI7CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZUtleSRfIiApOwogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICBteSAkU2l6ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSB8fCA3MDsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oXj4uK3wuezQsJFNpemV9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yID0gKCk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9ICk7CgogICAgICAgICAgICAjIGNoZWNrIHN0YXRlIHR5cGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBkYXRlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlN1YmplY3QgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYm9keQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IkJvZHkgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskX30gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJUaWNrZXRGcmVlVGV4dEZpZWxkJF8gaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMKICAgICAgICAgICAgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9yeyJFeHBhbmQifSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1RpdGxlfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUaXRsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17U2VydmljZUlEfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlU2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17U0xBSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQVNldCgKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte09sZE93bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbm90ZQogICAgICAgIG15ICRBcnRpY2xlSUQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgPT4gIiRTZWxmLT57VXNlckZpcnN0bmFtZX0gJFNlbGYtPntVc2VyTGFzdG5hbWV9IDwkU2VsZi0+e1VzZXJFbWFpbH0+IiwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L3BsYWluOyBjaGFyc2V0PSRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eydVc2VyQ2hhcnNldCd9IiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4KICAgICAgICAgICAgICAgICAgICBbIEB7ICRTZWxmLT57SW5mb3JtVXNlcklEfSB9LCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9LCBdLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSA9PiAwLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgIG15IEBBdHRhY2htZW50RGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICAgICAgZm9yIG15ICRSZWYgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICV7JFJlZn0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGV4dAogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICgoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0pIHx8ICEkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBLZXkgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDb3VudGVyID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEtleSA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkR2V0UGFyYW17SW1wYWN0SUR9IHx8ICcnLAogICAgICAgICAgICBDb3VudGVyID0+IDE0LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVRpbWU7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnU2VjdW5kZScgfSA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdVc2VkJyB9ICkgewogICAgICAgICAgICAgICAgICAgICVUaW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sIFByZWZpeCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJF8KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwcmlvcml0eQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSAmJiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdW5sb2NrIHRoZSB0aWNrZXQgYWZ0ZXIgY2xvc2UKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSApOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSZBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CgogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2UgewoKICAgICAgICAjIGZpbGx1cCB2YXJzCiAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFte0JvZHl9ICkgJiYgJFNlbGYtPntDb25maWd9LT57Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApOwogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17U3ViamVjdH0gKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICApOwoKICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICVHZXRQYXJhbSwgJVRpY2tldCwgJVRpY2tldEZyZWVUZXh0SFRNTCwgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICBJbXBhY3RJRCA9PiAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9LAogICAgICAgICAgICBOZXdQcmlvcml0eUlEID0+ICRUaWNrZXR7UHJpb3JpdHlJRH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZSA9ICggJycsICctJyApOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgT25DaGFuZ2UgPT4KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IG9sZCBvd25lcgogICAgICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRQYXJhbXtPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDApIiwKICAgICAgICApOwogICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgIGlmIChAT2xkVXNlckluZm8pIHsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBPbGRVc2VySW5mbyApIHsKICAgICAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgICAgIGlmICggISRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggISVVc2VySGFzaCApIHsKICAgICAgICAgICAgJFVzZXJIYXNoeycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgbXkgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICcnOwogICAgICAgIGlmICggJFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJFBhcmFte09sZE93bmVySUR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9IC4gJzEnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzdHJpbmcKICAgICAgICAkUGFyYW17T2xkT3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkT2xkT3duZXJTZWxlY3RlZElELAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdPbGRPd25lcklEJywKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDIpIiwKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte05ld093bmVyVHlwZX0gJiYgJFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpPbGQnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6TmV3J30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lckpzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZXNwb25zaWJsZQogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9IHx8ICRUaWNrZXR7UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgIG15ICVTdGF0ZSAgICAgPSAoKTsKICAgICAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRTdGF0ZUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3U3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgICRQYXJhbXtTdGF0ZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yICggc29ydCBrZXlzICVTdGF0ZUxpc3QgKSB7CiAgICAgICAgICAgIGlmICgkXykgewogICAgICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZVBlbmRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgICAgICRQYXJhbXsnSW1wYWN0U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBhY3QnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgJVByaW9yaXR5LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZUpzJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SW52b2x2ZWRBZ2VudHMoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgICAgICBteSAkQ291bnRlciAgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIGlmICggISRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3BlbGxDaGVja2VyJykKICAgICAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICREYXRhUmVmICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBBcnRpY2xlVHlwZUlEIHN0cmluZwogICAgICAgIG15ICVBcnRpY2xlVHlwZSA9ICgpOwogICAgICAgIGlmICggISRQYXJhbXtBcnRpY2xlVHlwZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17QXJ0aWNsZVR5cGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwb3NzaWJsZSBub3RlcwogICAgICAgIG15ICVEZWZhdWx0Tm90ZVR5cGVzID0gJXsgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgIG15ICVOb3RlVHlwZXMgICAgICAgID0gJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgVGFibGUgPT4gJ2FydGljbGVfdHlwZScsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFdoYXQgID0+ICdpZCwgbmFtZScKICAgICAgICApOwogICAgICAgIGZvciAoIGtleXMgJU5vdGVUeXBlcyApIHsKICAgICAgICAgICAgaWYgKCAhJERlZmF1bHROb3RlVHlwZXN7ICROb3RlVHlwZXN7JF99IH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJE5vdGVUeXBlc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlTm90ZVR5cGVzLAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUlEJywKICAgICAgICAgICAgJUFydGljbGVUeXBlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnVGlja2V0RnJlZVRpbWUnfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICJUaWNrZXRGcmVlVGV4dCRLZXkiLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gIlRpY2tldEZyZWVLZXkkS2V5IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGltZSBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZUNoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVDaGVjayA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSAuICdVc2VkJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUZpZWxkID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkS2V5ICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UHJpb3JpdHknLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UXVldWUucG0gLSB0aGUgcXVldWUgdmlldyBvZiBhbGwgdGlja2V0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRRdWV1ZS5wbSx2IDEuMyAyMDA4LzA3LzA3IDA3OjA1OjM4IG1oIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFF1ZXVlLnBtLHYgMS41MyAyMDA4LzA3LzA1IDE4OjQwOjI3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFF1ZXVlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2NrOwp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCBkZWJ1ZwogICAgJFNlbGYtPntEZWJ1Z30gPSAwOwoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFF1ZXVlT2JqZWN0IExheW91dE9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgc29tZSBuZXcgb2JqZWN0cwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMb2NrT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxvY2stPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBjb25maWcgZGF0YQogICAgJFNlbGYtPntWaWV3YWJsZVNlbmRlclR5cGVzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlZpZXdhYmxlU2VuZGVyVHlwZXMnKQogICAgICAgIHx8ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICBNZXNzYWdlID0+ICdObyBDb25maWcgZW50cnkgIlRpY2tldDo6Vmlld2FibGVTZW5kZXJUeXBlcyIhJwogICAgICAgICk7CiAgICAkU2VsZi0+e0N1c3RvbVF1ZXVlfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkN1c3RvbVF1ZXVlJykgfHwgJz8/Pyc7CgogICAgIyBkZWZhdWx0IHZpZXdhYmxlIHRpY2tldHMgYSBwYWdlCiAgICAkU2VsZi0+e1ZpZXdhYmxlVGlja2V0c30gPSAkU2VsZi0+e1VzZXJRdWV1ZVZpZXdTaG93VGlja2V0c30KICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJlZmVyZW5jZXNHcm91cHMnKS0+e1F1ZXVlVmlld1Nob3duVGlja2V0c30tPntEYXRhU2VsZWN0ZWR9CiAgICAgICAgfHwgMTU7CgogICAgIyBnZXQgcGFyYW1zCiAgICAkU2VsZi0+e1ZpZXdBbGx9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlld0FsbCcgKSB8fCAwOwogICAgJFNlbGYtPntTdGFydH0gICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0JyApICAgfHwgMTsKCiAgICAjIHZpZXdhYmxlIHRpY2tldHMgYSBwYWdlCiAgICAkU2VsZi0+e0xpbWl0fSA9ICRTZWxmLT57Vmlld2FibGVUaWNrZXRzfSArICRTZWxmLT57U3RhcnR9IC0gMTsKCiAgICAjIHN1cmUgaXMgc3VyZSEKICAgICRTZWxmLT57TWF4TGltaXR9ID0gJFNlbGYtPntDb25maWd9LT57TWF4U2hvd259IHx8IDEyMDA7CiAgICBpZiAoICRTZWxmLT57TGltaXR9ID4gJFNlbGYtPntNYXhMaW1pdH0gKSB7CiAgICAgICAgJFNlbGYtPntMaW1pdH0gPSAkU2VsZi0+e01heExpbWl0fTsKICAgIH0KCiAgICAjIGFsbCBzdGF0aWMgdmFyaWFibGVzCiAgICBteSBAVmlld2FibGVTdGF0ZUlEcyA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICBUeXBlICAgPT4gJ1ZpZXdhYmxlJywKICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICk7CiAgICAkU2VsZi0+e1ZpZXdhYmxlU3RhdGVJRHN9ID0gXEBWaWV3YWJsZVN0YXRlSURzOwogICAgbXkgQFZpZXdhYmxlTG9ja0lEcyA9ICRTZWxmLT57TG9ja09iamVjdH0tPkxvY2tWaWV3YWJsZUxvY2soIFR5cGUgPT4gJ0lEJyApOwogICAgJFNlbGYtPntWaWV3YWJsZUxvY2tJRHN9ID0gXEBWaWV3YWJsZUxvY2tJRHM7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgc3RvcmUgbGFzdCBzY3JlZW4KICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICMgc3RhcnRpbmcgd2l0aCBwYWdlIC4uLgogICAgbXkgJFJlZnJlc2ggPSAnJzsKICAgIGlmICggJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9ICkgewogICAgICAgICRSZWZyZXNoID0gNjAgKiAkU2VsZi0+e1VzZXJSZWZyZXNoVGltZX07CiAgICB9CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFJlZnJlc2ggPT4gJFJlZnJlc2gsICk7CgogICAgIyBidWlsZCBOYXZpZ2F0aW9uQmFyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgdG8gZ2V0IHRoZSBvdXRwdXQgZmFzdGVyIQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0ICk7CiAgICAkT3V0cHV0ID0gJyc7CgogICAgIyBidWlsZCBxdWV1ZSB2aWV3IC4uLgogICAgbXkgQFZpZXdhYmxlUXVldWVJRHMgPSAoKTsKICAgIGlmICggJFNlbGYtPntRdWV1ZUlEfSA9PSAwICkgewogICAgICAgIEBWaWV3YWJsZVF1ZXVlSURzID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldEFsbEN1c3RvbVF1ZXVlcyggVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBWaWV3YWJsZVF1ZXVlSURzID0gKCAkU2VsZi0+e1F1ZXVlSUR9ICk7CiAgICB9CiAgICAkU2VsZi0+QnVpbGRRdWV1ZVZpZXcoIFF1ZXVlSURzID0+IFxAVmlld2FibGVRdWV1ZUlEcyApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCgKICAgICAgICBPdXRwdXQgPT4gXCRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UXVldWUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKSwKICAgICk7CgogICAgIyBnZXQgdXNlciBncm91cHMKICAgIG15ICRUeXBlID0gJ3J3JzsKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Vmlld0FsbFBvc3NpYmxlVGlja2V0c30gKSB7CiAgICAgICAgJFR5cGUgPSAncm8nOwogICAgfQogICAgbXkgQEdyb3VwSURzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkVHlwZSwKICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgZGF0YSAodmlld2FibGUgdGlja2V0cy4uLikKICAgIG15IEBWaWV3YWJsZVRpY2tldHMgPSAoKTsKICAgIG15ICRTb3J0QnkgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30gfHwgJ0FnZSc7CiAgICBteSAlU29ydE9wdGlvbnMgICAgID0gKAogICAgICAgIE93bmVyICAgICAgICAgICAgICAgICAgPT4gJ3N0LnVzZXJfaWQnLAogICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgPT4gJ3N0LmN1c3RvbWVyX2lkJywKICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgICAgID0+ICdzdC50aWNrZXRfc3RhdGVfaWQnLAogICAgICAgIFRpY2tldCAgICAgICAgICAgICAgICAgPT4gJ3N0LnRuJywKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgID0+ICdzdC50aXRsZScsCiAgICAgICAgUXVldWUgICAgICAgICAgICAgICAgICA9PiAnc3EubmFtZScsCiAgICAgICAgUHJpb3JpdHkgICAgICAgICAgICAgICA9PiAnc3QudGlja2V0X3ByaW9yaXR5X2lkJywKICAgICAgICBBZ2UgICAgICAgICAgICAgICAgICAgID0+ICdzdC5jcmVhdGVfdGltZV91bml4JywKICAgICAgICBUaWNrZXRFc2NhbGF0aW9uICAgICAgID0+ICdzdC5lc2NhbGF0aW9uX3RpbWUnLAogICAgICAgIEVzY2FsYXRpb25UaW1lICAgICAgICAgPT4gJ3N0LmVzY2FsYXRpb25fdGltZScsCiAgICAgICAgRXNjYWxhdGlvblVwZGF0ZVRpbWUgICA9PiAnc3QuZXNjYWxhdGlvbl91cGRhdGVfdGltZScsCiAgICAgICAgRXNjYWxhdGlvblJlc3BvbnNlVGltZSA9PiAnc3QuZXNjYWxhdGlvbl9yZXNwb25zZV90aW1lJywKICAgICAgICBFc2NhbGF0aW9uU29sdXRpb25UaW1lID0+ICdzdC5lc2NhbGF0aW9uX3NvbHV0aW9uX3RpbWUnLAogICAgICAgIFRpY2tldEZyZWVUaW1lMSAgICAgICAgPT4gJ3N0LmZyZWV0aW1lMScsCiAgICAgICAgVGlja2V0RnJlZVRpbWUyICAgICAgICA9PiAnc3QuZnJlZXRpbWUyJywKICAgICAgICBUaWNrZXRGcmVlS2V5MSAgICAgICAgID0+ICdzdC5mcmVla2V5MScsCiAgICAgICAgVGlja2V0RnJlZVRleHQxICAgICAgICA9PiAnc3QuZnJlZXRleHQxJywKICAgICAgICBUaWNrZXRGcmVlS2V5MiAgICAgICAgID0+ICdzdC5mcmVla2V5MicsCiAgICAgICAgVGlja2V0RnJlZVRleHQyICAgICAgICA9PiAnc3QuZnJlZXRleHQyJywKICAgICAgICBUaWNrZXRGcmVlS2V5MyAgICAgICAgID0+ICdzdC5mcmVla2V5MycsCiAgICAgICAgVGlja2V0RnJlZVRleHQzICAgICAgICA9PiAnc3QuZnJlZXRleHQzJywKICAgICAgICBUaWNrZXRGcmVlS2V5NCAgICAgICAgID0+ICdzdC5mcmVla2V5NCcsCiAgICAgICAgVGlja2V0RnJlZVRleHQ0ICAgICAgICA9PiAnc3QuZnJlZXRleHQ0JywKICAgICAgICBUaWNrZXRGcmVlS2V5NSAgICAgICAgID0+ICdzdC5mcmVla2V5NScsCiAgICAgICAgVGlja2V0RnJlZVRleHQ1ICAgICAgICA9PiAnc3QuZnJlZXRleHQ1JywKICAgICAgICBUaWNrZXRGcmVlS2V5NiAgICAgICAgID0+ICdzdC5mcmVla2V5NicsCiAgICAgICAgVGlja2V0RnJlZVRleHQ2ICAgICAgICA9PiAnc3QuZnJlZXRleHQ2JywKICAgICAgICBUaWNrZXRGcmVlS2V5NyAgICAgICAgID0+ICdzdC5mcmVla2V5NycsCiAgICAgICAgVGlja2V0RnJlZVRleHQ3ICAgICAgICA9PiAnc3QuZnJlZXRleHQ3JywKICAgICAgICBUaWNrZXRGcmVlS2V5OCAgICAgICAgID0+ICdzdC5mcmVla2V5OCcsCiAgICAgICAgVGlja2V0RnJlZVRleHQ4ICAgICAgICA9PiAnc3QuZnJlZXRleHQ4JywKICAgICAgICBUaWNrZXRGcmVlS2V5OSAgICAgICAgID0+ICdzdC5mcmVla2V5OScsCiAgICAgICAgVGlja2V0RnJlZVRleHQ5ICAgICAgICA9PiAnc3QuZnJlZXRleHQ5JywKICAgICAgICBUaWNrZXRGcmVlS2V5MTAgICAgICAgID0+ICdzdC5mcmVla2V5MTAnLAogICAgICAgIFRpY2tldEZyZWVUZXh0MTAgICAgICAgPT4gJ3N0LmZyZWV0ZXh0MTAnLAogICAgICAgIFRpY2tldEZyZWVLZXkxMSAgICAgICAgPT4gJ3N0LmZyZWVrZXkxMScsCiAgICAgICAgVGlja2V0RnJlZVRleHQxMSAgICAgICA9PiAnc3QuZnJlZXRleHQxMScsCiAgICAgICAgVGlja2V0RnJlZUtleTEyICAgICAgICA9PiAnc3QuZnJlZWtleTEyJywKICAgICAgICBUaWNrZXRGcmVlVGV4dDEyICAgICAgID0+ICdzdC5mcmVldGV4dDEyJywKICAgICAgICBUaWNrZXRGcmVlS2V5MTMgICAgICAgID0+ICdzdC5mcmVla2V5MTMnLAogICAgICAgIFRpY2tldEZyZWVUZXh0MTMgICAgICAgPT4gJ3N0LmZyZWV0ZXh0MTMnLAogICAgICAgIFRpY2tldEZyZWVLZXkxNCAgICAgICAgPT4gJ3N0LmZyZWVrZXkxNCcsCiAgICAgICAgVGlja2V0RnJlZVRleHQxNCAgICAgICA9PiAnc3QuZnJlZXRleHQxNCcsCiAgICAgICAgVGlja2V0RnJlZUtleTE1ICAgICAgICA9PiAnc3QuZnJlZWtleTE1JywKICAgICAgICBUaWNrZXRGcmVlVGV4dDE1ICAgICAgID0+ICdzdC5mcmVldGV4dDE1JywKICAgICAgICBUaWNrZXRGcmVlS2V5MTYgICAgICAgID0+ICdzdC5mcmVla2V5MTYnLAogICAgICAgIFRpY2tldEZyZWVUZXh0MTYgICAgICAgPT4gJ3N0LmZyZWV0ZXh0MTYnLAogICAgKTsKCiAgICBteSAkT3JkZXIgPSAkU2VsZi0+e0NvbmZpZ30tPnsnT3JkZXI6OkRlZmF1bHQnfSB8fCAnVXAnOwogICAgaWYgKCBAVmlld2FibGVRdWV1ZUlEcyAmJiBAR3JvdXBJRHMgKSB7CgogICAgICAgICMgaWYgd2UgaGF2ZSBvbmx5IG9uZSBxdWV1ZSwgY2hlY2sgaWYgdGhlcmUKICAgICAgICAjIGlzIGEgc2V0dGluZyBpbiBDb25maWcucG0gZm9yIHNvcnRpbmcKICAgICAgICBpZiAoICQjVmlld2FibGVRdWV1ZUlEcyA9PSAwICkgewogICAgICAgICAgICBteSAkUXVldWVJRCA9ICRWaWV3YWJsZVF1ZXVlSURzWzBdOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1F1ZXVlU29ydH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDb25maWd9LT57UXVldWVTb3J0fS0+eyRRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1F1ZXVlU29ydH0tPnskUXVldWVJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPcmRlciA9ICdEb3duJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPcmRlciA9ICdVcCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRPcmRlciBlcSAnVXAnICkgewogICAgICAgICAgICAkT3JkZXIgPSAnQVNDJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPcmRlciA9ICdERVNDJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgcXVlcnkKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBzdC5pZCwgc3QucXVldWVfaWQgRlJPTSAiCiAgICAgICAgICAgIC4gIiB0aWNrZXQgc3QsIHF1ZXVlIHNxICIKICAgICAgICAgICAgLiAiIFdIRVJFICIKICAgICAgICAgICAgLiAiIHNxLmlkID0gc3QucXVldWVfaWQgQU5EICIKICAgICAgICAgICAgLiAiIHN0LnRpY2tldF9zdGF0ZV9pZCBJTiAoICR7XChqb2luICcsICcsIEB7JFNlbGYtPntWaWV3YWJsZVN0YXRlSURzfX0pfSApIEFORCAiOwogICAgICAgIGlmICggISRTZWxmLT57Vmlld0FsbH0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiBzdC50aWNrZXRfbG9ja19pZCBJTiAoICR7XChqb2luICcsICcsIEB7JFNlbGYtPntWaWV3YWJsZUxvY2tJRHN9fSl9ICkgIgogICAgICAgICAgICAgICAgLiAiIEFORCAiOwogICAgICAgIH0KICAgICAgICAkU1FMIC49ICIgc3QucXVldWVfaWQgSU4gKCAiOwogICAgICAgIGZvciAoIDAgLi4gJCNWaWV3YWJsZVF1ZXVlSURzICkgewogICAgICAgICAgICBpZiAoICRfID4gMCApIHsKICAgICAgICAgICAgICAgICRTUUwgLj0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUwgLj0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVmlld2FibGVRdWV1ZUlEc1skX10gKTsKICAgICAgICB9CiAgICAgICAgJFNRTAogICAgICAgICAgICAuPSAiICkgQU5EICIKICAgICAgICAgICAgLiAiIHNxLmdyb3VwX2lkIElOICggJHtcKGpvaW4gJywgJywgQEdyb3VwSURzKX0gKSAiCiAgICAgICAgICAgIC4gIiBPUkRFUiBCWSBzdC50aWNrZXRfcHJpb3JpdHlfaWQgREVTQywgJFNvcnRPcHRpb25zeyRTb3J0Qnl9ICRPcmRlciI7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoIFNRTCA9PiAkU1FMLCBMaW1pdCA9PiAkU2VsZi0+e0xpbWl0fSApOwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgaWYgKCAkQ291bnRlciA+PSAoICRTZWxmLT57U3RhcnR9IC0gMSApICkgewogICAgICAgICAgICAgICAgcHVzaCggQFZpZXdhYmxlVGlja2V0cywgJFJvd1swXSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyB0aWNrZXQncwogICAgbXkgJENvdW50ZXIgPSAwOwogICAgZm9yIChAVmlld2FibGVUaWNrZXRzKSB7CiAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KAogICAgICAgICAgICBPdXRwdXQgPT4gXCRTZWxmLT5TaG93VGlja2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJF8sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnRlciwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhZ2UgZm9vdGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgIyByZXR1cm4gcGFnZQogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBTaG93VGlja2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldElEID0gJFBhcmFte1RpY2tldElEfSB8fCByZXR1cm47CgogICAgJFBhcmFte1F1ZXVlVmlld1F1ZXVlSUR9ID0gJFNlbGYtPntRdWV1ZUlEfTsKICAgIG15ICVNb3ZlUXVldWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUeXBlICAgICA9PiAnbW92ZV9pbnRvJywKICAgICk7CgogICAgIyBnZXQgbGFzdCBhcnRpY2xlCiAgICBteSAlQXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUxhc3RDdXN0b21lckFydGljbGUoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgbG9va3VwIGNyaXRpY2FsaXR5CiAgICAkQXJ0aWNsZXtDcml0aWNhbGl0eX0gPSAnLSc7CiAgICBpZiAoJEFydGljbGV7VGlja2V0RnJlZVRleHQxM30pIHsKICAgICAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICAgICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0NyaXRpY2FsaXR5fSA9ICRDcml0aWNhbGl0eUxpc3QtPnskQXJ0aWNsZXtUaWNrZXRGcmVlVGV4dDEzfX07CiAgICB9CiAgICAjIGxvb2t1cCBpbXBhY3QKICAgICRBcnRpY2xle0ltcGFjdH0gPSAnLSc7CiAgICBpZiAoJEFydGljbGV7VGlja2V0RnJlZVRleHQxNH0pIHsKICAgICAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgICAgIG15ICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0ltcGFjdH0gPSAkSW1wYWN0TGlzdC0+eyRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTR9fTsKICAgIH0KIyAtLS0KCiAgICAjIHJ1biBhcnRpY2xlIG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVidWcgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15IEBEYXRhID0gJE9iamVjdC0+Q2hlY2soIEFydGljbGUgPT4gXCVBcnRpY2xlLCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgZm9yIG15ICREYXRhUmVmIChARGF0YSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICRPYmplY3QtPkZpbHRlciggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgIH0KICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHJlc3BvbnNlcyAuLi4KICAgIG15ICVTdGRSZXNwb25zZXMgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3RkUmVzcG9uc2VzKCBRdWV1ZUlEID0+ICRBcnRpY2xle1F1ZXVlSUR9ICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBteSAlQ3VzdG9tZXJEYXRhID0gKCk7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9RdWV1ZScpICkgewogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRBcnRpY2xle0N1c3RvbWVySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHRpY2tldCB2aWV3CiAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICBpZiAoICRBcnRpY2xleyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkXywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXskX30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBodW1hbiBhZ2UKICAgICRBcnRpY2xle0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKCBBZ2UgPT4gJEFydGljbGV7QWdlfSwgU3BhY2UgPT4gJyAnICk7CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvUXVldWUnKSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4geyAlQXJ0aWNsZSwgJUN1c3RvbWVyRGF0YSwgfSwKICAgICAgICAgICAgVHlwZSA9PiAnTGl0ZScsCiAgICAgICAgICAgIE1heCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvUXVldWVNYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgU3RkUmVzcG9uc2VzU3RyZwogICAgJFBhcmFte1N0ZFJlc3BvbnNlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRTdGRSZXNwb25zZVN0cmluZygKICAgICAgICBTdGRSZXNwb25zZXNSZWYgPT4gXCVTdGRSZXNwb25zZXMsCiAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKAogICAgICAgICVBcnRpY2xlLAogICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICk7CiAgICBpZiAoJE1pbWVUeXBlVGV4dCkgewogICAgICAgICRBcnRpY2xle0JvZHlOb3RlfSA9ICRNaW1lVHlwZVRleHQ7CiAgICAgICAgJEFydGljbGV7Qm9keX0gICAgID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRQcmVWaWV3TGluZXMnKSB8fCAyNSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgID0+IDEsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlICA9PiAxLAogICAgICAgICAgICBTdHJpcEVtcHR5TGluZXMgPT4gJFNlbGYtPntDb25maWd9LT57U3RyaXBFbXB0eUxpbmVzfSwKICAgICAgICApOwoKICAgICAgICAjIGRvIGNoYXJzZXQgY2hlY2sKICAgICAgICBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgICAgIENvbnRlbnRDaGFyc2V0ID0+ICRBcnRpY2xle0NvbnRlbnRDaGFyc2V0fSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9CiAgICAgICAgKTsKICAgICAgICBpZiAoJENoYXJzZXRUZXh0KSB7CiAgICAgICAgICAgICRBcnRpY2xle0JvZHlOb3RlfSA9ICRDaGFyc2V0VGV4dDsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWNsIGFjdGlvbnMKICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJy0nLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJUFjbEFjdGlvbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgcnVuIHRpY2tldCBwcmUgbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LCApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0ICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgQUNMICAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgIENvbmZpZyAgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBkaXNhYmxlIHRpY2tldCBmcmVlIHRleHQgMTMgdG8gMTYKICAgICAgICBpZiAoICRDb3VudCA+PSAxMyAmJiAkQ291bnQgPD0gMTYgKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIGlmICggJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXkgID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IC4gJzo6TGluaycgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRQbGFpbicgLiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRMaW5rJyAuICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCAuICc6OkxpbmsnICksCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXkgID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBkaXNhYmxlIHRpY2tldCBmcmVlIHRpbWUgMyB0byA2CiAgICAgICAgaWYgKCAkQ291bnQgPj0gMyAmJiAkQ291bnQgPD0gNiApIHsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiMgLS0tCiAgICAgICAgaWYgKCAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG91dHB1dAogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkFnZW50Q2FuQmVDdXN0b21lcicpCiAgICAgICAgJiYgJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9CiAgICAgICAgJiYgJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ID1+IC9eJFNlbGYtPntVc2VyTG9naW59JC9pCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50SXNDdXN0b21lcicsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCggJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9ICkgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlIik7CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgbXkgJE9rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRPayApIHsKICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXJDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfSApCiAgICAgICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lT3V0Ym91bmQiKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgYnVsayBibG9jawogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldEJ1bGt9CiAgICAgICAgJiYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gIkJ1bGsiLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgdGl0bGUKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRpdGxlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQXJ0aWNsZXtTZXJ2aWNlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggJEFydGljbGV7U0xBfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgZmlyc3QgcmVzcG9uc2UgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCggJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9ICkgKSB7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7J0ZpcnN0UmVzcG9uc2VUaW1lJ30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xleydGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lJ30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZUZvbnRTdGFydCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdXBkYXRlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQoICRBcnRpY2xle1VwZGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXsnVXBkYXRlVGltZSd9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xleydVcGRhdGVUaW1lV29ya2luZ1RpbWUnfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lRm9udFN0YXJ0JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lRm9udFN0b3AnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IHNvbHV0aW9uIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQoICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSApIHsKICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7J1NvbHV0aW9uVGltZSd9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7J1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lJ30sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZUZvbnRTdGFydCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lRm9udFN0b3AnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgTW92ZVF1ZXVlc1N0cmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1vdmVUeXBlJykgPX4gL15mb3JtJC9pICkgewogICAgICAgICRQYXJhbXtNb3ZlUXVldWVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXN0UXVldWVJRCcsCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVNb3ZlUXVldWVzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0TW92ZX0KICAgICAgICAmJiAoICFkZWZpbmVkKCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gKSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAnbW92ZScsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNb3ZlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkVGlja2V0VmlldyA9ICRTZWxmLT57VXNlclF1ZXVlVmlld30KICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJlZmVyZW5jZXNHcm91cHMnKS0+e1F1ZXVlVmlld30tPntEYXRhU2VsZWN0ZWR9OwoKICAgIGlmICggJFRpY2tldFZpZXcgbmUgJ0FnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3TGl0ZScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3TGl0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIEJ1aWxkUXVldWVWaWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY2VsZXJhdG9ySW5kZXgoCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgIFNob3duUXVldWVJRHMgPT4gJFBhcmFte1F1ZXVlSURzfSwKICAgICk7CgogICAgIyBjaGVjayBzaG93biB0aWNrZXRzCiAgICBpZiAoICRTZWxmLT57TWF4TGltaXR9IDwgJERhdGF7VGlja2V0c0F2YWlsfSApIHsKCiAgICAgICAgIyBzZXQgbWF4IHNob3duCiAgICAgICAgJERhdGF7VGlja2V0c0F2YWlsfSA9ICRTZWxmLT57TWF4TGltaXR9OwogICAgfQoKICAgICMgc2hvdyBhdmFpbGFibGUgdGlja2V0cwogICAgaWYgKCAkU2VsZi0+e1ZpZXdBbGx9ICkgewogICAgICAgICREYXRhe1RpY2tldHNBdmFpbEFsbH0gPSAkRGF0YXtBbGxUaWNrZXRzfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhe1RpY2tldHNBdmFpbEFsbH0gPSAkRGF0YXtUaWNrZXRzQXZhaWx9OwogICAgfQoKICAgICMgY2hlY2sgc3RhcnQgb3B0aW9uLCBpZiBoaWdoZXIgdGhlbiB0aWNrZXRzIGF2YWlsYWJsZSwgc2V0CiAgICAjIGl0IHRvIHRoZSBsYXN0IHRpY2tldCBwYWdlIChUaGFua3MgdG8gU3RlZmFuIFNjaG1pZHQhKQogICAgaWYgKCAkU2VsZi0+e1N0YXJ0fSA+ICREYXRhe1RpY2tldHNBdmFpbEFsbH0gKSB7CiAgICAgICAgbXkgJFBhZ2VTaG93biA9ICRTZWxmLT57Vmlld2FibGVUaWNrZXRzfTsKICAgICAgICBteSAkUGFnZXMgPSBpbnQoICggJERhdGF7VGlja2V0c0F2YWlsQWxsfSAvICRQYWdlU2hvd24gKSArIDAuOTk5OTkgKTsKICAgICAgICAkU2VsZi0+e1N0YXJ0fSA9ICggKCAkUGFnZXMgLSAxICkgKiAkUGFnZVNob3duICkgKyAxOwogICAgfQoKICAgICMgYnVpbGQgb3V0cHV0IC4uLgogICAgbXkgJUFsbFF1ZXVlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRBbGxRdWV1ZXMoKTsKICAgICRTZWxmLT5fTWFza1F1ZXVlVmlldygKICAgICAgICAlRGF0YSwKICAgICAgICBRdWV1ZUlEICAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICBBbGxRdWV1ZXMgICAgICAgPT4gXCVBbGxRdWV1ZXMsCiAgICAgICAgU3RhcnQgICAgICAgICAgID0+ICRTZWxmLT57U3RhcnR9LAogICAgICAgIFZpZXdhYmxlVGlja2V0cyA9PiAkU2VsZi0+e1ZpZXdhYmxlVGlja2V0c30sCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCnN1YiBfTWFza1F1ZXVlVmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRRdWV1ZUlEICAgICAgICAgPSAkUGFyYW17UXVldWVJRH0gfHwgMDsKICAgIG15IEBRdWV1ZXNOZXcgICAgICAgPSBAeyAkUGFyYW17UXVldWVzfSB9OwogICAgbXkgJFF1ZXVlSURPZk1heEFnZSA9ICRQYXJhbXtRdWV1ZUlET2ZNYXhBZ2V9IHx8IC0xOwogICAgbXkgJUFsbFF1ZXVlcyAgICAgICA9ICV7ICRQYXJhbXtBbGxRdWV1ZXN9IH07CiAgICBteSAlQ291bnRlciAgICAgICAgID0gKCk7CiAgICBteSAlVXNlZFF1ZXVlICAgICAgID0gKCk7CiAgICBteSBATGlzdGVkUXVldWVzICAgID0gKCk7CiAgICBteSAkTGV2ZWwgICAgICAgICAgID0gMDsKICAgIG15ICRDdXN0b21RdWV1ZSAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFNlbGYtPntDdXN0b21RdWV1ZX0gKTsKICAgICRTZWxmLT57SGlnaGxpZ2h0QWdlMX0gICA9ICRTZWxmLT57Q29uZmlnfS0+e0hpZ2hsaWdodEFnZTF9OwogICAgJFNlbGYtPntIaWdobGlnaHRBZ2UyfSAgID0gJFNlbGYtPntDb25maWd9LT57SGlnaGxpZ2h0QWdlMn07CiAgICAkU2VsZi0+e0hpZ2hsaWdodENvbG9yMX0gPSAkU2VsZi0+e0NvbmZpZ30tPntIaWdobGlnaHRDb2xvcjF9OwogICAgJFNlbGYtPntIaWdobGlnaHRDb2xvcjJ9ID0gJFNlbGYtPntDb25maWd9LT57SGlnaGxpZ2h0Q29sb3IyfTsKCiAgICAkUGFyYW17U2VsZWN0ZWRRdWV1ZX0gPSAkQWxsUXVldWVzeyRRdWV1ZUlEfSB8fCAkQ3VzdG9tUXVldWU7CiAgICBteSBATWV0YVF1ZXVlID0gc3BsaXQoIC86Oi8sICRQYXJhbXtTZWxlY3RlZFF1ZXVlfSApOwogICAgJExldmVsID0gJCNNZXRhUXVldWUgKyAyOwoKICAgICMgcHJlcGFyZSBzaG93biBxdWV1ZXMgKHNob3J0IG5hbWVzKQogICAgIyAtIGdldCBxdWV1ZSB0b3RhbCBjb3VudCAtCiAgICBmb3IgbXkgJFF1ZXVlUmVmIChAUXVldWVzTmV3KSB7CiAgICAgICAgcHVzaCggQExpc3RlZFF1ZXVlcywgJFF1ZXVlUmVmICk7CiAgICAgICAgbXkgJVF1ZXVlID0gJSRRdWV1ZVJlZjsKICAgICAgICBteSBAUXVldWUgPSBzcGxpdCggLzo6LywgJFF1ZXVle1F1ZXVlfSApOwoKICAgICAgICAjIHJlbWVtYmVyIGNvdW50ZWQvdXNlZCBxdWV1ZXMKICAgICAgICAkVXNlZFF1ZXVleyAkUXVldWV7UXVldWV9IH0gPSAxOwoKICAgICAgICAjIG1vdmUgdG8gc2hvcnQgcXVldWUgbmFtZXMKICAgICAgICBteSAkUXVldWVOYW1lID0gJyc7CiAgICAgICAgZm9yICggMCAuLiAkI1F1ZXVlICkgewogICAgICAgICAgICBpZiAoICEkUXVldWVOYW1lICkgewogICAgICAgICAgICAgICAgJFF1ZXVlTmFtZSAuPSAkUXVldWVbJF9dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFF1ZXVlTmFtZSAuPSAnOjonIC4gJFF1ZXVlWyRfXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkQ291bnRlcnskUXVldWVOYW1lfSApIHsKICAgICAgICAgICAgICAgICRDb3VudGVyeyRRdWV1ZU5hbWV9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ291bnRlcnskUXVldWVOYW1lfSA9ICRDb3VudGVyeyRRdWV1ZU5hbWV9ICsgJFF1ZXVle0NvdW50fTsKICAgICAgICAgICAgaWYgKCAkQ291bnRlcnskUXVldWVOYW1lfSAmJiAhJFF1ZXVleyRRdWV1ZU5hbWV9ICYmICEkVXNlZFF1ZXVleyRRdWV1ZU5hbWV9ICkgewogICAgICAgICAgICAgICAgbXkgJUhhc2ggPSAoKTsKICAgICAgICAgICAgICAgICRIYXNoe1F1ZXVlfSA9ICRRdWV1ZU5hbWU7CiAgICAgICAgICAgICAgICAkSGFzaHtDb3VudH0gPSAkQ291bnRlcnskUXVldWVOYW1lfTsKICAgICAgICAgICAgICAgIGZvciAoIGtleXMgJUFsbFF1ZXVlcyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBbGxRdWV1ZXN7JF99IGVxICRRdWV1ZU5hbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRIYXNoe1F1ZXVlSUR9ID0gJF87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEhhc2h7TWF4QWdlfSA9IDA7CiAgICAgICAgICAgICAgICBwdXNoKCBATGlzdGVkUXVldWVzLCBcJUhhc2ggKTsKICAgICAgICAgICAgICAgICRVc2VkUXVldWV7JFF1ZXVlTmFtZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgcXVldWUgc3RyaW5nCiAgICBmb3IgbXkgJFF1ZXVlUmVmIChATGlzdGVkUXVldWVzKSB7CiAgICAgICAgbXkgJFF1ZXVlU3RyZyA9ICcnOwogICAgICAgIG15ICVRdWV1ZSAgICAgPSAlJFF1ZXVlUmVmOwoKICAgICAgICAjIHJlcGxhY2UgbmFtZSBvZiBDdXN0b21RdWV1ZQogICAgICAgIGlmICggJFF1ZXVle1F1ZXVlfSBlcSAnQ3VzdG9tUXVldWUnICkgewogICAgICAgICAgICAkQ291bnRlcnskQ3VzdG9tUXVldWV9ID0gJENvdW50ZXJ7ICRRdWV1ZXtRdWV1ZX0gfTsKICAgICAgICAgICAgJFF1ZXVle1F1ZXVlfSA9ICRDdXN0b21RdWV1ZTsKICAgICAgICB9CiAgICAgICAgbXkgQFF1ZXVlTmFtZSA9IHNwbGl0KCAvOjovLCAkUXVldWV7UXVldWV9ICk7CiAgICAgICAgbXkgJFNob3J0UXVldWVOYW1lID0gJFF1ZXVlTmFtZVstMV07CiAgICAgICAgJFF1ZXVle01heEFnZX0gPSAkUXVldWV7TWF4QWdlfSAvIDYwOwogICAgICAgICRRdWV1ZXtRdWV1ZUlEfSA9IDAgaWYgKCAhJFF1ZXVle1F1ZXVlSUR9ICk7CgogICAgICAgICMgc2hvdWxkIGkgaGlnaGxpZ2h0IHRoaXMgcXVldWUKICAgICAgICBpZiAoICRQYXJhbXtTZWxlY3RlZFF1ZXVlfSA9fiAvXlxRJFF1ZXVlTmFtZVswXVxFLyAmJiAkTGV2ZWwgLSAxID49ICQjUXVldWVOYW1lICkgewogICAgICAgICAgICBpZiAoICQjUXVldWVOYW1lID09IDAgJiYgJCNNZXRhUXVldWUgPj0gMCAmJiAkUXVldWV7UXVldWV9ID1+IC9eXFEkTWV0YVF1ZXVlWzBdXEUkLyApIHsKICAgICAgICAgICAgICAgICRRdWV1ZVN0cmcgLj0gJzxiPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJCNRdWV1ZU5hbWUgPT0gMQogICAgICAgICAgICAgICAgJiYgJCNNZXRhUXVldWUgPj0gMQogICAgICAgICAgICAgICAgJiYgJFF1ZXVle1F1ZXVlfSA9fiAvXlxRJE1ldGFRdWV1ZVswXTo6JE1ldGFRdWV1ZVsxXVxFJC8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFF1ZXVlU3RyZyAuPSAnPGI+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkI1F1ZXVlTmFtZSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkI01ldGFRdWV1ZSA+PSAyCiAgICAgICAgICAgICAgICAmJiAkUXVldWV7UXVldWV9ID1+IC9eXFEkTWV0YVF1ZXVlWzBdOjokTWV0YVF1ZXVlWzFdOjokTWV0YVF1ZXVlWzJdXEUkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUXVldWVTdHJnIC49ICc8Yj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICQjUXVldWVOYW1lID09IDMKICAgICAgICAgICAgICAgICYmICQjTWV0YVF1ZXVlID49IDMKICAgICAgICAgICAgICAgICYmICRRdWV1ZXtRdWV1ZX0KICAgICAgICAgICAgICAgID1+IC9eXFEkTWV0YVF1ZXVlWzBdOjokTWV0YVF1ZXVlWzFdOjokTWV0YVF1ZXVlWzJdOjokTWV0YVF1ZXVlWzNdXEUkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUXVldWVTdHJnIC49ICc8Yj4nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIHRvIHNlbGVjdGVkIHF1ZXVlIGluZm8KICAgICAgICBpZiAoICRRdWV1ZUlEIGVxICRRdWV1ZXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgJFBhcmFte1NlbGVjdGVkUXVldWV9ID0gJFF1ZXVle1F1ZXVlfTsKICAgICAgICAgICAgJFBhcmFte0FsbFN1YlRpY2tldHN9ID0gJENvdW50ZXJ7ICRRdWV1ZXtRdWV1ZX0gfTsKCiAgICAgICAgICAgICMgYnVpbGQgUGFnZSBOYXZpZ2F0b3IgZm9yIEFnZW50VGlja2V0UXVldWUKICAgICAgICAgICAgJFBhcmFte1BhZ2VTaG93bn0gPSAkUGFyYW17J1ZpZXdhYmxlVGlja2V0cyd9OwogICAgICAgICAgICBpZiAoICRQYXJhbXtUaWNrZXRzQXZhaWxBbGx9ID09IDEgfHwgJFBhcmFte1RpY2tldHNBdmFpbEFsbH0gPT0gMCApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXN1bHR9ID0gJFBhcmFte1RpY2tldHNBdmFpbEFsbH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUGFyYW17VGlja2V0c0F2YWlsQWxsfSA+PSAoICRQYXJhbXtTdGFydH0gKyAkUGFyYW17UGFnZVNob3dufSApICkgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc3VsdH0gPSAkUGFyYW17U3RhcnR9IC4gIi0iIC4gKCAkUGFyYW17U3RhcnR9ICsgJFBhcmFte1BhZ2VTaG93bn0gLSAxICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVzdWx0fSA9ICIkUGFyYW17U3RhcnR9LSRQYXJhbXtUaWNrZXRzQXZhaWxBbGx9IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkUGFnZXMgPSBpbnQoICggJFBhcmFte1RpY2tldHNBdmFpbEFsbH0gLyAkUGFyYW17UGFnZVNob3dufSApICsgMC45OTk5OSApOwogICAgICAgICAgICBteSAkUGFnZSAgPSBpbnQoICggJFBhcmFte1N0YXJ0fSAvICRQYXJhbXtQYWdlU2hvd259ICkgKyAwLjk5OTk5ICk7CiAgICAgICAgICAgIGZvciAoIG15ICRpID0gMTsgJGkgPD0gJFBhZ2VzOyAkaSsrICkgewogICAgICAgICAgICAgICAgJFBhcmFte1BhZ2VOYXZCYXJ9CiAgICAgICAgICAgICAgICAgICAgLj0gIiA8YSBocmVmPVwiJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9QWN0aW9uPVwkRW52e1wiQWN0aW9uXCJ9IgogICAgICAgICAgICAgICAgICAgIC4gJyZRdWV1ZUlEPSREYXRheyJRdWV1ZUlEIn0mVmlld0FsbD0nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e1ZpZXdBbGx9CiAgICAgICAgICAgICAgICAgICAgLiAnJlN0YXJ0PScKICAgICAgICAgICAgICAgICAgICAuICggKCAkaSAtIDEgKSAqICRQYXJhbXtQYWdlU2hvd259ICsgMSApIC49ICciPic7CiAgICAgICAgICAgICAgICBpZiAoICRQYWdlID09ICRpICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQYWdlTmF2QmFyfSAuPSAnPGI+JyAuICgkaSkgLiAnPC9iPic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGFnZU5hdkJhcn0gLj0gKCRpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRQYXJhbXtQYWdlTmF2QmFyfSAuPSAnPC9hPiAnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRRdWV1ZVN0cmcKICAgICAgICAgICAgLj0gIjxhIGhyZWY9XCIkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua31BY3Rpb249QWdlbnRUaWNrZXRRdWV1ZSZRdWV1ZUlEPSRRdWV1ZXtRdWV1ZUlEfVwiIjsKICAgICAgICAkUXVldWVTdHJnCiAgICAgICAgICAgIC49ICcgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9XCckVGV4dHsiUXVldWUifTogJwogICAgICAgICAgICAuICRRdWV1ZXtRdWV1ZX0KICAgICAgICAgICAgLiAnXCc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz1cJ1wnOyI+JzsKCiAgICAgICAgIyBzaG91bGQgaSBoaWdobGlnaHQgdGhpcyBxdWV1ZQogICAgICAgIGlmICggJFF1ZXVle01heEFnZX0gPj0gJFNlbGYtPntIaWdobGlnaHRBZ2UyfSApIHsKICAgICAgICAgICAgJFF1ZXVlU3RyZyAuPSAiPGZvbnQgY29sb3I9JyRTZWxmLT57SGlnaGxpZ2h0Q29sb3IyfSc+IjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUXVldWV7TWF4QWdlfSA+PSAkU2VsZi0+e0hpZ2hsaWdodEFnZTF9ICkgewogICAgICAgICAgICAkUXVldWVTdHJnIC49ICI8Zm9udCBjb2xvcj0nJFNlbGYtPntIaWdobGlnaHRDb2xvcjF9Jz4iOwogICAgICAgIH0KCiAgICAgICAgIyB0aGUgb2xkZXN0IHF1ZXVlCiAgICAgICAgaWYgKCAkUXVldWV7UXVldWVJRH0gPT0gJFF1ZXVlSURPZk1heEFnZSApIHsKICAgICAgICAgICAgJFF1ZXVlU3RyZyAuPSAiPGJsaW5rPiI7CiAgICAgICAgfQoKICAgICAgICAjIFF1ZXVlU3RyZwogICAgICAgICRRdWV1ZVN0cmcgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTaG9ydFF1ZXVlTmFtZSApCiAgICAgICAgICAgIC4gIiAoJENvdW50ZXJ7JFF1ZXVle1F1ZXVlfX0pIjsKCiAgICAgICAgIyB0aGUgb2xkZXN0IHF1ZXVlCiAgICAgICAgaWYgKCAkUXVldWV7UXVldWVJRH0gPT0gJFF1ZXVlSURPZk1heEFnZSApIHsKICAgICAgICAgICAgJFF1ZXVlU3RyZyAuPSAiPC9ibGluaz4iOwogICAgICAgIH0KCiAgICAgICAgIyBzaG91bGQgaSBoaWdobGlnaHQgdGhpcyBxdWV1ZQogICAgICAgIGlmICggJFF1ZXVle01heEFnZX0gPj0gJFNlbGYtPntIaWdobGlnaHRBZ2UxfSB8fCAkUXVldWV7TWF4QWdlfSA+PSAkU2VsZi0+e0hpZ2hsaWdodEFnZTJ9ICkKICAgICAgICB7CiAgICAgICAgICAgICRRdWV1ZVN0cmcgLj0gIjwvZm9udD4iOwogICAgICAgIH0KICAgICAgICAkUXVldWVTdHJnIC49ICI8L2E+IjsKCiAgICAgICAgIyBzaG91bGQgaSBoaWdobGlnaHQgdGhpcyBxdWV1ZQogICAgICAgIGlmICggJFBhcmFte1NlbGVjdGVkUXVldWV9ID1+IC9eXFEkUXVldWVOYW1lWzBdXEUvICYmICRMZXZlbCA+PSAkI1F1ZXVlTmFtZSApIHsKICAgICAgICAgICAgaWYgKCAkI1F1ZXVlTmFtZSA9PSAwICYmICQjTWV0YVF1ZXVlID49IDAgJiYgJFF1ZXVle1F1ZXVlfSA9fiAvXlxRJE1ldGFRdWV1ZVswXVxFJC8gKSB7CiAgICAgICAgICAgICAgICAkUXVldWVTdHJnIC49ICc8L2I+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkI1F1ZXVlTmFtZSA9PSAxCiAgICAgICAgICAgICAgICAmJiAkI01ldGFRdWV1ZSA+PSAxCiAgICAgICAgICAgICAgICAmJiAkUXVldWV7UXVldWV9ID1+IC9eXFEkTWV0YVF1ZXVlWzBdOjokTWV0YVF1ZXVlWzFdXEUkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUXVldWVTdHJnIC49ICc8L2I+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkI1F1ZXVlTmFtZSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkI01ldGFRdWV1ZSA+PSAyCiAgICAgICAgICAgICAgICAmJiAkUXVldWV7UXVldWV9ID1+IC9eXFEkTWV0YVF1ZXVlWzBdOjokTWV0YVF1ZXVlWzFdOjokTWV0YVF1ZXVlWzJdXEUkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUXVldWVTdHJnIC49ICc8L2I+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkI1F1ZXVlTmFtZSA9PSAzCiAgICAgICAgICAgICAgICAmJiAkI01ldGFRdWV1ZSA+PSAzCiAgICAgICAgICAgICAgICAmJiAkUXVldWV7UXVldWV9CiAgICAgICAgICAgICAgICA9fiAvXlxRJE1ldGFRdWV1ZVswXTo6JE1ldGFRdWV1ZVsxXTo6JE1ldGFRdWV1ZVsyXTo6JE1ldGFRdWV1ZVszXVxFJC8KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFF1ZXVlU3RyZyAuPSAnPC9iPic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJCNRdWV1ZU5hbWUgPT0gMCApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UXVldWVTdHJnfSApIHsKICAgICAgICAgICAgICAgICRRdWV1ZVN0cmcgPSAnIC0gJyAuICRRdWV1ZVN0cmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1F1ZXVlU3RyZ30gLj0gJFF1ZXVlU3RyZzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkI1F1ZXVlTmFtZSA9PSAxICYmICRMZXZlbCA+PSAyICYmICRRdWV1ZXtRdWV1ZX0gPX4gL15cUSRNZXRhUXVldWVbMF06OlxFLyApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UXVldWVTdHJnMX0gKSB7CiAgICAgICAgICAgICAgICAkUXVldWVTdHJnID0gJyAtICcgLiAkUXVldWVTdHJnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtRdWV1ZVN0cmcxfSAuPSAkUXVldWVTdHJnOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICQjUXVldWVOYW1lID09IDIKICAgICAgICAgICAgJiYgJExldmVsID49IDMKICAgICAgICAgICAgJiYgJFF1ZXVle1F1ZXVlfSA9fiAvXlxRJE1ldGFRdWV1ZVswXTo6JE1ldGFRdWV1ZVsxXTo6XEUvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1F1ZXVlU3RyZzJ9ICkgewogICAgICAgICAgICAgICAgJFF1ZXVlU3RyZyA9ICcgLSAnIC4gJFF1ZXVlU3RyZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17UXVldWVTdHJnMn0gLj0gJFF1ZXVlU3RyZzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkI1F1ZXVlTmFtZSA9PSAzCiAgICAgICAgICAgICYmICRMZXZlbCA+PSA0CiAgICAgICAgICAgICYmICRRdWV1ZXtRdWV1ZX0gPX4gL15cUSRNZXRhUXVldWVbMF06OiRNZXRhUXVldWVbMV06OiRNZXRhUXVldWVbMl06OlxFLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZVN0cmczfSApIHsKICAgICAgICAgICAgICAgICRRdWV1ZVN0cmcgPSAnIC0gJyAuICRRdWV1ZVN0cmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1F1ZXVlU3RyZzN9IC49ICRRdWV1ZVN0cmc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJCNRdWV1ZU5hbWUgPT0gNAogICAgICAgICAgICAmJiAkTGV2ZWwgPj0gNQogICAgICAgICAgICAmJiAkUXVldWV7UXVldWV9CiAgICAgICAgICAgID1+IC9eXFEkTWV0YVF1ZXVlWzBdOjokTWV0YVF1ZXVlWzFdOjokTWV0YVF1ZXVlWzJdOjokTWV0YVF1ZXVlWzNdOjpcRS8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UXVldWVTdHJnNH0gKSB7CiAgICAgICAgICAgICAgICAkUXVldWVTdHJnID0gJyAtICcgLiAkUXVldWVTdHJnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtRdWV1ZVN0cmc0fSAuPSAkUXVldWVTdHJnOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoIDEgLi4gNSApIHsKICAgICAgICBpZiAoICRQYXJhbXsgJ1F1ZXVlU3RyZycgLiAkXyB9ICkgewogICAgICAgICAgICAkUGFyYW17J1F1ZXVlU3RyZyd9IC49ICc8YnI+JyAuICRQYXJhbXsgJ1F1ZXVlU3RyZycgLiAkXyB9OwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUXVldWVOYXYnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UmVzcG9uc2libGUucG0gLSBzZXQgdGlja2V0IHJlc3BvbnNpYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFJlc3BvbnNpYmxlLnBtLHYgMS4xIDIwMDgvMDcvMDIgMTY6Mjg6MjcgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UmVzcG9uc2libGUucG0sdiAxLjM2IDIwMDgvMDcvMDIgMTM6Mzk6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0UmVzcG9uc2libGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkIFRpY2tldElEIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICJZb3UgbmVlZCAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXMnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSBvd25lciB0byBkbyB0aGlzIGFjdGlvbiEiLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBmb3IgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBOZXdPd25lcklEIE5ld093bmVyVHlwZSBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZAogICAgICAgIEF0dGFjaG1lbnRVcGxvYWQKICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgIEF0dGFjaG1lbnREZWxldGU1IEF0dGFjaG1lbnREZWxldGU2IEF0dGFjaG1lbnREZWxldGU3IEF0dGFjaG1lbnREZWxldGU4CiAgICAgICAgQXR0YWNobWVudERlbGV0ZTkgQXR0YWNobWVudERlbGV0ZTEwIEF0dGFjaG1lbnREZWxldGUxMSBBdHRhY2htZW50RGVsZXRlMTIKICAgICAgICBBdHRhY2htZW50RGVsZXRlMTMgQXR0YWNobWVudERlbGV0ZTE0IEF0dGFjaG1lbnREZWxldGUxNSBBdHRhY2htZW50RGVsZXRlMTYKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaWNrZXRGcmVlVGV4dDE0Iik7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlByaW9yaXR5UkMiKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkVsZW1lbnRDaGFuZ2VkIikgfHwgJyc7CgogICAgIyBzZXQgUHJpb3JpdHlSQyBmcm9tIGNoYW5nZWQgYWpheCBlbGVtZW50CiAgICBpZiAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyApCiAgICAgICAgfHwgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnICkgJiYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICApICkKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgaWYgKCFkZWZpbmVkKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSAmJiAkVGlja2V0e1NlcnZpY2VJRH0pIHsKICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgIH0KCiAgICAjIHNldCBpbXBhY3QgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fTsKICAgIH0KCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtJbXBhY3RJRH0pIHsKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVLZXkkXyIgKTsKICAgICAgICAkR2V0UGFyYW17IlRpY2tldEZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIlRpY2tldEZyZWVUZXh0JF8iICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIEZSRUVUSU1FTlVNQkVSOgogICAgZm9yIG15ICRGcmVlVGltZU51bWJlciAoIDEgLi4gNiApIHsKCiAgICAgICAgIyBjcmVhdGUgZnJlZXRpbWUgcHJlZml4CiAgICAgICAgbXkgJEZyZWVUaW1lUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRGcmVlVGltZU51bWJlcjsKCiAgICAgICAgIyBnZXQgZm9ybSBwYXJhbXMKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGcmVlVGltZVByZWZpeCAuICRUeXBlICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhZGRpdGlvbmFsIHBhcmFtcwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ID0gJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkRnJlZVRpbWVOdW1iZXIgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnT3B0aW9uYWwnIH0gPSAwOwogICAgICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSB0aW1lZGF0YQogICAgICAgIG15ICRUaW1lRGF0YUNvbXBsZXRlID0gMTsKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgbmV4dCBUWVBFIGlmIGRlZmluZWQgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwoKICAgICAgICAgICAgJFRpbWVEYXRhQ29tcGxldGUgPSAwOwogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSIGlmICRUaW1lRGF0YUNvbXBsZXRlOwoKICAgICAgICBpZiAoICEkVGlja2V0eyRGcmVlVGltZVByZWZpeH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IEZSRUVUSU1FTlVNQkVSOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZXRpbWUgZGF0YSBmcm9tIHRpY2tldAogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZVN0cmluZwogICAgICAgICAgICA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICk7CiAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKCBTeXN0ZW1UaW1lID0+ICRUaWNrZXRGcmVlVGltZVN0cmluZyApOwoKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgPSAxOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01pbnV0ZScgfSA9ICRNaW51dGU7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnSG91cicgfSAgID0gJEhvdXI7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnRGF5JyB9ICAgID0gJERheTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdNb250aCcgfSAgPSAkTW9udGg7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnWWVhcicgfSAgID0gJFllYXI7CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgJEdldFBhcmFteyJBcnRpY2xlRnJlZUtleSRfIn0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBcnRpY2xlRnJlZUtleSRfIiApOwogICAgICAgICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVUZXh0JF8ifQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkFydGljbGVGcmVlVGV4dCRfIiApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICBteSAkU2l6ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSB8fCA3MDsKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oXj4uK3wuezQsJFNpemV9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yID0gKCk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9ICk7CgogICAgICAgICAgICAjIGNoZWNrIHN0YXRlIHR5cGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgZm9yIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRGF0ZSBpbnZhbGlkIn0gPSAnKiBpbnZhbGlkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBkYXRlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7IkRhdGUgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IlN1YmplY3QgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYm9keQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7IkJvZHkgaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskX30gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyJUaWNrZXRGcmVlVGV4dCRfIn0gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeyJUaWNrZXRGcmVlVGV4dEZpZWxkJF8gaW52YWxpZCJ9ID0gJyogaW52YWxpZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZSBpbnZhbGlkJ30gPSAnKiBpbnZhbGlkJzsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMKICAgICAgICAgICAgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9yeyJFeHBhbmQifSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHQgPSAoKTsKICAgICAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHsiVGlja2V0RnJlZUtleSRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0ID0gKCk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJBcnRpY2xlRnJlZUtleSRfIiwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVUZXh0JF8iLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFte1RpdGxlfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUaXRsZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17U2VydmljZUlEfSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlU2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkR2V0UGFyYW17U0xBSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQVNldCgKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte09sZE93bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb0FnZW50Tm90aWZ5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5SZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte05vQWdlbnROb3RpZnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgbm90ZQogICAgICAgIG15ICRBcnRpY2xlSUQgPSAnJzsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgPT4gIiRTZWxmLT57VXNlckZpcnN0bmFtZX0gJFNlbGYtPntVc2VyTGFzdG5hbWV9IDwkU2VsZi0+e1VzZXJFbWFpbH0+IiwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L3BsYWluOyBjaGFyc2V0PSRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eydVc2VyQ2hhcnNldCd9IiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSwKICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4KICAgICAgICAgICAgICAgICAgICBbIEB7ICRTZWxmLT57SW5mb3JtVXNlcklEfSB9LCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9LCBdLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSA9PiAwLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgIG15IEBBdHRhY2htZW50RGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICAgICAgZm9yIG15ICRSZWYgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICV7JFJlZn0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaE9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGlja2V0IGZyZWUgdGV4dAogICAgICAgIGZvciAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJEdldFBhcmFteyJUaWNrZXRGcmVlS2V5JF8ifSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR2V0UGFyYW17IlRpY2tldEZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXsiVGlja2V0RnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIGlmICgoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0pIHx8ICEkR2V0UGFyYW17U2VydmljZUlEfSkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBLZXkgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDb3VudGVyID0+IDEzLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEtleSA9PiAnSW1wYWN0SUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkR2V0UGFyYW17SW1wYWN0SUR9IHx8ICcnLAogICAgICAgICAgICBDb3VudGVyID0+IDE0LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTW9udGgnIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gKQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCggJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnTWludXRlJyB9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVRpbWU7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ1llYXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNb250aCcgfSAgID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnRGF5JyB9ICAgICA9IDA7CiAgICAgICAgICAgICAgICAkVGltZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRfIC4gJ0hvdXInIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJFRpbWV7ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdNaW51dGUnIH0gID0gMDsKICAgICAgICAgICAgICAgICRUaW1leyAnVGlja2V0RnJlZVRpbWUnIC4gJF8gLiAnU2VjdW5kZScgfSA9IDA7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkXyAuICdVc2VkJyB9ICkgewogICAgICAgICAgICAgICAgICAgICVUaW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zyb21EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sIFByZWZpeCA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJF8KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICAgICAlVGltZSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQoICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXsiQXJ0aWNsZUZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17IkFydGljbGVGcmVlVGV4dCRfIn0sCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwcmlvcml0eQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Qcmlvcml0eVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlfSAmJiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdW5sb2NrIHRoZSB0aWNrZXQgYWZ0ZXIgY2xvc2UKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSApOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSZBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgJEltcGFjdExpc3QtPnsnJ30gPSAnLSc7CgogICAgICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRKU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2UgewoKICAgICAgICAjIGZpbGx1cCB2YXJzCiAgICAgICAgaWYgKCAhZGVmaW5lZCggJEdldFBhcmFte0JvZHl9ICkgJiYgJFNlbGYtPntDb25maWd9LT57Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSApOwogICAgICAgIH0KICAgICAgICBpZiAoICFkZWZpbmVkKCAkR2V0UGFyYW17U3ViamVjdH0gKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0ID0gKCk7CiAgICAgICAgZm9yICggMSAuLiAxNiApIHsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyJUaWNrZXRGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlS2V5JF8iLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7IlRpY2tldEZyZWVUZXh0JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICJUaWNrZXRGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICApOwoKICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQgPSAoKTsKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlS2V5JF8ifSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAiQXJ0aWNsZUZyZWVLZXkkXyIsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7IkFydGljbGVGcmVlVGV4dCRfIn0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gIkFydGljbGVGcmVlVGV4dCRfIiwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICVHZXRQYXJhbSwgJVRpY2tldCwgJVRpY2tldEZyZWVUZXh0SFRNTCwgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICBJbXBhY3RzID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICBJbXBhY3RJRCA9PiAkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9LAogICAgICAgICAgICBOZXdQcmlvcml0eUlEID0+ICRUaWNrZXR7UHJpb3JpdHlJRH0sCiMgLS0tCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZSA9ICggJycsICctJyApOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgT25DaGFuZ2UgPT4KIyAgICAgICAgICAgICAgICAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgT25DaGFuZ2UgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Qcmlvcml0eVJDLnZhbHVlPScxJzsgZG9jdW1lbnQuY29tcG9zZS5zdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIsCiAgICAgICAgICAgIEFqYXggPT4gewogICAgICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICAgICAnTmV3UHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICBteSAlU0xBID0gKCk7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgT25DaGFuZ2UgPT4KICAgICAgICAgICAgICAgICJkb2N1bWVudC5jb21wb3NlLkV4cGFuZC52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ2JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ3JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ4JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQ5JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEyJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE1JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGlja2V0SUQnLAogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDQnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDYnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDcnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDgnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDknLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEwJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTInLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDEzJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE2JywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgICAgICB9LAojIC0tLQogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzICAgICAgID0gKCk7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skX30gPSAkQWxsR3JvdXBzTWVtYmVyc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IG9sZCBvd25lcgogICAgICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICRQYXJhbXtPd25lclN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDApIiwKICAgICAgICApOwogICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgIGlmIChAT2xkVXNlckluZm8pIHsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBPbGRVc2VySW5mbyApIHsKICAgICAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgICAgIGlmICggISRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIkVXNlci0+e1VzZXJGaXJzdG5hbWV9ICgkVXNlci0+e1VzZXJMb2dpbn0pIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggISVVc2VySGFzaCApIHsKICAgICAgICAgICAgJFVzZXJIYXNoeycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgbXkgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICcnOwogICAgICAgIGlmICggJFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJFBhcmFte09sZE93bmVySUR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9IC4gJzEnOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBzdHJpbmcKICAgICAgICAkUGFyYW17T2xkT3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkT2xkT3duZXJTZWxlY3RlZElELAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdPbGRPd25lcklEJywKICAgICAgICAgICAgT25DbGljayAgICA9PiAiY2hhbmdlX3NlbGVjdGVkKDIpIiwKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte05ld093bmVyVHlwZX0gJiYgJFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpPbGQnfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6TmV3J30gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lckpzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVzcG9uc2libGV9ICkgewoKICAgICAgICAjIGdldCB1c2VyIG9mIG93biBncm91cHMKICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZXNwb25zaWJsZQogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9IHx8ICRUaWNrZXR7UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgIG15ICVTdGF0ZSAgICAgPSAoKTsKICAgICAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5TdGF0ZUxpc3QoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICRTdGF0ZUxpc3R7Jyd9ID0gJy0nOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17TmV3U3RhdGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgICRQYXJhbXtTdGF0ZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSA9PiBcJVN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yICggc29ydCBrZXlzICVTdGF0ZUxpc3QgKSB7CiAgICAgICAgICAgIGlmICgkXykgewogICAgICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZVBlbmRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgICAgICRQYXJhbXsnSW1wYWN0U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBPbkNoYW5nZSA9PiAiZG9jdW1lbnQuY29tcG9zZS5FeHBhbmQudmFsdWU9JzMnOyBkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICAgICAgQWpheCA9PiB7CiAgICAgICAgICAgICAgICBVcGRhdGUgPT4gWwogICAgICAgICAgICAgICAgICAgICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBEZXBlbmQgPT4gWwogICAgICAgICAgICAgICAgICAgICdUaWNrZXRJRCcsCiAgICAgICAgICAgICAgICAgICAgJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0NycsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OCcsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0OScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTAnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDExJywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxMicsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTMnLAogICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnQUpBWFVwZGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBhY3QnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgJVByaW9yaXR5LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90ZUpzJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgYWdlbnQgbGlzdAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICBteSAlU2hvd25Vc2VycyAgICAgICA9ICgpOwogICAgICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JF99ID0gJEFsbEdyb3Vwc01lbWJlcnN7JF99OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzICA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SW52b2x2ZWRBZ2VudHMoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgIG15ICVVc2VySGFzaCA9ICgpOwogICAgICAgICAgICBteSAkQ291bnRlciAgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIGlmICggISRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyTGFzdG5hbWV9ICIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSURSZWZBcnJheSA9PiAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3BlbGxDaGVja2VyJykKICAgICAgICAgICAgJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICREYXRhUmVmICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBBcnRpY2xlVHlwZUlEIHN0cmluZwogICAgICAgIG15ICVBcnRpY2xlVHlwZSA9ICgpOwogICAgICAgIGlmICggISRQYXJhbXtBcnRpY2xlVHlwZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17QXJ0aWNsZVR5cGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwb3NzaWJsZSBub3RlcwogICAgICAgIG15ICVEZWZhdWx0Tm90ZVR5cGVzID0gJXsgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgIG15ICVOb3RlVHlwZXMgICAgICAgID0gJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgVGFibGUgPT4gJ2FydGljbGVfdHlwZScsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFdoYXQgID0+ICdpZCwgbmFtZScKICAgICAgICApOwogICAgICAgIGZvciAoIGtleXMgJU5vdGVUeXBlcyApIHsKICAgICAgICAgICAgaWYgKCAhJERlZmF1bHROb3RlVHlwZXN7ICROb3RlVHlwZXN7JF99IH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJE5vdGVUeXBlc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IFwlTm90ZVR5cGVzLAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUlEJywKICAgICAgICAgICAgJUFydGljbGVUeXBlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPnsnVGlja2V0RnJlZVRpbWUnfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBqYXZhIHNjcmlwdCBjaGVjayBmb3IgcmVxdWlyZWQgZnJlZSB0ZXh0IGZpZWxkcyBieSBmb3JtIHN1Ym1pdAogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fSB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JEtleX0gPT0gMiApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0Q2hlY2tKcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICJUaWNrZXRGcmVlVGV4dCRLZXkiLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gIlRpY2tldEZyZWVLZXkkS2V5IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgamF2YSBzY3JpcHQgY2hlY2sgZm9yIHJlcXVpcmVkIGZyZWUgdGltZSBmaWVsZHMgYnkgZm9ybSBzdWJtaXQKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0gfSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRLZXl9ID09IDIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZUNoZWNrSnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVDaGVjayA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJEtleSAuICdVc2VkJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUZpZWxkID0+ICdUaWNrZXRGcmVlVGltZScgLiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkS2V5ICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UmVzcG9uc2libGUnLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFpvb20ucG0sdiAxLjIgMjAwOC8wNi8zMCAxNjoyMDoxNiB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRab29tLnBtLHYgMS41OCAyMDA4LzA2LzI2IDExOjAyOjA4IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IENvbmZpZ09iamVjdCBVc2VyT2JqZWN0IFNlc3Npb25PYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlYnVnCiAgICAkU2VsZi0+e0RlYnVnfSA9IDA7CgogICAgIyBnZXQgcGFyYW1zCiAgICAkU2VsZi0+e0FydGljbGVJRH0gICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FydGljbGVJRCcgKTsKICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUV4cGFuZCcgKTsKICAgICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUV4cGFuZFNvcnQnICk7CiAgICBpZiAoICFkZWZpbmVkKCAkU2VsZi0+e1pvb21FeHBhbmR9ICkgKSB7CiAgICAgICAgJFNlbGYtPntab29tRXhwYW5kfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kJyk7CiAgICB9CiAgICBpZiAoICFkZWZpbmVkKCAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSApICkgewogICAgICAgICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmRTb3J0Jyk7CiAgICB9CiAgICAkU2VsZi0+e0hpZ2hsaWdodENvbG9yMX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSGlnaGxpZ2h0Q29sb3IxJyk7CiAgICAkU2VsZi0+e0hpZ2hsaWdodENvbG9yMn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSGlnaGxpZ2h0Q29sb3IyJyk7CgogICAgIyB0aWNrZXQgaWQgbG9va3VwCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXROdW1iZXInICkgKSB7CiAgICAgICAgJFNlbGYtPntUaWNrZXRJRH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldElETG9va3VwKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0TnVtYmVyJyApLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIFRpY2tldElEIGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBuZSAnU2hvd0hUTUxlTWFpbCcgKSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGxvb2t1cCBjcml0aWNhbGl0eQogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAnLSc7CiAgICBpZiAoJFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfSkgewogICAgICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57JFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfX07CiAgICB9CiAgICAjIGxvb2t1cCBpbXBhY3QKICAgICRUaWNrZXR7SW1wYWN0fSA9ICctJzsKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9KSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e0ltcGFjdH0gPSAkSW1wYWN0TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH19OwogICAgfQojIC0tLQogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgSFRNTCBlbWFpbAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Nob3dIVE1MZU1haWwnICkgewoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBBcnRpY2xlSUQKICAgICAgICBpZiAoICEkU2VsZi0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdOZWVkIEFydGljbGVJRCEnICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhcnRpY2xlIGRhdGEKICAgICAgICBteSAlQXJ0aWNsZSA9ICgpOwogICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZVRtcC0+e0FydGljbGVJRH0gZXEgJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBhcnRpY2xlIGRhdGEgZXhpc3RzCiAgICAgICAgaWYgKCAhJUFydGljbGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdJbnZhbGlkIEFydGljbGVJRCEnICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0IGlzIGEgaHRtbCBlbWFpbCwgcmV0dXJuIGhlcmUKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykKICAgICAgICAgICAgICAgIC4gIi0kQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LSRBcnRpY2xle1RpY2tldElEfS0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICIkQXJ0aWNsZXtNaW1lVHlwZX07IGNoYXJzZXQ9JEFydGljbGV7Q29udGVudENoYXJzZXR9IiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGVsc2Ugc2hvdyBub3JtYWwgdGlja2V0IHpvb20gdmlldwogICAgIyBmZXRjaCBhbGwgbW92ZSBxdWV1ZXMKICAgIG15ICVNb3ZlUXVldWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFR5cGUgICAgID0+ICdtb3ZlX2ludG8nLAogICAgKTsKCiAgICAjIGZldGNoIGFsbCBzdGQuIHJlc3BvbnNlcwogICAgbXkgJVN0ZFJlc3BvbnNlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRTdGRSZXNwb25zZXMoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwoKICAgICMgY3VzdG9tZXIgaW5mbwogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICgpOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvWm9vbScpICkgewogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRUaWNrZXR7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzaG93IHRpY2tldAogICAgJE91dHB1dCAuPSAkU2VsZi0+TWFza0FnZW50Wm9vbSgKICAgICAgICBNb3ZlUXVldWVzICAgICAgPT4gXCVNb3ZlUXVldWVzLAogICAgICAgIFN0ZFJlc3BvbnNlcyAgICA9PiBcJVN0ZFJlc3BvbnNlcywKICAgICAgICBBcnRpY2xlQm94ICAgICAgPT4gXEBBcnRpY2xlQm94LAogICAgICAgIEN1c3RvbWVyRGF0YSAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICBUaWNrZXRUaW1lVW5pdHMgPT4gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KCVUaWNrZXQpLAogICAgICAgICVUaWNrZXQsCiAgICApOwoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBNYXNrQWdlbnRab29tIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvd25lciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte093bmVySUR9LAogICAgICAgIENhY2hlZCA9PiAxCiAgICApOwoKICAgICMgcmVzcG9uc2libGUgaW5mbwogICAgbXkgJVJlc3BvbnNpYmxlSW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17UmVzcG9uc2libGVJRH0gfHwgMSwKICAgICAgICBDYWNoZWQgPT4gMQogICAgKTsKCiAgICAjIGdldCBhY2sgYWN0aW9ucwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAnLScsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAlQWNsQWN0aW9uID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBhZ2UgZGVzaWduCiAgICAkUGFyYW17QWdlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoIEFnZSA9PiAkUGFyYW17QWdlfSwgU3BhY2UgPT4gJyAnICk7CiAgICBpZiAoICRQYXJhbXtVbnRpbFRpbWV9ICkgewogICAgICAgIGlmICggJFBhcmFte1VudGlsVGltZX0gPCAtMSApIHsKICAgICAgICAgICAgJFBhcmFte1BlbmRpbmdVbnRpbH0gPSAiPGZvbnQgY29sb3I9JyRTZWxmLT57SGlnaGxpZ2h0Q29sb3IyfSc+IjsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1BlbmRpbmdVbnRpbH0KICAgICAgICAgICAgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSggQWdlID0+ICRQYXJhbXtVbnRpbFRpbWV9LCBTcGFjZSA9PiAnPGJyPicgKTsKICAgICAgICBpZiAoICRQYXJhbXtVbnRpbFRpbWV9IDwgLTEgKSB7CiAgICAgICAgICAgICRQYXJhbXtQZW5kaW5nVW50aWx9IC49ICI8L2ZvbnQ+IjsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0hlYWRlcicsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgKTsKCiAgICAjIHRpY2tldCB0aXRsZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGl0bGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgcnVuIHRpY2tldCBtZW51IG1vZHVsZXMKICAgIGlmICggcmVmKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZScpICkgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyAgID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRNZW51c3skTWVudX0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0CiAgICAgICAgICAgICAgICAgICAgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0ICA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQUNMICAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBDb25maWcgID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICBteSAkTGlua0xpc3RXaXRoRGF0YSA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgIEtleSAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBsaW5rIHRhYmxlIHZpZXcgbW9kZQogICAgbXkgJExpbmtUYWJsZVZpZXdNb2RlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICRMaW5rVGFibGVWaWV3TW9kZSwKICAgICk7CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkQmFzZUxpbmsgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICJUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSYiOwogICAgbXkgQEFydGljbGVCb3ggPSBAeyAkUGFyYW17QXJ0aWNsZUJveH0gfTsKCiAgICAjIGdldCBzZWxlY3RlZCBvciBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgIG15ICRDb3VudGVyQXJyYXkgPSAwOwogICAgbXkgJEFydGljbGVJRDsKICAgIGlmICggJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e0FydGljbGVJRH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzZXQgZmlyc3QgYXJ0aWNsZQogICAgICAgIGlmIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJEFydGljbGVCb3hbMF0tPntBcnRpY2xlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlVG1wLT57U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZVRtcC0+e0FydGljbGVJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0aHJlYWQgc3RyaW5nCiAgICBteSAkQ291bnRlciAgICAgICAgPSAnJzsKICAgIG15ICRTcGFjZSAgICAgICAgICA9ICcnOwogICAgbXkgJExhc3RTZW5kZXJUeXBlID0gJyc7CgogICAgIyBjaGVjayBpZiBleHBhbmQgdmlldyBpcyB1c2FibGUgKG9ubHkgZm9yIGxlc3MgdGhlbiAzMDAgYXJ0aWNsZXMpCiAgICAjIGlmIHlvdSBoYXZlIG1vcmUgYXJ0aWNsZXMgaXMgZ29pbmcgdG8gYmUgc2xvdyBhbmQgbm90IHVzYWJsZQogICAgbXkgJEFydGljbGVNYXhMaW1pdCA9IDMwMDsKICAgIGlmICggJFNlbGYtPntab29tRXhwYW5kfSAmJiAkI0FydGljbGVCb3ggPiAkQXJ0aWNsZU1heExpbWl0ICkgewogICAgICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gPSAwOwogICAgfQoKICAgICMgZ2V0IHNob3duIGFydGljbGUocykKICAgIG15IEBOZXdBcnRpY2xlQm94ID0gKCk7CiAgICBpZiAoICEkU2VsZi0+e1pvb21FeHBhbmR9ICkgewogICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xlVG1wLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgIHB1c2goIEBOZXdBcnRpY2xlQm94LCAkQXJ0aWNsZVRtcCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgQE5ld0FydGljbGVCb3ggPSBAQXJ0aWNsZUJveDsKICAgIH0KCiAgICAjIHJlc29ydCBhcnRpY2xlIG9yZGVyCiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9IGVxICdyZXZlcnNlJyApIHsKICAgICAgICBAQXJ0aWNsZUJveCA9IHJldmVyc2UoQEFydGljbGVCb3gpOwogICAgfQoKICAgICMgYnVpbGQgc2hvd24gYXJ0aWNsZShzKQogICAgbXkgJENvdW50ICAgICAgPSAwOwogICAgbXkgJEJvZHlPdXRwdXQgPSAnJzsKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQE5ld0FydGljbGVCb3gpIHsKICAgICAgICAkQ291bnQrKzsKICAgICAgICBteSAlQXJ0aWNsZSA9ICUkQXJ0aWNsZVRtcDsKCiAgICAgICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICAgICAgaWYgKCBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKCAlUGFyYW0sICVBcnRpY2xlICkgKSB7CiAgICAgICAgICAgICRBcnRpY2xleyJCb2R5Tm90ZSJ9ID0gJE1pbWVUeXBlVGV4dDsKICAgICAgICAgICAgJEFydGljbGV7IkJvZHkifSAgICAgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICAgICAkQXJ0aWNsZXsiQm9keUhUTUwifSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIGNoYXJzZXQgY2hlY2sKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgbXkgJENoYXJzZXRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja0NoYXJzZXQoCiAgICAgICAgICAgICAgICAgICAgQ29udGVudENoYXJzZXQgPT4gJEFydGljbGV7Q29udGVudENoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXsiQm9keU5vdGUifSA9ICRDaGFyc2V0VGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCb2R5JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsIEJvZHkgPT4gJEFydGljbGV7IkJvZHlIVE1MIn0sICVBY2xBY3Rpb24gfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYXJ0aWNsZSB0cmVlCiAgICAgICAgaWYgKCAkQ291bnQgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2hvdyBzdGF0dXMgaW5mbwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdHVzJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGlja2V0IHR5cGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGlja2V0IHNlcnZpY2UKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFBhcmFte1NlcnZpY2V9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17U0xBfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGZpcnN0IHJlc3BvbnNlIHRpbWUgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSApICkgewogICAgICAgICAgICAgICAgJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgICAgICAgICAgQWdlICAgPT4gJFBhcmFteydGaXJzdFJlc3BvbnNlVGltZSd9LAogICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgICAgICAgICBBZ2UgICA9PiAkUGFyYW17J0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUnfSwKICAgICAgICAgICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkUGFyYW17Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRmlyc3RSZXNwb25zZVRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgdXBkYXRlIHRpbWUgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICggZGVmaW5lZCggJFBhcmFte1VwZGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VXBkYXRlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICAgICAgICAgIEFnZSAgID0+ICRQYXJhbXsnVXBkYXRlVGltZSd9LAogICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17VXBkYXRlVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICAgICAgICAgIEFnZSAgID0+ICRQYXJhbXsnVXBkYXRlVGltZVdvcmtpbmdUaW1lJ30sCiAgICAgICAgICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkUGFyYW17VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZUZvbnRTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWVGb250U3RvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgc29sdXRpb24gdGltZSBpZiBuZWVkZWQKICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17U29sdXRpb25UaW1lfSApICkgewogICAgICAgICAgICAgICAgJFBhcmFte1NvbHV0aW9uVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICAgICAgICAgIEFnZSAgID0+ICRQYXJhbXsnU29sdXRpb25UaW1lJ30sCiAgICAgICAgICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgICAgICAgICBBZ2UgICA9PiAkUGFyYW17J1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lJ30sCiAgICAgICAgICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRQYXJhbXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZUZvbnRTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZUZvbnRTdG9wJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3VzdG9tZXIgaW5mbyBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvWm9vbScpICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICV7ICRQYXJhbXtDdXN0b21lckRhdGF9IH0sIH0sCiAgICAgICAgICAgICAgICAgICAgTWF4ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9ab29tTWF4U2l6ZScpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVVzZXJJbmZvLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVSZXNwb25zaWJsZUluZm8sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3V0cHV0IHRoZSBzaW1wbGUgbGluayB0YWJsZQogICAgICAgICAgICBpZiAoICRMaW5rVGFibGVTdHJnICYmICRMaW5rVGFibGVWaWV3TW9kZSBlcSAnU2ltcGxlJyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlU2ltcGxlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTGlua1RhYmxlU3RyZyA9PiAkTGlua1RhYmxlU3RyZywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIENPVU5UOgogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgKCAoJENvdW50ID49IDEzKSAmJiAoJENvdW50IDw9IDE2KSApOwojIC0tLQogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCAuICc6OkxpbmsnICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dFBsYWluJyAuICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXkgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dExpbmsnIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dExpbmsgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgLiAnOjpMaW5rJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgdGhyZWFkIHN0cmluZwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkQ291bnRlclRyZWUgICAgPSAwOwogICAgICAgICAgICBteSAkQ291bnRlciAgICAgICAgPSAnJzsKICAgICAgICAgICAgbXkgJFNwYWNlICAgICAgICAgID0gJyc7CiAgICAgICAgICAgIG15ICRMYXN0U2VuZGVyVHlwZSA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgICAgICBteSAlQXJ0aWNsZSA9ICUkQXJ0aWNsZVRtcDsKICAgICAgICAgICAgICAgIG15ICRTdGFydCAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkU3RvcCAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJFN0YXJ0MiAgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRTdG9wMiAgID0gJyc7CiAgICAgICAgICAgICAgICAkQ291bnRlclRyZWUrKzsKICAgICAgICAgICAgICAgIG15ICRUbXBTdWJqZWN0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xle1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRMYXN0U2VuZGVyVHlwZSBuZSAkQXJ0aWNsZXtTZW5kZXJUeXBlfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ291bnRlciAuPSAiJm5ic3A7IjsKICAgICAgICAgICAgICAgICAgICAkU3BhY2UgPSAiJENvdW50ZXImbmJzcDt8LS0mZ3Q7IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRMYXN0U2VuZGVyVHlwZSA9ICRBcnRpY2xle1NlbmRlclR5cGV9OwoKICAgICAgICAgICAgICAgICMgaWYgdGhpcyBpcyB0aGUgc2hvd24gYXJ0aWNsZSAtPT4gYWRkIDxiPgogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFN0YXJ0ICA9ICc8aT48dT4nOwogICAgICAgICAgICAgICAgICAgICRTdGFydDIgPSAnPGI+JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGlmIHRoaXMgaXMgdGhlIHNob3duIGFydGljbGUgLT0+IGFkZCA8L2I+CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkU3RvcCAgPSAnPC91PjwvaT4nOwogICAgICAgICAgICAgICAgICAgICRTdG9wMiA9ICc8L2I+JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyBhbHNvIGV4cGFuZC9jb2xsYXBzZSBpY29uCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICRUbXBTdWJqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBTcGFjZSAgICAgICAgICA9PiAkU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ICAgICAgICAgID0+ICRTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcCAgICAgICAgICAgPT4gJFN0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0MiAgICAgICAgID0+ICRTdGFydDIsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3AyICAgICAgICAgID0+ICRTdG9wMiwKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50ZXJUcmVlLAogICAgICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kU29ydCA9PiAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNob3cgcGxhaW4gbGluawogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQbGFpblZpZXcnKQogICAgICAgICAgICAgICAgICAgICYmICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvXmVtYWlsLwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUVtYWlsJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVBcnRpY2xlLCB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudCBpY29ucwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRBcnRpY2xle0F0bXN9CiAgICAgICAgICAgICAgICAgICAgJiYgJXsgJEFydGljbGV7QXRtc30gfQogICAgICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21BdHRhY2htZW50RGlzcGxheScpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRUaXRsZSA9ICcnOwoKICAgICAgICAgICAgICAgICAgICAjIGRvd25sb2FkIHR5cGUKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50RG93bmxvYWRUeXBlJykKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJ2F0dGFjaG1lbnQnOwoKICAgICAgICAgICAgICAgICAgICAjIGlmIGF0dGFjaG1lbnQgd2lsbCBiZSBmb3JjZWQgdG8gZG93bmxvYWQsIGRvbid0IG9wZW4gYSBuZXcgZG93bmxvYWQgd2luZG93IQogICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRUeXBlID1+IC9pbmxpbmUvaSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldCA9ICd0YXJnZXQ9ImF0dGFjaG1lbnQiICc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRab29tQXR0YWNobWVudERpc3BsYXlDb3VudAogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21BdHRhY2htZW50RGlzcGxheUNvdW50Jyk7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gKCAkWm9vbUF0dGFjaG1lbnREaXNwbGF5Q291bnQgKyAxICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEFydGljbGV7QXRtc30tPnskQ291bnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ291bnQgPiAkWm9vbUF0dGFjaG1lbnREaXNwbGF5Q291bnQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1BdHRhY2htZW50TW9yZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyAkQXJ0aWNsZXtBdG1zfS0+eyRDb3VudH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQgPT4gJFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkQXJ0aWNsZXtBdG1zfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1BdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7ICRBcnRpY2xle0F0bXN9LT57JENvdW50fSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCA9PiAkVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgZXhwYW5kL2NvbGxhcHNlIHZpZXcgaXMgdXNhYmxlIChvbmx5IGZvciBsZXNzIHRoZW4gMzAwIGFydGljbGVzKQogICAgICAgIGlmICggJENvdW50ID09IDEgJiYgJCNBcnRpY2xlQm94IDwgJEFydGljbGVNYXhMaW1pdCApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDb2xsYXBzZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kU29ydCA9PiAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwYW5kJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmQgICAgID0+ICRTZWxmLT57Wm9vbUV4cGFuZH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgICAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskX30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXskX30sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBhY2NvdW50ZWQgYXJ0aWNsZSB0aW1lCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tVGltZURpc3BsYXknKSApIHsKICAgICAgICAgICAgbXkgJEFydGljbGVUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICJSb3ciLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xlVGltZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRfIn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZUtleSRfIn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJ1biBhcnRpY2xlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVWaWV3TW9kdWxlJykgKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVWaWV3TW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIG15IEBEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgID0gJE9iamVjdC0+Q2hlY2soIEFydGljbGUgPT4gXCVBcnRpY2xlLCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF0YVJlZiAoQERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgZmlsdGVyIG9wdGlvbgogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkZpbHRlciggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCB0aGUgY29tcGxleCBsaW5rIHRhYmxlCiAgICAgICAgaWYgKAogICAgICAgICAgICAkTGlua1RhYmxlU3RyZwogICAgICAgICAgICAmJiAkTGlua1RhYmxlVmlld01vZGUgZXEgJ0NvbXBsZXgnCiAgICAgICAgICAgICYmICRBcnRpY2xlVG1wIGVxICROZXdBcnRpY2xlQm94Wy0xXQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlQ29tcGxleCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IFN0ZFJlc3BvbnNlc1N0cmcKICAgICAgICAkUGFyYW17U3RkUmVzcG9uc2VzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldFN0ZFJlc3BvbnNlU3RyaW5nKAogICAgICAgICAgICBTdGRSZXNwb25zZXNSZWYgPT4gJFBhcmFte1N0ZFJlc3BvbnNlc30sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRhY21lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKCiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBibG9jayBmb3IgYXR0YWNobWVudHMKICAgICAgICBpZiAoJUF0bUluZGV4KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgS2V5ID0+ICdBdHRhY2htZW50JywgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUF0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVGaWxlLCB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gYXJ0aWNsZSBhdHRhY2htZW50IG1vZHVsZXMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgcmVmKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUF0dGFjaG1lbnRNb2R1bGUnKSApIGVxCiAgICAgICAgICAgICAgICAnSEFTSCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJUpvYnMKICAgICAgICAgICAgICAgICAgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQXR0YWNobWVudE1vZHVsZScpIH07CiAgICAgICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlID0+IHsgJUZpbGUsIEZpbGVJRCA9PiAkRmlsZUlELCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICglRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICREYXRhe0Jsb2NrfSB8fCAnQXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZWxlY3QgdGhlIG91dHB1dCB0ZW1wbGF0ZQogICAgICAgIGlmICggJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9ebm90ZS9pICkgewoKICAgICAgICAgICAgIyB3aXRob3V0IGNvbXBvc2UgbGlua3MhCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPX4gL14kU2VsZi0+e1VzZXJMb2dpbn0kL2kKICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkFnZW50Q2FuQmVDdXN0b21lcicpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRJc0N1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBcnRpY2xlQ29tJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHByaW50IGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFByaW50fQogICAgICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCggJEFjbEFjdGlvbntBZ2VudFRpY2tldFByaW50fSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQcmludH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkT0spIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFydGljbGVDb21QcmludCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHdpdGhvdXQgYWxsIQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID1+IC9eJFNlbGYtPntVc2VyTG9naW59JC9pCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpBZ2VudENhbkJlQ3VzdG9tZXInKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50SXNDdXN0b21lcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGNvbXBvc2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE9rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXJDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgcGhvbmUgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfSApCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lT3V0Ym91bmQiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXJQaG9uZU91dGJvdW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFydGljbGVDb20nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgcHJpbnQgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0UHJpbnR9CiAgICAgICAgICAgICAgICAmJiAoICFkZWZpbmVkKCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UHJpbnR9ICkgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFByaW50fSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRPSyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRPSykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QXJ0aWNsZUNvbVByaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZvcndhcmQgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Rm9yd2FyZH0KICAgICAgICAgICAgICAgICYmICggIWRlZmluZWQoICRBY2xBY3Rpb257QWdlbnRUaWNrZXRGb3J3YXJkfSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRGb3J3YXJkfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEZvcndhcmQiKTsKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRPSyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCggVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFydGljbGVDb21Gb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIGJvdW5jZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRCb3VuY2V9CiAgICAgICAgICAgICAgICAmJiAoICFkZWZpbmVkKCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Qm91bmNlfSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRCb3VuY2V9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Qm91bmNlIik7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Mb2NrSXNUaWNrZXRMb2NrZWQoIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gKSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBcnRpY2xlQ29tQm91bmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIHNwbGl0IGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lfQogICAgICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCggJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lfSApIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZX0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QXJ0aWNsZUNvbVBob25lJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBNb3ZlUXVldWVzU3RyZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TW92ZVR5cGUnKSA9fiAvXmZvcm0kL2kgKSB7CiAgICAgICAgJFBhcmFte01vdmVRdWV1ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3RRdWV1ZUlEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17TW92ZVF1ZXVlc30sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0TW92ZX0KICAgICAgICAmJiAoICFkZWZpbmVkKCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gKSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAnbW92ZScsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNb3ZlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0Zvb3RlcicsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgKTsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3VzdG9tZXJUaWNrZXRQcmludC5wbSx2IDEuMSAyMDA4LzA3LzAyIDE4OjU5OjA3IHViIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFByaW50LnBtLHYgMS4yMSAyMDA4LzA2LzIwIDE2OjIxOjQ0IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VzZXJPYmplY3R9ICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1BERk9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UERGLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKICAgIG15ICRRdWV1ZUlEOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvciggTWVzc2FnZSA9PiAnTmVlZCBUaWNrZXRJRCEnICk7CiAgICB9CiAgICAkUXVldWVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UXVldWVJRCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgIGlmICggISRRdWV1ZUlEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yKCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldElEIScgKTsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBpZiAoCiAgICAgICAgISRTZWxmLT57VGlja2V0T2JqZWN0fS0+Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGdldCBjb250ZW50CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBsb29rdXAgY3JpdGljYWxpdHkKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJy0nOwogICAgaWYgKCRUaWNrZXR7VGlja2V0RnJlZVRleHQxM30pIHsKICAgICAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICAgICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxM319OwogICAgfQogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkVGlja2V0e0ltcGFjdH0gPSAnLSc7CiAgICBpZiAoJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fSkgewogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtJbXBhY3R9ID0gJEltcGFjdExpc3QtPnskVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9fTsKICAgIH0KIyAtLS0KICAgIG15IEBDdXN0b21lckFydGljbGVUeXBlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMaXN0KCBUeXBlID0+ICdDdXN0b21lcicgKTsKICAgIG15IEBBcnRpY2xlQm94ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFydGljbGVUeXBlICAgICAgICAgICAgICAgID0+IFxAQ3VzdG9tZXJBcnRpY2xlVHlwZXMsCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICk7CiAgICAkVGlja2V0e1RpY2tldFRpbWVVbml0c30gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICApOwoKICAgICMgY3VzdG9tZXIgaW5mbwogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICgpOwogICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRUaWNrZXR7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyBzb21lIGh0bWwgcXVvdGluZwogICAgJFRpY2tldHtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSggQWdlID0+ICRUaWNrZXR7QWdlfSwgU3BhY2UgPT4gJyAnICk7CiAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSApIHsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJy0nOwogICAgfQoKICAgICMgZ2VuZXJhdGUgcGRmIG91dHB1dAogICAgaWYgKCAkU2VsZi0+e1BERk9iamVjdH0gKSB7CiAgICAgICAgbXkgJFByaW50ZWRCeSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdwcmludGVkIGJ5Jyk7CiAgICAgICAgbXkgJFRpbWUgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAnJEVudnsiVGltZSJ9JyApOwogICAgICAgIG15ICRVcmwgICAgICAgPSAnICc7CiAgICAgICAgaWYgKCAkRU5We1JFUVVFU1RfVVJJfSApIHsKICAgICAgICAgICAgJFVybCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIdHRwVHlwZScpIC4gJzovLycKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKQogICAgICAgICAgICAgICAgLiAkRU5We1JFUVVFU1RfVVJJfTsKICAgICAgICB9CiAgICAgICAgbXkgJVBhZ2U7CgogICAgICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1BERjo6TWF4UGFnZXMnKTsKICAgICAgICBpZiAoICEkUGFnZXtNYXhQYWdlc30gfHwgJFBhZ2V7TWF4UGFnZXN9IDwgMSB8fCAkUGFnZXtNYXhQYWdlc30gPiAxMDAwICkgewogICAgICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAxMDA7CiAgICAgICAgfQogICAgICAgIG15ICRIZWFkZXJSaWdodCAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICAgICAgbXkgJEhlYWRsaW5lTGVmdCA9ICRIZWFkZXJSaWdodDsKICAgICAgICBteSAkVGl0bGUgICAgICAgID0gJEhlYWRlclJpZ2h0OwogICAgICAgIGlmICggJFRpY2tldHtUaXRsZX0gKSB7CiAgICAgICAgICAgICRIZWFkbGluZUxlZnQgPSAkVGlja2V0e1RpdGxlfTsKICAgICAgICAgICAgJFRpdGxlIC49ICcgLyAnIC4gJFRpY2tldHtUaXRsZX07CiAgICAgICAgfQoKICAgICAgICAkUGFnZXtNYXJnaW5Ub3B9ICAgID0gMzA7CiAgICAgICAgJFBhZ2V7TWFyZ2luUmlnaHR9ICA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5MZWZ0fSAgID0gNDA7CiAgICAgICAgJFBhZ2V7SGVhZGVyUmlnaHR9ICA9ICRIZWFkZXJSaWdodDsKICAgICAgICAkUGFnZXtIZWFkbGluZUxlZnR9ID0gJEhlYWRsaW5lTGVmdDsKICAgICAgICAkUGFnZXtIZWFkbGluZVJpZ2h0fQogICAgICAgICAgICA9ICRQcmludGVkQnkgLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyTGFzdG5hbWV9IC4gJyAoJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpICcKICAgICAgICAgICAgLiAkVGltZTsKICAgICAgICAkUGFnZXtGb290ZXJMZWZ0fSA9ICRVcmw7CiAgICAgICAgJFBhZ2V7UGFnZVRleHR9ICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGFnZScpOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0gID0gMTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRUaXRsZSwKICAgICAgICAgICAgRW5jb2RlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0SW5mb3MoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGV4dCBmaWVsZHMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldEZyZWVUZXh0KAogICAgICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aWNrZXQgZnJlZXRpbWUgZmllbGRzCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRGcmVlVGltZSgKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY3VzdG9tZXIgaW5mb3MKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dEN1c3RvbWVySW5mb3MoCiAgICAgICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYXJ0aWNsZXMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEFydGljbGVzKAogICAgICAgICAgICBQYWdlRGF0YSAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIEFydGljbGVEYXRhID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgbXkgJEZpbGVuYW1lID0gJ1RpY2tldF8nIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwogICAgICAgIG15ICRQREZTdHJpbmcgPSAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50T3V0cHV0KCk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lIC4gIl8iIC4gIiRZLSRNLSREIiAuICJfIiAuICIkaC0kbS5wZGYiLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiYXBwbGljYXRpb24vcGRmIiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFBERlN0cmluZywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CgogICAgICAgICMgb3V0cHV0IGN1c3RvbWVyIGluZm9zCiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIE1heCAgPT4gMTAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpY2tldAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9IVE1MTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQXJ0aWNsZUJveCA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKCiAgICAgICAgIyByZXR1cm4gb3V0cHV0CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0SW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1N0YXRlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e1N0YXRlfSApLAogICAgICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICB7CiMgICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUHJpb3JpdHknKSAuICc6JywKIyAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e1ByaW9yaXR5fSApLAojICAgICAgICB9LAojIC0tLQogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1F1ZXVlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7UXVldWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTG9jaycpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFRpY2tldHtMb2NrfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXJJRCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHR5cGUgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VHlwZX0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgc2VydmljZSBhbmQgc2xhIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICBteSAkUm93U2VydmljZSA9IHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgICAgICBteSAkUm93U0xBID0gewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NMQScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1NMQX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NMQSApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15ICRUYWJsZUxlZnRFeHRlbmRlZCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFRpY2tldHtDcml0aWNhbGl0eX0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0ltcGFjdCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVGlja2V0e0ltcGFjdH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ByaW9yaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRUaWNrZXR7UHJpb3JpdHl9KSwKICAgICAgICB9LAogICAgXTsKICAgIHB1c2goQHskVGFibGVMZWZ0fSwgQHskVGFibGVMZWZ0RXh0ZW5kZWR9KTsKIyAtLS0KCiAgICAjIGNyZWF0ZSByaWdodCB0YWJsZQogICAgbXkgJFRhYmxlUmlnaHQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQWdlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e0FnZX0gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBY2NvdW50ZWQgdGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldFRpbWVVbml0c30sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQZW5kaW5nIHRpbGwnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtQZW5kaW5nVW50aWx9LAogICAgICAgIH0sCiAgICBdOwoKICAgIG15ICRSb3dzID0gQHskVGFibGVMZWZ0fTsKICAgIGlmICggQHskVGFibGVSaWdodH0gPiAkUm93cyApIHsKICAgICAgICAkUm93cyA9IEB7JFRhYmxlUmlnaHR9OwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntWYWx1ZX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0JhY2tncm91bmRDb2xvcn0gPSAnI0ZGRkZGRic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bNF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntWYWx1ZX07CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSAxNzAuNTsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzJde1dpZHRofSA9IDQ7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVszXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzRde1dpZHRofSA9IDE3MC41OwoKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JFdmVufSA9ICcjQUFBQUFBJzsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvck9kZH0gID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICAgICAgPSAzOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldEZyZWVUZXh0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgPSAwOwogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgZ2VuZXJhdGUgdGFibGUKICAgIGZvciAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIGFuZCAxNAogICAgICAgIGlmICgkXyBlcSAxMyB8fCAkXyBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRUaWNrZXR7IlRpY2tldEZyZWVUZXh0JF8ifSBuZSAiIiApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZUtleSRfIn0gLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZVRleHQkXyJ9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIG91dHB1dCB0aWNrZXQgZnJlZXRleHQKICAgIGlmICgkT3V0cHV0KSB7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1RpY2tldEZyZWVUZXh0JyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dFRpY2tldEZyZWVUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgPSAwOwogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgICMgZ2VuZXJhdGUgdGFibGUKICAgIGZvciAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRUaWNrZXR7IlRpY2tldEZyZWVUaW1lJF8ifSApIHsKICAgICAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lS2V5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkXyApIHx8ICcnOwogICAgICAgICAgICBteSAkVGlja2V0RnJlZVRpbWUgPSAkVGlja2V0eyJUaWNrZXRGcmVlVGltZSRfIn07CgogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkVGlja2V0RnJlZVRpbWVLZXkgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUaWNrZXRGcmVlVGltZSA9PiAkVGlja2V0RnJlZVRpbWUsIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGltZQogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0RnJlZVRpbWUnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0Q3VzdG9tZXJJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFBhZ2VEYXRhIEN1c3RvbWVyRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgICAgICAgPSAwOwogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICV7ICRQYXJhbXtDdXN0b21lckRhdGF9IH07CiAgICBteSAlUGFnZSAgICAgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKICAgIG15ICRNYXAgPSAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntNYXB9OwoKICAgICMgY2hlY2sgaWYgY3VzdG9tZXIgY29tcGFueSBzdXBwb3J0IGlzIGVuYWJsZWQKICAgIGlmICggJEN1c3RvbWVyRGF0YXtDb25maWd9LT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0gKSB7CiAgICAgICAgbXkgJE1hcDIgPSAkQ3VzdG9tZXJEYXRhe0NvbXBhbnlDb25maWd9LT57TWFwfTsKICAgICAgICBpZiAoJE1hcDIpIHsKICAgICAgICAgICAgcHVzaCggQHskTWFwfSwgQHskTWFwMn0gKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJEZpZWxkICggQHskTWFwfSApIHsKICAgICAgICBpZiAoICR7JEZpZWxkfVszXSAmJiAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfSApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkeyRGaWVsZH1bMV0gKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfTsKCiAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgJE91dHB1dCA9IDE7CiAgICAgICAgfQogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXIgSW5mb3MnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXJ0aWNsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhQYWdlRGF0YSBBcnRpY2xlRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVQYWdlID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICRGaXJzdEFydGljbGUgPSAxOwogICAgZm9yIG15ICRBcnRpY2xlVG1wICggQHsgJFBhcmFte0FydGljbGVEYXRhfSB9ICkgewogICAgICAgIGlmICgkRmlyc3RBcnRpY2xlKSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FydGljbGVzJyksCiAgICAgICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaXJzdEFydGljbGUgPSAwOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNtZW50IHN0cmluZwogICAgICAgIG15ICVBdG1JbmRleCA9ICgpOwogICAgICAgIGlmICggJEFydGljbGV7QXRtc30gKSB7CiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQogICAgICAgIG15ICRBdHRhY2htZW50czsKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkQXR0YWNobWVudHMgLj0gJEZpbGV7RmlsZW5hbWV9IC4gJyAoJyAuICRGaWxle0ZpbGVzaXplfSAuICIpXG4iOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBhcnRpY2xlIGluZm8gdGFibGUKICAgICAgICBteSAlVGFibGVQYXJhbTE7CiAgICAgICAgbXkgJFJvdyA9IDA7CiAgICAgICAgZm9yIChxdyhGcm9tIFRvIENjIFN1YmplY3QpKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7JF99ICkgewogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJF8pIC4gJzonOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXskX307CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifScsCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICApOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2J5Jyk7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAuPSAnICcgLiAkQXJ0aWNsZXtTZW5kZXJUeXBlfTsKICAgICAgICAkUm93Kys7CiAgICAgICAgZm9yICggMSAuLiAzICkgewoKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkXyJ9IC4gJzonOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifTsKICAgICAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7QXJ0aWNsZVR5cGV9OwogICAgICAgICRSb3crKzsKCiAgICAgICAgaWYgKCRBdHRhY2htZW50cykgewogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50JykgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgIGNob21wKCRBdHRhY2htZW50cyk7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXR0YWNobWVudHM7CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBpbmZvcykKICAgICAgICAkVGFibGVQYXJhbTF7VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFtMXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTF7Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGluZm9zKQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgYm9keSkKICAgICAgICBteSAlVGFibGVQYXJhbTI7CiAgICAgICAgJFRhYmxlUGFyYW0ye0NlbGxEYXRhfVswXVswXXtDb250ZW50fSA9ICRBcnRpY2xle0JvZHl9IHx8ICcgJzsKICAgICAgICAkVGFibGVQYXJhbTJ7VHlwZX0gICAgICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JvcmRlcn0gICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnR9ICAgICAgICAgICAgICAgICAgICA9ICdNb25vc3BhY2VkJzsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udFNpemV9ICAgICAgICAgICAgICAgID0gNzsKICAgICAgICAkVGFibGVQYXJhbTJ7QmFja2dyb3VuZENvbG9yfSAgICAgICAgID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nfSAgICAgICAgICAgICAgICAgPSA0OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nVG9wfSAgICAgICAgICAgICAgPSA4OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nQm90dG9tfSAgICAgICAgICAgPSA4OwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBib2R5KQogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMiA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMiwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMntTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX0hUTUxNYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvdXRwdXQgdHlwZSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZpY2UgYW5kIHNsYSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlID0+ICRQYXJhbXtTZXJ2aWNlfSB8fCAnLScsCiAgICAgICAgICAgICAgICBTTEEgICAgID0+ICRQYXJhbXtTTEF9ICAgICB8fCAnLScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGV4dCAxMyBhbmQgMTQKICAgICAgICBpZiAoJENvdW50IGVxIDEzIHx8ICRDb3VudCBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIGFydGljbGUgc3R1ZmYKICAgIG15ICRTZWxlY3RlZEFydGljbGVJRCA9ICRQYXJhbXtBcnRpY2xlSUR9IHx8ICcnOwogICAgbXkgQEFydGljbGVCb3ggPSBAeyAkUGFyYW17QXJ0aWNsZUJveH0gfTsKCiAgICAjIGdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICBteSAlQXJ0aWNsZSA9ICV7JEFydGljbGVUbXB9OwoKICAgICAgICAjIGdldCBhdHRhY21lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFteyJBcnRpY2xlOjpBVE0ifSA9ICcnOwogICAgICAgIGZvciBteSAkRmlsZUlEICgga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRGaWxle0ZpbGVuYW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkRmlsZXtGaWxlbmFtZX0gKTsKICAgICAgICAgICAgJFBhcmFteyJBcnRpY2xlOjpBVE0ifQogICAgICAgICAgICAgICAgLj0gJzxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRBdHRhY2htZW50JicKICAgICAgICAgICAgICAgIC4gIkFydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9JkZpbGVJRD0kRmlsZUlEXCIgdGFyZ2V0PVwiYXR0YWNobWVudFwiICIKICAgICAgICAgICAgICAgIC4gIm9ubW91c2VvdmVyPVwid2luZG93LnN0YXR1cz0nXCRUZXh0e1wiRG93bmxvYWRcIn06ICRGaWxle0ZpbGVuYW1lfSc7IgogICAgICAgICAgICAgICAgLiAnIHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz1cJ1wnOyI+JwogICAgICAgICAgICAgICAgLiAiJEZpbGV7RmlsZW5hbWV9PC9hPiAkRmlsZXtGaWxlc2l6ZX08YnI+IjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYganVzdCBhIG9ubHkgaHRtbCBlbWFpbAogICAgICAgIGlmICgKICAgICAgICAgICAgbXkgJE1pbWVUeXBlVGV4dAogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tNaW1lVHlwZSggJVBhcmFtLCAlQXJ0aWNsZSwgQWN0aW9uID0+ICdBZ2VudFRpY2tldFpvb20nICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFteyJUZXh0Tm90ZSJ9ID0gJE1pbWVUeXBlVGV4dDsKICAgICAgICAgICAgJEFydGljbGV7IkJvZHkifSAgID0gJyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBOZXdMaW5lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld0xpbmVzJykgfHwgNTAwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gY2hhcnNldCBjaGVjawogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCgKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50Q2hhcnNldCA9PiAkQXJ0aWNsZXtDb250ZW50Q2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRQYXJhbXsiQXJ0aWNsZTo6VGV4dE5vdGUifSA9ICRDaGFyc2V0VGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwoKICAgICAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgICAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskX30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXskX30sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBhY2NvdW50ZWQgYXJ0aWNsZSB0aW1lCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tVGltZURpc3BsYXknKSApIHsKICAgICAgICAgICAgbXkgJEFydGljbGVUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiUm93IiwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdUaW1lJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZVRpbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgZm9yICggMSAuLiAzICkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkXyJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkXyJ9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JF8ifSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lclRpY2tldFByaW50JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lclRpY2tldFpvb20ucG0sdiAxLjEgMjAwOC8wNy8wMiAxOToxNjoxNCB1YiBFeHAgJAojICRPbGRJZDogQ3VzdG9tZXJUaWNrZXRab29tLnBtLHYgMS4yNiAyMDA4LzA1LzE1IDIyOjA1OjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdAogICAgICAgIENvbmZpZ09iamVjdCBVc2VyT2JqZWN0IFNlc3Npb25PYmplY3QKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgYXJ0aWNsZSBpZAogICAgJFNlbGYtPntBcnRpY2xlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVHZXRQYXJhbSA9ICgpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlciggVGl0bGUgPT4gJ0Vycm9yJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckVycm9yKCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldElEIScgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBpZiAoCiAgICAgICAgISRTZWxmLT57VGlja2V0T2JqZWN0fS0+Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBuZSAnU2hvd0hUTUxlTWFpbCcgKSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBmb3IgKAogICAgICAgIHF3KAogICAgICAgIFN1YmplY3QgQm9keSBTdGF0ZUlEIFByaW9yaXR5SUQKICAgICAgICBBdHRhY2htZW50VXBsb2FkCiAgICAgICAgQXR0YWNobWVudERlbGV0ZTEgQXR0YWNobWVudERlbGV0ZTIgQXR0YWNobWVudERlbGV0ZTMgQXR0YWNobWVudERlbGV0ZTQKICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgIEF0dGFjaG1lbnREZWxldGU5IEF0dGFjaG1lbnREZWxldGUxMAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyBsb29rdXAgY3JpdGljYWxpdHkKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJy0nOwoKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTN9KSB7CgogICAgICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CgogICAgICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxM319OwogICAgfQoKICAgICMgbG9va3VwIGltcGFjdAogICAgJFRpY2tldHtJbXBhY3R9ID0gJy0nOwoKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9KSB7CgogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CgogICAgICAgICRUaWNrZXR7SW1wYWN0fSA9ICRJbXBhY3RMaXN0LT57JFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fX07CiAgICB9CiMgLS0tCgogICAgIyBjaGVjayBmb2xsb3cgdXAKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e05leHRTY3JlZW59IHx8ICRTZWxmLT57Q29uZmlnfS0+e05leHRTY3JlZW5BZnRlckZvbGxvd1VwfTsKICAgICAgICBteSAlRXJyb3IgPSAoKTsKCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9CiAgICAgICAgICAgICAgICA9fiBzLyhePi4rfC57NCwkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyl9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9sbG93IHVwIG9wdGlvbiAocG9zc2libGUgb3Igbm90KQogICAgICAgIG15ICRGb2xsb3dVcFBvc3NpYmxlID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldEZvbGxvd1VwT3B0aW9uKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbG9jayBvcHRpb24gKHNob3VsZCBiZSB0aGUgdGlja2V0IGxvY2tlZCAtIGlmIGNsb3NlZCAtIGFmdGVyIHRoZSBmb2xsb3cgdXApCiAgICAgICAgbXkgJExvY2sgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0Rm9sbG93VXBMb2NrT3B0aW9uKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sICk7CgogICAgICAgICMgZ2V0IHRpY2tldCBzdGF0ZSBkZXRhaWxzCiAgICAgICAgbXkgJVN0YXRlID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkRm9sbG93VXBQb3NzaWJsZSA9fiAvKG5ldyB0aWNrZXR8cmVqZWN0KS9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlciggVGl0bGUgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJXYXJuaW5nKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQ2FuXCd0IHJlb3BlbiB0aWNrZXQsIG5vdCBwb3NzaWJsZSBpbiB0aGlzIHF1ZXVlIScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdDcmVhdGUgYSBuZXcgdGlja2V0IScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fQogICAgICAgICAgICAgICAgPX4gcy8oXj4uK3wuezQsJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpfSkoPzpcc3xceikvJDFcbi9nbTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBmb3IgKCAxIC4uIDEwICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtBdHRhY2htZW50VXBsb2FkfSApIHsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnRVcGxvYWR9ID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJUVycm9yICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jayBpZiB0aWNrZXQgd2FzIGNsb2FzZWQKICAgICAgICAgICAgaWYgKCAkTG9jayAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSAmJiAkVGlja2V0e093bmVySUR9IG5lICcxJyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJEZyb20gPSAiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVUeXBlID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKICAgICAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgICAgICAgICBGcm9tICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L3BsYWluOyBjaGFyc2V0PSRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eydVc2VyQ2hhcnNldCd9IiwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgICAgIE9yaWdIZWFkZXIgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgVG8gICAgICA9PiAnU3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIGZvbGxvdyB1cCcsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgICAgICAgICAgbXkgJU5leHRTdGF0ZURhdGEgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtTdGF0ZUlEfSApOwogICAgICAgICAgICAgICAgbXkgJE5leHRTdGF0ZSA9ICROZXh0U3RhdGVEYXRhe05hbWV9CiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fQogICAgICAgICAgICAgICAgICAgIHx8ICdvcGVuJzsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICA9PiAkTmV4dFN0YXRlLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCBwcmlvcml0eQogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIG15IEBBdHRhY2htZW50ID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlZiAoQEF0dGFjaG1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFJlZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIHZpZXcKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW4mVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKCBUaXRsZSA9PiAnRXJyb3InICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkVGlja2V0e1RtcENvdW50ZXJ9ICAgICAgPSAwOwogICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgKTsKCiAgICAjIGdldCBhbGwgYXRyaWNsZSBvZiB0aGlzIHRpY2tldAogICAgbXkgQEN1c3RvbWVyQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFR5cGUgPT4gJ0N1c3RvbWVyJyApOwogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgPT4gXEBDdXN0b21lckFydGljbGVUeXBlcywKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAxLAogICAgKTsKCiAgICAjIGdlbnRlcmF0ZSBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHNob3cgdGlja2V0CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2hvd0hUTUxlTWFpbCcgKSB7CgogICAgICAgICMgaWYgaXQgaXMgYSBodG1sIGVtYWlsLCBkcm9wIG5vcm1hbCBoZWFkZXIKICAgICAgICAkVGlja2V0e1Nob3dIVE1MZU1haWx9ID0gMTsKICAgICAgICAkT3V0cHV0ID0gJyc7CiAgICB9CiAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFydGljbGVCb3ggPT4gXEBBcnRpY2xlQm94LAogICAgICAgIEFydGljbGVJRCAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICVUaWNrZXQsCiAgICAgICAgJUdldFBhcmFtLAogICAgKTsKCiAgICAjIHJldHVybiBpZiBIVE1MIGVtYWlsCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2hvd0hUTUxlTWFpbCcgKSB7CgogICAgICAgICMgaWYgaXQgaXMgYSBodG1sIGVtYWlsLCByZXR1cm4gaGVyZQogICAgICAgICRUaWNrZXR7U2hvd0hUTUxlTWFpbH0gPSAxOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e0Zvcm1JRH07CgogICAgIyBkbyBzb21lIGh0bWwgcXVvdGluZwogICAgJFBhcmFte0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKCBBZ2UgPT4gJFBhcmFte0FnZX0sIFNwYWNlID0+ICcgJyApOwoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFte0FydGljbGVJRH0gfHwgJyc7CiAgICBteSAkQmFzZUxpbmsgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30gLiAiVGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0mIjsKICAgIG15IEBBcnRpY2xlQm94ICAgICAgICA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgbXkgJENvdW50ZXJBcnJheSA9IDA7CiAgICBteSAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEOwogICAgbXkgJExhc3RDdXN0b21lckFydGljbGUgPSAkI0FydGljbGVCb3g7CiAgICBteSAkQXJ0aWNsZUlEICAgICAgICAgICA9ICcnOwogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwoKICAgICAgICAjIGlmIGl0IGlzIGEgY3VzdG9tZXIgYXJ0aWNsZQogICAgICAgIGlmICggJEFydGljbGV7U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyAmJiAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gIX4gL2ludC8gKSB7CiAgICAgICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQgPSAkQXJ0aWNsZXsnQXJ0aWNsZUlEJ307CiAgICAgICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlICAgPSAkQ291bnRlckFycmF5OwogICAgICAgIH0KICAgICAgICAkQ291bnRlckFycmF5Kys7CiAgICAgICAgaWYgKCAkU2VsZWN0ZWRBcnRpY2xlSUQgZXEgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xle0FydGljbGVJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgdHJ5IHRvIHVzZSB0aGUgbGF0ZXN0IGN1c3RvbWVyIGFydGljbGUKICAgIGlmICggISRBcnRpY2xlSUQgJiYgJExhc3RDdXN0b21lckFydGljbGVJRCApIHsKICAgICAgICAkQXJ0aWNsZUlEID0gJExhc3RDdXN0b21lckFydGljbGVJRDsKICAgIH0KCiAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBub24gaW50ZXJuYWwgYWdlbnQgYXJ0aWNsZQogICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGVUbXAtPntTdGF0ZVR5cGV9IGVxICdtZXJnZWQnIHx8ICRBcnRpY2xlVG1wLT57QXJ0aWNsZVR5cGV9ICF+IC9pbnQvICkgewogICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlVG1wLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIHRocmVhZCBzdHJpbmcKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVHJlZScsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CiAgICBteSAkQ291bnRlclRyZWUgICAgPSAwOwogICAgbXkgJENvdW50ZXIgICAgICAgID0gJyc7CiAgICBteSAkU3BhY2UgICAgICAgICAgPSAnJzsKICAgIG15ICRMYXN0U2VuZGVyVHlwZSA9ICcnOwogICAgJFBhcmFte0FydGljbGVTdHJnfSA9ICcnOwogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwogICAgICAgIG15ICRTdGFydCAgID0gJyc7CiAgICAgICAgbXkgJFN0b3AgICAgPSAnJzsKCiAgICAgICAgJENvdW50ZXJUcmVlKys7CiAgICAgICAgbXkgJFRtcFN1YmplY3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xle1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFN1YmplY3QgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRMYXN0U2VuZGVyVHlwZSBuZSAkQXJ0aWNsZXtTZW5kZXJUeXBlfSApIHsKICAgICAgICAgICAgJENvdW50ZXIgLj0gIiZuYnNwOyI7CiAgICAgICAgICAgICRTcGFjZSA9ICIkQ291bnRlciZuYnNwO3wtLSZndDsiOwogICAgICAgIH0KICAgICAgICAkTGFzdFNlbmRlclR5cGUgPSAkQXJ0aWNsZXtTZW5kZXJUeXBlfTsKCiAgICAgICAgIyBpZiB0aGlzIGlzIHRoZSBzaG93biBhcnRpY2xlIC09PiBhZGQgPGI+CiAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRTdGFydCA9ICcmZ3Q7Jmd0OzxpPjxiPjx1Pic7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoaXMgaXMgdGhlIHNob3duIGFydGljbGUgLT0+IGFkZCA8L2I+CiAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRTdG9wID0gJzwvdT48L2I+PC9pPic7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJFRtcFN1YmplY3QsCiAgICAgICAgICAgICAgICBTcGFjZSAgID0+ICRTcGFjZSwKICAgICAgICAgICAgICAgIFN0YXJ0ICAgPT4gJFN0YXJ0LAogICAgICAgICAgICAgICAgU3RvcCAgICA9PiAkU3RvcCwKICAgICAgICAgICAgICAgIENvdW50ICAgPT4gJENvdW50ZXJUcmVlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGF0dGFjaG1lbnQgaWNvbgogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGV7QXRtc30KICAgICAgICAgICAgJiYgJXsgJEFydGljbGV7QXRtc30gfQogICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tQXR0YWNobWVudERpc3BsYXknKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVGl0bGUgPSAnJzsKCiAgICAgICAgICAgICMgZG93bmxvYWQgdHlwZQogICAgICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50RG93bmxvYWRUeXBlJykgfHwgJ2F0dGFjaG1lbnQnOwoKICAgICAgICAgICAgIyBpZiBhdHRhY2htZW50IHdpbGwgYmUgZm9yY2VkIHRvIGRvd25sb2FkLCBkb24ndCBvcGVuIGEgbmV3IGRvd25sb2FkIHdpbmRvdyEKICAgICAgICAgICAgbXkgJFRhcmdldCA9ICcnOwogICAgICAgICAgICBpZiAoICRUeXBlID1+IC9pbmxpbmUvaSApIHsKICAgICAgICAgICAgICAgICRUYXJnZXQgPSAndGFyZ2V0PSJhdHRhY2htZW50IiAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKAogICAgICAgICAgICAgICAgMSAuLiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21BdHRhY2htZW50RGlzcGxheUNvdW50JykgKyAxICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfS0+eyRDb3VudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ291bnQgPiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tQXR0YWNobWVudERpc3BsYXlDb3VudCcpICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUF0dGFjaG1lbnRNb3JlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7ICRBcnRpY2xle0F0bXN9LT57JENvdW50fSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ID0+ICRUYXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRBcnRpY2xle0F0bXN9LT57JENvdW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyAkQXJ0aWNsZXtBdG1zfS0+eyRDb3VudH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCA9PiAkVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJEFydGljbGVPQiA9ICRBcnRpY2xlQm94WyRMYXN0Q3VzdG9tZXJBcnRpY2xlXTsKICAgIG15ICVBcnRpY2xlICAgPSAlJEFydGljbGVPQjsKCiAgICBteSAkQXJ0aWNsZUFycmF5ID0gMDsKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICBteSAlQXJ0aWNsZVRtcDEgPSAlJEFydGljbGVUbXA7CiAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xlVG1wMXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAlQXJ0aWNsZSA9ICVBcnRpY2xlVG1wMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXR0YWNtZW50IHN0cmluZwogICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICB9CgogICAgIyBhZGQgYmxvY2sgZm9yIGF0dGFjaG1lbnRzCiAgICBpZiAoJUF0bUluZGV4KSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUF0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsgS2V5ID0+ICdBdHRhY2htZW50JywgfSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVBdHRhY2htZW50Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRmlsZSwgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG93bmxvYWQgdHlwZQogICAgICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50RG93bmxvYWRUeXBlJykgfHwgJ2F0dGFjaG1lbnQnOwoKICAgICAgICAgICAgIyBpZiBhdHRhY2htZW50IHdpbGwgYmUgZm9yY2VkIHRvIGRvd25sb2FkLCBkb24ndCBvcGVuIGEgbmV3IGRvd25sb2FkIHdpbmRvdyEKICAgICAgICAgICAgbXkgJFRhcmdldCA9ICcnOwogICAgICAgICAgICBpZiAoICRUeXBlID1+IC9pbmxpbmUvaSApIHsKICAgICAgICAgICAgICAgICRUYXJnZXQgPSAndGFyZ2V0PSJhdHRhY2htZW50IiAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUZpbGUsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICdEb3dubG9hZCcsCiAgICAgICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICAgICAiXCRFbnZ7XCJCYXNlbGlua1wifUFjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQmQXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0mRmlsZUlEPSRGaWxlSUQiLAogICAgICAgICAgICAgICAgICAgIEltYWdlICA9PiAnZGlzay1zLnBuZycsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ID0+ICRUYXJnZXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGp1c3QgYm9keSBpZiBodG1sIGVtYWlsCiAgICBpZiAoICRQYXJhbXsiU2hvd0hUTUxlTWFpbCJ9ICkgewoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Okhvb2snKQogICAgICAgICAgICAgICAgLiAiLSRBcnRpY2xle1RpY2tldE51bWJlcn0tJEFydGljbGV7VGlja2V0SUR9LSRBcnRpY2xle0FydGljbGVJRH0iLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gIiRBcnRpY2xle01pbWVUeXBlfTsgY2hhcnNldD0kQXJ0aWNsZXtDb250ZW50Q2hhcnNldH0iLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYganVzdCBhIG9ubHkgaHRtbCBlbWFpbAogICAgaWYgKCBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKCAlUGFyYW0sICVBcnRpY2xlICkgKSB7CiAgICAgICAgJFBhcmFteyJBcnRpY2xlOjpUZXh0Tm90ZSJ9ID0gJE1pbWVUeXBlVGV4dDsKICAgICAgICAkUGFyYW17IkFydGljbGU6OlRleHQifSAgICAgPSAnJzsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICRQYXJhbXsiQXJ0aWNsZTo6VGV4dCJ9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdOZXdMaW5lJyksCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdMaW5lcycpIHx8IDUwMDAsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBjaGFyc2V0IGNoZWNrCiAgICAgICAgaWYgKAogICAgICAgICAgICBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCgKICAgICAgICAgICAgICAgIENvbnRlbnRDaGFyc2V0ID0+ICRBcnRpY2xle0NvbnRlbnRDaGFyc2V0fSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9CiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFteyJBcnRpY2xlOjpUZXh0Tm90ZSJ9ID0gJENoYXJzZXRUZXh0OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGlkCiAgICAkUGFyYW17IkFydGljbGU6OkFydGljbGVJRCJ9ID0gJEFydGljbGV7QXJ0aWNsZUlEfTsKCiAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgIGZvciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgIGlmICggJEFydGljbGV7JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRffSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9sbG93IHVwIHBlcm1pc3Npb25zCiAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRGb2xsb3dVcE9wdGlvbiggUXVldWVJRCA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwgKTsKICAgIG15ICVTdGF0ZSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICBJRCA9PiAkQXJ0aWNsZXtTdGF0ZUlEfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5DdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICd1cGRhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICYmICgKICAgICAgICAgICAgKCAkRm9sbG93VXBQb3NzaWJsZSAhfiAvKG5ldyB0aWNrZXR8cmVqZWN0KS9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkKICAgICAgICAgICAgfHwgJFN0YXRle1R5cGVOYW1lfSAhfiAvXmNsb3NlL2kKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZvbGxvd1VwJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgICAgICBteSAlTmV4dFN0YXRlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVTdGF0ZVNlbGVjdGVkID0gKCk7CiAgICAgICAgICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRlU2VsZWN0ZWR7U2VsZWN0ZWRJRH0gPSAkUGFyYW17U3RhdGVJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU3RhdGVTZWxlY3RlZHtTZWxlY3RlZH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXsnTmV4dFN0YXRlc1N0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlSUQnLAogICAgICAgICAgICAgICAgJVN0YXRlU2VsZWN0ZWQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgbXkgJVByaW9yaXRpZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJVByaW9yaXR5U2VsZWN0ZWQgPSAoKTsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHlTZWxlY3RlZHtTZWxlY3RlZElEfSA9ICRQYXJhbXtQcmlvcml0eUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkfSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gfHwgJzMgbm9ybWFsJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17J1ByaW9yaXR5U3RyZyd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAlUHJpb3JpdHlTZWxlY3RlZCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICREYXRhUmVmIChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQXJ0aWNsZXtTZXJ2aWNlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggJEFydGljbGV7U0xBfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGV4dCAxMyBhbmQgMTQKICAgICAgICBpZiAoJENvdW50IGVxIDEzIHx8ICRDb3VudCBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2VsZWN0IHRoZSBvdXRwdXQgdGVtcGxhdGUKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0Wm9vbScsCiAgICAgICAgRGF0YSA9PiB7ICVBcnRpY2xlLCAlUGFyYW0sIH0sCiAgICApOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRNZW51QWRkdGxJVFNNRmllbGQucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRpY2tldE1lbnVBZGR0bElUU01GaWVsZC5wbSx2IDEuMS4xLjEgMjAwOC8wNi8zMCAwODo1ODo0MSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51QWRkdGxJVFNNRmllbGQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEuMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBUaWNrZXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgKICAgICAgICAhZGVmaW5lZCggJFBhcmFte0FDTH0tPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0gKQogICAgICAgIHx8ICRQYXJhbXtBQ0x9LT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9CiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnLAogICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJ0FjdGlvbj1BZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkJlRpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0NvdW50ZXJ9Kys7CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRNZW51RGVjaXNpb24ucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRpY2tldE1lbnVEZWNpc2lvbi5wbSx2IDEuMS4xLjEgMjAwOC8wNi8zMCAwODo1ODo0MSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51RGVjaXNpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEuMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBUaWNrZXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgKICAgICAgICAhZGVmaW5lZCggJFBhcmFte0FDTH0tPnsgJFBhcmFte0NvbmZpZ30tPntBY3Rpb259IH0gKQogICAgICAgIHx8ICRQYXJhbXtBQ0x9LT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9CiAgICAgICAgKQogICAgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdNZW51JyApOwoKICAgICAgICBpZiAoICRQYXJhbXtDb3VudGVyfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudUl0ZW1TcGxpdCcgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyAkUGFyYW17Q29uZmlnfSB9LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0RlY2lzaW9uJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdEZWNpc2lvbicsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAnQWN0aW9uPUFnZW50VGlja2V0RGVjaXNpb24mVGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9JywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17Q291bnRlcn0rKzsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo=
IyAtLQojIEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBmcmVlIHRleHQgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZC5kdGwsdiAxLjEgMjAwOC8wNy8wMiAxNzowNjozMSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5kdGwsdiAxLjI1IDIwMDgvMDcvMDIgMTY6MDg6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJDaGFuZ2UgZnJlZSB0ZXh0IG9mIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgICAgPCAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KIyAtLS0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4gKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyLz4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVGl0bGUgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTTEFTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByZXZpb3VzIE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gQWdlbnQifTogKCRUZXh0eyJPcHRpb25hbCJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iI2F0dGFjaG1lbnQiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBdHRhY2htZW50cyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gucG5nIj4kVGV4dHsiQXR0YWNobWVudHMifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkJvZHkiIHJvd3M9IjE2IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJvZHkgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIGRhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkRhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyLz4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4K
IyAtLQojIEFnZW50VGlja2V0Q2xvc2UuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBjbG9zZSBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldENsb3NlLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE2OjI4OjI3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldENsb3NlLmR0bCx2IDEuMjIgMjAwOC8wNS8wOCAyMjo1MjozNSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2xvc2UgdGlja2V0In06ICREYXRheyJUaWNrZXROdW1iZXIifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuVmlldyJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQmFjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiQmFjayJ9PC9hPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn13YXJuaW5nLnBuZyIgYWx0PSIkVGV4dHsiSW5mbyJ9Ij46IDxmb250IGNvbG9yPSJyZWQiPiRUZXh0eyJUaWNrZXQgbG9ja2VkISJ9PC9mb250PiAoPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldExvY2smU3ViYWN0aW9uPVVubG9jayZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlRpY2tldCB1bmxvY2shIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiVGlja2V0IHVubG9jayEifTwvYT4pCjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8YnIvPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZCIgdmFsdWU9IiIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpdGxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaXRsZSIgdmFsdWU9IiRRRGF0YXsiVGl0bGUifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJUaXRsZSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlcnZpY2VTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU2VydmljZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNMQVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTTEEgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTglIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5ldyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMiUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iTmV3IiAkRGF0YXsiTmV3T3duZXJUeXBlOjpOZXcifS8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJldmlvdXMgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJPbGQiICREYXRheyJOZXdPd25lclR5cGU6Ok9sZCJ9Lz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPbGRPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJSZXNwb25zaWJsZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6SW5mb3JtQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBBZ2VudCJ9OiAoJFRleHR7Ik9wdGlvbmFsIn0pPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5mb3JtQWdlbnQgLS0+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkluZm9ybSBpbnZvbHZlZCBBZ2VudHMifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ikludm9sdmVkQWdlbnRTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlN1YmplY3QgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiU3BlbGwgQ2hlY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9c3BlbGwucG5nIj4kVGV4dHsiU3BlbGwgQ2hlY2sifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIjYXR0YWNobWVudCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkF0dGFjaG1lbnRzIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWF0dGFjaC5wbmciPiRUZXh0eyJBdHRhY2htZW50cyJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGV4dCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQm9keSIgcm93cz0iMTYiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSJ9Ij4kUURhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiQm9keSBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiLz48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5vdGUgdHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZVR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXh0IHN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTdGF0ZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBlbmRpbmcgZGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiRGF0ZVN0cmluZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRhdGUgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkltcGFjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW1wYWN0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQcmlvcml0eVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZCJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDEifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGltZVVuaXRzIiB2YWx1ZT0iJFFEYXRheyJUaW1lVW5pdHMifSIgc2l6ZT0iMyIvPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9InNwZWxsaW5nIiB0YXJnZXQ9InNwZWxsaW5nIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFNwZWxsaW5nIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQm9keSIgdmFsdWU9IiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWxsX2xhbmciIHZhbHVlPSIiLz4KICAgICAgPC9mb3JtPgogICAgICA8YnIvPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0RGVjaXNpb24uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWNpc2lvbiBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldERlY2lzaW9uLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE3OjA2OjMxIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUuZHRsLHYgMS4yNiAyMDA4LzA1LzA4IDIyOjUyOjM1IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KJEluY2x1ZGV7IkFKQVgifQojIC0tLQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVHlwZUlEICYmIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRpY2tldCBUeXBlIGlzIHJlcXVpcmVkISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAnICsgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0udmFsdWUgKyAnIScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9ICYmIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5jaGVja2VkID09IGZhbHNlKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9IScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIGNoYW5nZV9zZWxlY3RlZChzZWwpIHsKICAgIHN0YXJ0X2VsZW1lbnRzID0gKHNlbCArIDQpOwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbMF0ubmFtZSA9PSAiJENvbmZpZ3siU2Vzc2lvbk5hbWUifSIpIHsKICAgICAgICBzdGFydF9lbGVtZW50cyA9IHN0YXJ0X2VsZW1lbnRzICsgMTsKICAgIH0KICAgIGlmICghZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCkgewogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQgPSB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFkZCBub3RlIHRvIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFkZCBkZWNpc2lvbiB0byB0aWNrZXQifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiMgLS0tCiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5WaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXdhcm5pbmcucG5nIiBhbHQ9IiRUZXh0eyJJbmZvIn0iPjogPGZvbnQgY29sb3I9InJlZCI+JFRleHR7IlRpY2tldCBsb2NrZWQhIn08L2ZvbnQ+ICg8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TG9jayZTdWJhY3Rpb249VW5sb2NrJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiVGlja2V0IHVubG9jayEifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJUaWNrZXQgdW5sb2NrISJ9PC9hPikKPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxici8+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiB2YWx1ZT0iIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlRpdGxlIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU2VydmljZVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTZXJ2aWNlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU0xBU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV3IE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJOZXciICREYXRheyJOZXdPd25lclR5cGU6Ok5ldyJ9Lz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmV2aW91cyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9sZE93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzcG9uc2libGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlJlc3BvbnNpYmxlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIEFnZW50In06ICgkVGV4dHsiT3B0aW9uYWwifSk8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIGludm9sdmVkIEFnZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW52b2x2ZWRBZ2VudFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1zcGVsbC5wbmciPiRUZXh0eyJTcGVsbCBDaGVjayJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiNhdHRhY2htZW50IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQXR0YWNobWVudHMifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9YXR0YWNoLnBuZyI+JFRleHR7IkF0dGFjaG1lbnRzIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJCb2R5IiByb3dzPSIxNiIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCb2R5IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTm90ZSB0eXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXRlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyBkYXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEYXRlU3RyaW5nIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGF0ZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgojIC0tLQo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlByaW9yaXR5U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0ic3BlbGxpbmciIHRhcmdldD0ic3BlbGxpbmciPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlbGxfbGFuZyIgdmFsdWU9IiIvPgogICAgICA8L2Zvcm0+CiAgICAgIDxici8+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0RW1haWwuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBhZ2VudCBlbWFpbAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRFbWFpbC5kdGwsdiAxLjUgMjAwOC8wNy8wNSAyMDo0Nzo1NyBtaCBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRFbWFpbC5kdGwsdiAxLjM2IDIwMDgvMDcvMDEgMTU6NTE6MDIgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCiMgaW5jbHVkZSBBSkFYIGxpYgokSW5jbHVkZXsiQUpBWCJ9Cgo8IS0tIHN0YXJ0IGZvcm0gLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQgJiYgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGlja2V0IFR5cGUgaXMgcmVxdWlyZWQhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBzdWJqZWN0ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIGJvZHkhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLkJvZHkuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChpc05hTihkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5Nb250aC52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlKSB8fCBpc05hTihkb2N1bWVudC5jb21wb3NlLkhvdXIudmFsdWUpIHx8IGlzTmFOKGRvY3VtZW50LmNvbXBvc2UuTWludXRlLnZhbHVlKSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJJbnZhbGlkIGRhdGUhIn0nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSA8IDEgfHwgZG9jdW1lbnQuY29tcG9zZS5EYXkudmFsdWUgPiAzMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlIDwgMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlID4gMzEgfHwgZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlIDwgOTk5IHx8IGRvY3VtZW50LmNvbXBvc2UuWWVhci52YWx1ZSA+IDEwMDAwIHx8IGRvY3VtZW50LmNvbXBvc2UuSG91ci52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5Ib3VyLnZhbHVlID4gMjMgfHxkb2N1bWVudC5jb21wb3NlLk1pbnV0ZS52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5NaW51dGUudmFsdWUgPiA1OSAgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgZGF0ZSEifScpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIEJvb2tDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LmJvb2suVG8udmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLlRvLnZhbHVlOwogICAgZG9jdW1lbnQuYm9vay5DYy52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQ2MudmFsdWU7CiAgICBkb2N1bWVudC5ib29rLkJjYy52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQmNjLnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdib29rJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LmJvb2suc3VibWl0KCkKICAgIGRvY3VtZW50LmJvb2sud2FzX3NwZWxsX2NoZWNrZWQ9dHJ1ZTsKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIEZBUVN1Ym1pdCgpIHsKICAgIHdpbmRvdy5vcGVuKCcnLCAnZmFxJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LmZhcS5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gQ3VzdG9tZXJTdWJtaXQoKSB7CiAgICB3aW5kb3cub3BlbignJywgJ2N1c3RvbWVyJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LmN1c3RvbWVyLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjbGVhcl9maWVsZCgpIHsKICAgIGRvY3VtZW50LmNvbXBvc2UuVG8udmFsdWUgPSAiIjsKICAgIGRvY3VtZW50LmNvbXBvc2UuVG8uZm9jdXMoKTsKfQovLy0tPgo8L3NjcmlwdD4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBhbGlnbj0ibGVmdCIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNvbXBvc2UgRW1haWwifSAvICRUZXh0eyJuZXcgdGlja2V0In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudExpbmtPYmplY3QmTW9kZT1UZW1wb3JhcnkmU291cmNlT2JqZWN0PVRpY2tldCZTb3VyY2VLZXk9JFFEYXRheyJGb3JtSUQifSZUYXJnZXRJZGVudGlmaWVyPUlUU01Db25maWdJdGVtIiBvbkNsaWNrPSJsaW5rd2luPXdpbmRvdy5vcGVuKCcnLCAnc2V0dGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD05MDAsaGVpZ2h0PTcwMCxsZWZ0PTUwLHRvcD01MCcpOyBsaW5rd2luLmZvY3VzKCk7IiB0YXJnZXQ9InNldHRpbmciPiRUZXh0eyJMaW5rIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiMgLS0tCiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxwPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZSIgdmFsdWU9IjAiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPd25lckFsbCIgdmFsdWU9IiRRRGF0YXsiT3duZXJBbGwifSIvPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSIkUURhdGF7IlJlc3BvbnNpYmxlQWxsIn0iLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiREYXRheyJDdXN0b21lclVzZXIifSIvPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFR5cGUgLS0+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGcm9tIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgd2lkdGg9IjYwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkZyb21TdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGVzdGluYXRpb24gaW52YWxpZCJ9In08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkZyb21VcGRhdGVTdWJtaXQgLS0+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlJlZnJlc2gifSIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lMiIvPgo8IS0tIGR0bDpibG9jazpGcm9tVXBkYXRlU3VibWl0IC0tPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIHJvd3NwYW49IjEwIiBjbGFzcz0iY29udGVudHZhbHVlIj4KIyBzaG93IGN1c3RvbWVyIGluZm8gdGFibGUKPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJUYWJsZSAtLT4KICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQ3VzdG9tZXIgSW5mbyJ9PC9iPjo8YnIvPgogICAgICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9CiAgICAgICAgICAgICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVG8iIHZhbHVlPSIkUURhdGF7IlRvIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJUbyBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJVc2VyU3RyZyJ9CiAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiQ3VzdG9tZXJVc2VyU3RyZyJ9IG5lICIiKSB7ICREYXRheyJUYWtlVGhpc0N1c3RvbWVyIn0gPSAiPGJyLz48aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUyIiB2YWx1ZT0iJFRleHR7IlRha2UgdGhpcyBDdXN0b21lciJ9Ii8+IjsgfT4KICAgICAgICAgICAgICAgICREYXRheyJUYWtlVGhpc0N1c3RvbWVyIn0KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZTEiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIEN1c3RvbWVyIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkNsZWFyVG8iIHZhbHVlPSIkVGV4dHsiQ2xlYXIgVG8ifSIgb25jbGljaz0iamF2YXNjcmlwdDpjbGVhcl9maWVsZCgpOyByZXR1cm4gZmFsc2U7Ii8+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNjIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ2MiIHZhbHVlPSIkUURhdGF7IkNjIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJDYyBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQmNjIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQmNjIiB2YWx1ZT0iJFFEYXRheyJCY2MifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJjYyBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgJERhdGF7IlNlcnZpY2VTdHJnIn0KICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U0xBIC0tPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAkRGF0YXsiU0xBU3RyZyJ9CiAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTTEEgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U0xBIC0tPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbiAtLT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik93bmVyIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifQo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbEpTIC0tPgojICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Pd25lckFsbC52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQWxsIEFnZW50cyJ9JzsgcmV0dXJuIHRydWU7Ij4kVGV4dHsiQWxsIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuT3duZXJBbGwudmFsdWU9JzEnOyBBSkFYVXBkYXRlKCdBSkFYVXBkYXRlJywgJ093bmVyQWxsJywgWydPd25lckFsbCcsICdEZXN0J10sIFsnTmV3VXNlcklEJ10pOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbEpTIC0tPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbFN1Ym1pdCAtLT4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWxsIn0iIG5hbWU9Ik93bmVyQWxsUmVmcmVzaCIvPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbFN1Ym1pdCAtLT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbiAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb24gLS0+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJSZXNwb25zaWJsZU9wdGlvblN0cmcifQo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbkFsbEpTIC0tPgojICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5SZXNwb25zaWJsZUFsbC52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQWxsIEFnZW50cyJ9JzsgcmV0dXJuIHRydWU7Ij4kVGV4dHsiQWxsIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuUmVzcG9uc2libGVBbGwudmFsdWU9JzEnOyBBSkFYVXBkYXRlKCdBSkFYVXBkYXRlJywgJ1Jlc3BvbnNpYmxlQWxsJywgWydSZXNwb25zaWJsZUFsbCcsICdEZXN0J10sIFsnTmV3UmVzcG9uc2libGVJRCddKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBbGwgQWdlbnRzIn0nOyByZXR1cm4gdHJ1ZTsiPiRUZXh0eyJBbGwifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxKUyAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxTdWJtaXQgLS0+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFsbCJ9IiBuYW1lPSJSZXNwb25zaWJsZUFsbFJlZnJlc2giLz4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxTdWJtaXQgLS0+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb24gLS0+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbiAtLT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsdWUifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JERhdGF7IkludmFsaWQifTwvZm9udD48L3RkPgogICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1zcGVsbC5wbmciPiRUZXh0eyJTcGVsbCBDaGVjayJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgo8IS0tIGR0bDpibG9jazpBZGRyZXNzQm9vayAtLT4KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iQm9va0NoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBZGRyZXNzIEJvb2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9Y29udGVudHMucG5nIj4kVGV4dHsiQWRkcmVzcyBCb29rIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOkFkZHJlc3NCb29rIC0tPgogICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iI2F0dGFjaG1lbnQiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBdHRhY2htZW50cyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gucG5nIj4kVGV4dHsiQXR0YWNobWVudHMifTwvYT4kRW52eyJCb3gxIn0KIyAtLQojIGNoZWNrIGlmIHRoZSBmYXEgbGluayBzaG91bGQgYmUgc2hvd24KIyAtLQogICAgICAgICAgICAgICAgPGR0bCBpZiAoJEVudnsiVXNlcklzR3JvdXBSb1tmYXFdIn0gZXEgIlllcyIpIHsgJERhdGF7IkZBUUxpbmsifSA9ICIkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IkZBUVN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiRkFRIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWhlbHAtc21hbGwucG5nIj4kVGV4dHsiRkFRIn08L2E+JEVudnsiQm94MSJ9IjsgfT4KICAgICAgICAgICAgICAgICREYXRheyJGQVFMaW5rIn0KICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iQ3VzdG9tZXJTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkN1c3RvbWVyIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWdyb3VwLXNtYWxsLnBuZyI+JFRleHR7IkN1c3RvbWVyIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFFbWFpbCJ9IiB3cmFwPSIkRW52eyJCcm93c2VyV3JhcCJ9Ij4kRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2lnbmF0dXJlIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iU2lnbmF0dXJlIiByb3dzPSI1IiBjb2xzPSI4MiIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSIgcmVhZG9ubHk+JERhdGF7IlNpZ25hdHVyZSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiLz48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXN0b21lcklEIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ3VzdG9tZXJJRCIgdmFsdWU9IiREYXRheyJDdXN0b21lcklEIn0iIHNpemU9IjI1Ii8+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgdGlja2V0IHN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJOZXh0U3RhdGVzU3RyZyJ9PC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBlbmRpbmcgRGF0ZSJ9ICgkVGV4dHsiZm9yIHBlbmRpbmcqIHN0YXRlcyJ9KTo8L3RkPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGVuZGluZ0RhdGVTdHJpbmcifTxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRhdGUgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTIifTwvdGQ+CiMgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDxici8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VuZCBtYWlsISJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFNwZWxsaW5nIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iYm9vayIgdGFyZ2V0PSJib29rIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50Qm9vayIvPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVG8iIHZhbHVlPSIiLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNjIiB2YWx1ZT0iIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCY2MiIHZhbHVlPSIiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJmYXEiIHRhcmdldD0iZmFxIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50RkFRIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJOYXYiIHZhbHVlPSJOb25lIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iIi8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJXaGF0IiB2YWx1ZT0iIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY3VzdG9tZXIiIHRhcmdldD0iY3VzdG9tZXIiPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWRtaW5DdXN0b21lclVzZXIiLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik5hdiIgdmFsdWU9Ik5vbmUiLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIiLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IldoYXQiIHZhbHVlPSIiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgIDwvcD4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEFnZW50VGlja2V0RnJlZVRleHQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBmcmVlIHRleHQgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5kdGwsdiAxLjEgMjAwOC8wNy8wMiAxNjoyODoyNyB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRGcmVlVGV4dC5kdGwsdiAxLjI1IDIwMDgvMDcvMDIgMTY6MDg6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2hhbmdlIGZyZWUgdGV4dCBvZiB0aWNrZXQifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5WaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXdhcm5pbmcucG5nIiBhbHQ9IiRUZXh0eyJJbmZvIn0iPjogPGZvbnQgY29sb3I9InJlZCI+JFRleHR7IlRpY2tldCBsb2NrZWQhIn08L2ZvbnQ+ICg8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TG9jayZTdWJhY3Rpb249VW5sb2NrJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiVGlja2V0IHVubG9jayEifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJUaWNrZXQgdW5sb2NrISJ9PC9hPikKPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxici8+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiB2YWx1ZT0iIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlRpdGxlIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU2VydmljZVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTZXJ2aWNlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU0xBU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV3IE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJOZXciICREYXRheyJOZXdPd25lclR5cGU6Ok5ldyJ9Lz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmV2aW91cyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9sZE93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzcG9uc2libGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlJlc3BvbnNpYmxlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIEFnZW50In06ICgkVGV4dHsiT3B0aW9uYWwifSk8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIGludm9sdmVkIEFnZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW52b2x2ZWRBZ2VudFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1zcGVsbC5wbmciPiRUZXh0eyJTcGVsbCBDaGVjayJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiNhdHRhY2htZW50IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQXR0YWNobWVudHMifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9YXR0YWNoLnBuZyI+JFRleHR7IkF0dGFjaG1lbnRzIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJCb2R5IiByb3dzPSIxNiIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCb2R5IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTm90ZSB0eXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXRlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyBkYXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEYXRlU3RyaW5nIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGF0ZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgojIC0tLQo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlByaW9yaXR5U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0ic3BlbGxpbmciIHRhcmdldD0ic3BlbGxpbmciPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlbGxfbGFuZyIgdmFsdWU9IiIvPgogICAgICA8L2Zvcm0+CiAgICAgIDxici8+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0Tm90ZS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIG5vdGUgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXROb3RlLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDEwOjE5OjUzIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUuZHRsLHYgMS4yNiAyMDA4LzA1LzA4IDIyOjUyOjM1IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KJEluY2x1ZGV7IkFKQVgifQojIC0tLQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVHlwZUlEICYmIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRpY2tldCBUeXBlIGlzIHJlcXVpcmVkISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAnICsgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0udmFsdWUgKyAnIScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9ICYmIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5jaGVja2VkID09IGZhbHNlKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9IScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIGNoYW5nZV9zZWxlY3RlZChzZWwpIHsKICAgIHN0YXJ0X2VsZW1lbnRzID0gKHNlbCArIDQpOwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbMF0ubmFtZSA9PSAiJENvbmZpZ3siU2Vzc2lvbk5hbWUifSIpIHsKICAgICAgICBzdGFydF9lbGVtZW50cyA9IHN0YXJ0X2VsZW1lbnRzICsgMTsKICAgIH0KICAgIGlmICghZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCkgewogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQgPSB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJBZGQgbm90ZSB0byB0aWNrZXQifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5WaWV3In0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCYWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyJCYWNrIn08L2E+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXdhcm5pbmcucG5nIiBhbHQ9IiRUZXh0eyJJbmZvIn0iPjogPGZvbnQgY29sb3I9InJlZCI+JFRleHR7IlRpY2tldCBsb2NrZWQhIn08L2ZvbnQ+ICg8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TG9jayZTdWJhY3Rpb249VW5sb2NrJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiVGlja2V0IHVubG9jayEifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJUaWNrZXQgdW5sb2NrISJ9PC9hPikKPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxici8+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiB2YWx1ZT0iIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIvPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI4MDAiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGl0bGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iJFFEYXRheyJUaXRsZSJ9IiBzaXplPSI3MCIvPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlRpdGxlIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGl0bGUgLS0+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU2VydmljZVN0cmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTZXJ2aWNlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU0xBU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNMQSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxOCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV3IE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJOZXciICREYXRheyJOZXdPd25lclR5cGU6Ok5ldyJ9Lz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJPd25lclN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmV2aW91cyBPd25lciJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9sZE93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUmVzcG9uc2libGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlJlc3BvbnNpYmxlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIEFnZW50In06ICgkVGV4dHsiT3B0aW9uYWwifSk8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW5mb3JtIGludm9sdmVkIEFnZW50cyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiSW52b2x2ZWRBZ2VudFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU3ViamVjdCBpbnZhbGlkIn0ifTwvZm9udD4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJTcGVsbENoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1zcGVsbC5wbmciPiRUZXh0eyJTcGVsbCBDaGVjayJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiNhdHRhY2htZW50IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQXR0YWNobWVudHMifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9YXR0YWNoLnBuZyI+JFRleHR7IkF0dGFjaG1lbnRzIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJCb2R5IiByb3dzPSIxNiIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJCb2R5IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTm90ZSB0eXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlN0YXRlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGVuZGluZyBkYXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJEYXRlU3RyaW5nIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGF0ZSBpbnZhbGlkIn0ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCjwhLS0gZHRsOmJsb2NrOkltcGFjdCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgojIC0tLQo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlByaW9yaXR5U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiBzaXplPSIzIi8+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU3VibWl0In0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyIvPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0ic3BlbGxpbmciIHRhcmdldD0ic3BlbGxpbmciPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlbGxfbGFuZyIgdmFsdWU9IiIvPgogICAgICA8L2Zvcm0+CiAgICAgIDxici8+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXMgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0T3duZXIuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBvd25lciBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldE93bmVyLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE2OjI4OjI3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE93bmVyLmR0bCx2IDEuMjEgMjAwOC8wNS8wOCAyMjo1MjozNSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2hhbmdlIG93bmVyIG9mIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4gKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyLz4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVGl0bGUgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTTEFTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByZXZpb3VzIE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gQWdlbnQifTogKCRUZXh0eyJPcHRpb25hbCJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iI2F0dGFjaG1lbnQiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBdHRhY2htZW50cyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gucG5nIj4kVGV4dHsiQXR0YWNobWVudHMifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkJvZHkiIHJvd3M9IjE2IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJvZHkgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIGRhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkRhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyLz4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4K
IyAtLQojIEFnZW50VGlja2V0UGVuZGluZy5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHBlbmRpbmcgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQZW5kaW5nLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE2OjI4OjI3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFBlbmRpbmcuZHRsLHYgMS4yNyAyMDA4LzA1LzA4IDIyOjUyOjM1IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KJEluY2x1ZGV7IkFKQVgifQojIC0tLQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkgewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVHlwZUlEICYmIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IlRpY2tldCBUeXBlIGlzIHJlcXVpcmVkISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOk5vdGVKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSByZXF1aXJlZCBmaWVsZCBpczoifSAnICsgZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0udmFsdWUgKyAnIScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUNoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRpbWVDaGVjayJ9ICYmIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5jaGVja2VkID09IGZhbHNlKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9IScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIHJldHVybiB0cnVlOwp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIGNoYW5nZV9zZWxlY3RlZChzZWwpIHsKICAgIHN0YXJ0X2VsZW1lbnRzID0gKHNlbCArIDQpOwogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbMF0ubmFtZSA9PSAiJENvbmZpZ3siU2Vzc2lvbk5hbWUifSIpIHsKICAgICAgICBzdGFydF9lbGVtZW50cyA9IHN0YXJ0X2VsZW1lbnRzICsgMTsKICAgIH0KICAgIGlmICghZG9jdW1lbnQuY29tcG9zZS5lbGVtZW50c1tzdGFydF9lbGVtZW50c10uY2hlY2tlZCkgewogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQgPSB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpPd25lckpzIC0tPgoKPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZXQgUGVuZGluZyJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4gKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyLz4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVGl0bGUgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTTEFTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByZXZpb3VzIE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gQWdlbnQifTogKCRUZXh0eyJPcHRpb25hbCJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iI2F0dGFjaG1lbnQiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBdHRhY2htZW50cyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gucG5nIj4kVGV4dHsiQXR0YWNobWVudHMifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkJvZHkiIHJvd3M9IjE2IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJvZHkgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIGRhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkRhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyLz4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4K
IyAtLQojIEFnZW50VGlja2V0UGhvbmUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBwaG9uZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQaG9uZS5kdGwsdiAxLjUgMjAwOC8wNy8wNSAyMDo0Nzo1NyBtaCBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRQaG9uZS5kdGwsdiAxLjM2IDIwMDgvMDcvMDEgMTY6MDE6MDIgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCiMgaW5jbHVkZSBBSkFYIGxpYgokSW5jbHVkZXsiQUpBWCJ9Cgo8IS0tIHN0YXJ0IGZvcm0gLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gc3VibWl0X2NvbXBvc2UoKSB7CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQgJiYgZG9jdW1lbnQuY29tcG9zZS5UeXBlSUQudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiVGlja2V0IFR5cGUgaXMgcmVxdWlyZWQhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBzdWJqZWN0ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIGJvZHkhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLkJvZHkuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChpc05hTihkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5Nb250aC52YWx1ZSkgfHwgaXNOYU4oZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlKSB8fCBpc05hTihkb2N1bWVudC5jb21wb3NlLkhvdXIudmFsdWUpIHx8IGlzTmFOKGRvY3VtZW50LmNvbXBvc2UuTWludXRlLnZhbHVlKSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJJbnZhbGlkIGRhdGUhIn0nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkRheS52YWx1ZSA8IDEgfHwgZG9jdW1lbnQuY29tcG9zZS5EYXkudmFsdWUgPiAzMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlIDwgMSB8fCBkb2N1bWVudC5jb21wb3NlLk1vbnRoLnZhbHVlID4gMzEgfHwgZG9jdW1lbnQuY29tcG9zZS5ZZWFyLnZhbHVlIDwgOTk5IHx8IGRvY3VtZW50LmNvbXBvc2UuWWVhci52YWx1ZSA+IDEwMDAwIHx8IGRvY3VtZW50LmNvbXBvc2UuSG91ci52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5Ib3VyLnZhbHVlID4gMjMgfHxkb2N1bWVudC5jb21wb3NlLk1pbnV0ZS52YWx1ZSA8IDAgfHwgZG9jdW1lbnQuY29tcG9zZS5NaW51dGUudmFsdWUgPiA1OSAgKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgZGF0ZSEifScpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRDaGVja0pzIC0tPgogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSAhPSAiIikgewogICAgICAgIHZhciByZWcgPSAvXi17MCwxfVxkKz8oKFwufCwpezAsMX1cZCs/KXswLDF9JC87CiAgICAgICAgaWYgKHJlZy50ZXN0KGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLnZhbHVlKSA9PSBmYWxzZSkgewogICAgICAgICAgICBhbGVydCgnJEpTVGV4dHsiSW52YWxpZCB0aW1lISJ9Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSA9PSAiIiAmJiAkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZSJ9KSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IllvdSBuZWVkIHRvIGFjY291bnQgdGltZSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVGltZVVuaXRzLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNKcyAtLT4KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBTcGVsbENoZWNrU3VibWl0KCkgewogICAgZG9jdW1lbnQuc3BlbGxpbmcuQm9keS52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnc3BlbGxpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NzAwLGhlaWdodD01NTAsbGVmdD0xMDAsdG9wPTEwMCcpOwogICAgZG9jdW1lbnQuc3BlbGxpbmcuc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIEZBUVN1Ym1pdCgpIHsKICAgIHdpbmRvdy5vcGVuKCcnLCAnZmFxJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LmZhcS5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gQ3VzdG9tZXJTdWJtaXQoKSB7CiAgICB3aW5kb3cub3BlbignJywgJ2N1c3RvbWVyJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LmN1c3RvbWVyLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjbGVhcl9maWVsZCgpIHsKICAgIGRvY3VtZW50LmNvbXBvc2UuRnJvbS52YWx1ZSA9ICIiOwogICAgZG9jdW1lbnQuY29tcG9zZS5Gcm9tLmZvY3VzKCk7Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlBob25lIGNhbGwifSAvICRUZXh0eyJuZXcgdGlja2V0In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudExpbmtPYmplY3QmTW9kZT1UZW1wb3JhcnkmU291cmNlT2JqZWN0PVRpY2tldCZTb3VyY2VLZXk9JFFEYXRheyJGb3JtSUQifSZUYXJnZXRJZGVudGlmaWVyPUlUU01Db25maWdJdGVtIiBvbkNsaWNrPSJsaW5rd2luPXdpbmRvdy5vcGVuKCcnLCAnc2V0dGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD05MDAsaGVpZ2h0PTcwMCxsZWZ0PTUwLHRvcD01MCcpOyBsaW5rd2luLmZvY3VzKCk7IiB0YXJnZXQ9InNldHRpbmciPiRUZXh0eyJMaW5rIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiMgLS0tCiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiMgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgojICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgojICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZU5ldyIvPgojICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiMgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZSIgdmFsdWU9IjIiLz4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IkV4YW1wbGUgU3ViamVjdCIvPgojICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iTmFtZToKIyAgICAgICAgUHJvZHVjdDoKIyAgICAgICAgQ29tbWVudDoiLz4KIyAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iIiB2YWx1ZT0iJFRleHR7IkV4YW1wbGUgVGVtcGxhdGUifSIvPgojICAgICAgPC9mb3JtPgojICAgICAgPGhyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lIiB2YWx1ZT0iMCIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik93bmVyQWxsIiB2YWx1ZT0iJFFEYXRheyJPd25lckFsbCJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSIkUURhdGF7IlJlc3BvbnNpYmxlQWxsIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iJERhdGF7IkN1c3RvbWVyVXNlciJ9Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkxpbmtUaWNrZXRJRCIgdmFsdWU9IiREYXRheyJMaW5rVGlja2V0SUQifSIvPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IlR5cGVTdHJnIn08L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRnJvbSJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCB3aWR0aD0iNjAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRnJvbSIgdmFsdWU9IiRRRGF0YXsiRnJvbSJ9IiBzaXplPSI4MCIvPgogICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkZyb20gaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJVc2VyU3RyZyJ9CiAgICAgICAgICAgICAgPGR0bCBpZiAoJERhdGF7IkN1c3RvbWVyVXNlclN0cmcifSBuZSAiIikgeyAkRGF0YXsiVGFrZVRoaXNDdXN0b21lciJ9ID0gIjxici8+PGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lMiIgdmFsdWU9IiRUZXh0eyJUYWtlIHRoaXMgQ3VzdG9tZXIifSIvPiI7IH0+CiAgICAgICAgICAgICAgJERhdGF7IlRha2VUaGlzQ3VzdG9tZXIifQogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZTEiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIEN1c3RvbWVyIn0iLz4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJDbGVhckZyb20iIHZhbHVlPSIkVGV4dHsiQ2xlYXIgRnJvbSJ9IiBvbmNsaWNrPSJqYXZhc2NyaXB0OmNsZWFyX2ZpZWxkKCk7IHJldHVybiBmYWxzZTsiLz4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIHJvd3NwYW49IjEwIiBjbGFzcz0iY29udGVudGtleSI+CiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlCjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgICAgICAgPHA+PGI+JFRleHR7IkN1c3RvbWVyIEluZm8ifTwvYj46PGJyLz4kRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9PC9wPgo8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgojICAgICAgICAgICAgICAkVGV4dHsiRkFRLVNlYXJjaCJ9OiAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IkZBUVN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7Ikluc2VydCJ9JzsgcmV0dXJuIHRydWU7Ij4kVGV4dHsiSW5zZXJ0In08L2E+JEVudnsiQm94MSJ9CiMgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJGQVEiIHZhbHVlPSIiIG9uU3VibWl0PSJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nNCc7Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUbyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVG9TdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiRGVzdGluYXRpb24gaW52YWxpZCJ9In08L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOlRvVXBkYXRlU3VibWl0IC0tPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiUmVmcmVzaCJ9IiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUyIi8+CjwhLS0gZHRsOmJsb2NrOlRvVXBkYXRlU3VibWl0IC0tPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAkRGF0YXsiU2VydmljZVN0cmcifQogICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTTEEgLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAkRGF0YXsiU0xBU3RyZyJ9CiAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U0xBIC0tPgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbiAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3duZXIifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvblN0cmcifQo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbkFsbEpTIC0tPgojICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9ImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgZG9jdW1lbnQuY29tcG9zZS5Pd25lckFsbC52YWx1ZT0nMSc7IGRvY3VtZW50LmNvbXBvc2Uuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQWxsIEFnZW50cyJ9JzsgcmV0dXJuIHRydWU7Ij4kVGV4dHsiQWxsIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJkb2N1bWVudC5jb21wb3NlLk93bmVyQWxsLnZhbHVlPScxJzsgQUpBWFVwZGF0ZSgnQUpBWFVwZGF0ZScsICdPd25lckFsbCcsIFsnT3duZXJBbGwnLCAnRGVzdCddLCBbJ05ld1VzZXJJRCddKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBbGwgQWdlbnRzIn0nOyByZXR1cm4gdHJ1ZTsiPiRUZXh0eyJBbGwifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6T3duZXJTZWxlY3Rpb25BbGxKUyAtLT4KPCEtLSBkdGw6YmxvY2s6T3duZXJTZWxlY3Rpb25BbGxTdWJtaXQgLS0+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBbGwifSIgbmFtZT0iT3duZXJBbGxSZWZyZXNoIi8+CjwhLS0gZHRsOmJsb2NrOk93bmVyU2VsZWN0aW9uQWxsU3VibWl0IC0tPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXJTZWxlY3Rpb24gLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlU2VsZWN0aW9uIC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVPcHRpb25TdHJnIn0KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxKUyAtLT4KIyAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJkb2N1bWVudC5jb21wb3NlLkV4cGFuZEN1c3RvbWVyTmFtZS52YWx1ZT0nMyc7IGRvY3VtZW50LmNvbXBvc2UuUmVzcG9uc2libGVBbGwudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iZG9jdW1lbnQuY29tcG9zZS5SZXNwb25zaWJsZUFsbC52YWx1ZT0nMSc7IEFKQVhVcGRhdGUoJ0FKQVhVcGRhdGUnLCAnUmVzcG9uc2libGVBbGwnLCBbJ1Jlc3BvbnNpYmxlQWxsJywgJ0Rlc3QnXSwgWydOZXdSZXNwb25zaWJsZUlEJ10pOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFsbCBBZ2VudHMifSc7IHJldHVybiB0cnVlOyI+JFRleHR7IkFsbCJ9PC9hPiRFbnZ7IkJveDEifQo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbkFsbEpTIC0tPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbkFsbFN1Ym1pdCAtLT4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFsbCJ9IiBuYW1lPSJSZXNwb25zaWJsZUFsbFJlZnJlc2giLz4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb25BbGxTdWJtaXQgLS0+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbiAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI4MCIvPgogICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlN1YmplY3QgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgo8IS0tIGR0bDpibG9jazpTcGVsbENoZWNrIC0tPgogICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiU3BlbGwgQ2hlY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9c3BlbGwucG5nIj4kVGV4dHsiU3BlbGwgQ2hlY2sifTwvYT4kRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIjYXR0YWNobWVudCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkF0dGFjaG1lbnRzIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWF0dGFjaC5wbmciPiRUZXh0eyJBdHRhY2htZW50cyJ9PC9hPiRFbnZ7IkJveDEifQojIC0tCiMgY2hlY2sgaWYgdGhlIGZhcSBsaW5rIHNob3VsZCBiZSBzaG93bgojIC0tCiAgICAgICAgICAgICAgPGR0bCBpZiAoJEVudnsiVXNlcklzR3JvdXBSb1tmYXFdIn0gZXEgIlllcyIpIHsgJERhdGF7IkZBUUxpbmsifSA9ICIkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IkZBUVN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiRkFRIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWhlbHAtc21hbGwucG5nIj4kVGV4dHsiRkFRIn08L2E+JEVudnsiQm94MSJ9IjsgfT4KICAgICAgICAgICAgICAkRGF0YXsiRkFRTGluayJ9CiAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJDdXN0b21lclN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiQ3VzdG9tZXIifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9Z3JvdXAtc21hbGwucG5nIj4kVGV4dHsiQ3VzdG9tZXIifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JERhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIkVGV4dHsiQXR0YWNoIn0iLz4KICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDdXN0b21lcklEIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ3VzdG9tZXJJRCIgdmFsdWU9IiREYXRheyJDdXN0b21lcklEIn0iIHNpemU9IjI1Ii8+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgdGlja2V0IHN0YXRlIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiTmV4dFN0YXRlc1N0cmcifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIERhdGUifSAoJFRleHR7ImZvciBwZW5kaW5nKiBzdGF0ZXMifSk6PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQZW5kaW5nRGF0ZVN0cmluZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkRhdGUgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJJbXBhY3RTdHJnIn08L3RkPgogICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJQcmlvcml0eVN0cmcifTwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQyIn08L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lIn08L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRGcmVlVGltZTEifTwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn08L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMSJ9PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZDIifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGltZVVuaXRzIiB2YWx1ZT0iJFFEYXRheyJUaW1lVW5pdHMifSIgc2l6ZT0iMyIvPjwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgPC90YWJsZT4KICAgICAgICA8YnIvPgogICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgbmFtZT0iQ3JlYXRlIiB2YWx1ZT0iJFRleHR7IkNyZWF0ZSJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiLz4KICAgICAgPC9mb3JtPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9InNwZWxsaW5nIiB0YXJnZXQ9InNwZWxsaW5nIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFNwZWxsaW5nIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQm9keSIgdmFsdWU9IiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWxsX2xhbmciIHZhbHVlPSIiLz4KICAgICAgPC9mb3JtPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImZhcSIgdGFyZ2V0PSJmYXEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50RkFRIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTmF2IiB2YWx1ZT0iTm9uZSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iV2hhdCIgdmFsdWU9IiIvPgogICAgICA8L2Zvcm0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iY3VzdG9tZXIiIHRhcmdldD0iY3VzdG9tZXIiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFkbWluQ3VzdG9tZXJVc2VyIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTmF2IiB2YWx1ZT0iTm9uZSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJXaGF0IiB2YWx1ZT0iIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4K
IyAtLQojIEFnZW50VGlja2V0UHJpbnQuZHRsIC0gcHJvdmlkZXMgSFRNTCBwcmludCB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFByaW50LmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE4OjU5OjA3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW50LmR0bCx2IDEuMjMgMjAwOC8wNi8yMyAwNzowNzo1MyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kQ29uZmlneyJUaWNrZXQ6Okhvb2sifTogJFFEYXRheyJUaWNrZXROdW1iZXIifSAvICRRRGF0YXsiVGl0bGUifTwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJUaWNrZXQtSW5mbyJ9OgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPiRUZXh0eyJTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjYwJSI+JFRleHR7IiREYXRheyJTdGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgojICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifTwvdGQ+CiMgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUXVldWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiUXVldWUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMb2NrIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IkxvY2sifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkN1c3RvbWVySUQifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDdXN0b21lcklEIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiT3duZXIifSAoJFFEYXRheyJVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJVc2VyTGFzdG5hbWUifSk8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlJlc3BvbnNpYmxlU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU2VydmljZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJTTEEifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkltcGFjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJJbXBhY3QifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPiRUZXh0eyJBZ2UifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPiRRRGF0YXsiQWdlIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWNjb3VudGVkIHRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRUaW1lVW5pdHMifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIHRpbGwifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQZW5kaW5nVW50aWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlVwZGF0ZSBUaW1lIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZVNob3J0eyIkUURhdGF7IlVwZGF0ZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU29sdXRpb24gVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVTaG9ydHsiJFFEYXRheyJTb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSIzMCUiPjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgIDwvdHI+CgojIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZUtleTEtMTYgYW5kIFRpY2tldEZyZWVUZXh0MS0xNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleSIsIjIwIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjAifTwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgPHRyPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjIwIn06PC90ZD4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjAifTwvZGl2PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleTIiLCIyMCJ9OjwvdGQ+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjIwIn08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVUaW1lMS02CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJMaW5rZWQtT2JqZWN0In06CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZSAtLT4KICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiJERhdGF7IkxpbmtUeXBlTmFtZSJ9In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGVSb3cgLS0+CiAgICAgICAgICAgICAgICAgICREYXRheyJMaW5rU3RyZyJ9PGJyPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZVJvdyAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1R5cGUgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgJFRleHR7IkN1c3RvbWVyIEluZm8ifToKICAgICAgJERhdGF7IkN1c3RvbWVyVGFibGUifQogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIHN0YXJ0IHRpY2tldCAkRGF0YXsiVGlja2V0TnVtYmVyIn0gLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGUgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iIzAwMDAwMCIgY2xhc3M9ImNvbnRhaW5lciI+CiAgPHRyPgogICAgPHRkPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJzbWFsbCI+CiAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgojIEZyb206LCBUbzosIENjOgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMTYwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0gJFRleHR7ImJ5In0gJERhdGF7IlNlbmRlclR5cGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KIyBzaG93IHRoZSBBcnRpY2xlOjpGcmVlS2V5MS0zIGFuZCBBcnRpY2xlOjpGcmVlVGV4dDEtMwo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kUURhdGF7IktleSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjE2MCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQXJ0aWNsZVR5cGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJERhdGF7IkFydGljbGU6OkFUTSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICA8L3RhYmxlPgokRGF0YXsiVGV4dE5vdGUifQogICAgICAgICAgICAgICAgICA8cHJlPgokRGF0YXsiQm9keSJ9CiAgICAgICAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgo8IS0tIGVuZCB0aWNrZXQgLS0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjxici8+CjwhLS0gZHRsOmJsb2NrOkFydGljbGUgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0UHJpb3JpdHkuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBwcmlvcml0eSBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFByaW9yaXR5LmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE2OjI4OjI3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW9yaXR5LmR0bCx2IDEuMjAgMjAwOC8wNS8wOCAyMjo1MjozNSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2hhbmdlIHByaW9yaXR5IG9mIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4gKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyLz4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVGl0bGUgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTTEFTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByZXZpb3VzIE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gQWdlbnQifTogKCRUZXh0eyJPcHRpb25hbCJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iI2F0dGFjaG1lbnQiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBdHRhY2htZW50cyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gucG5nIj4kVGV4dHsiQXR0YWNobWVudHMifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkJvZHkiIHJvd3M9IjE2IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJvZHkgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIGRhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkRhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyLz4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4K
IyAtLQojIEFnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgVGlja2V0VmlldyBmb3IgQWdlbnRUaWNrZXRRdWV1ZVZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3LmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE5OjQ1OjQxIHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFF1ZXVlVGlja2V0Vmlldy5kdGwsdiAxLjIxIDIwMDgvMDQvMjkgMjI6MDA6NTggbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjwhLS0gc3RhcnQgdGlja2V0IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CjwhLS0gZHRsOmJsb2NrOkJ1bGsgLS0+CiAgICA8dGQgd2lkdGg9IjElIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICA8Zm9ybSBuYW1lPSJhYnVsayREYXRheyJDb3VudGVyIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iU2VsZWN0ZWQiIHZhbHVlPSIxIiBvbmNsaWNrPSJCdWxrQ2hhbmdlU2VsZWN0ZWQoJERhdGF7IlRpY2tldElEIn0sJERhdGF7IkNvdW50ZXIifSkiLz4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KPCEtLSBkdGw6YmxvY2s6QnVsayAtLT4KICAgIDx0ZCB3aWR0aD0iNjAlIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kQ29uZmlneyJUaWNrZXQ6Okhvb2sifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlRpdGxlLS0+CiAgICAgICRRRGF0YXsiVGl0bGUiLCI2MCJ9CjwhLS0gZHRsOmJsb2NrOlRpdGxlLS0+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjM5JSIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFnZSJ9OiAkRGF0YXsiQWdlIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNjAlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgIDwvdGQ+CiAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIiBjbGFzcz0ibWVudSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+ICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiPjxiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiODAifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgojIHNob3cgdGhlIEFydGljbGU6OkZyZWVLZXkxLTMgYW5kIEFydGljbGU6OkZyZWVUZXh0MS0zCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiPjxiPiRRRGF0YXsiS2V5In06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjgwIn08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KIyAtLQojIHNob3cgRnJlZUtleTEtMyBhbmQgRnJlZVRleHQxLTMgKGluIG90aGVyIHdheSBsaWtlIHRoZSBibG9jaywgc28geW91IGNvdWxkIGFkZCBsaW5rIG9yIHNvbWV0aGluIGVsc2UpCiMgLS0KIzxkdGwgaWYgKCREYXRheyJGcmVlS2V5MSJ9IG5lICIiKSB7ICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzEifSA9ICI8dHI+PHRkIHZhbGlnbj0idG9wIj48Yj4kUURhdGF7IkZyZWVLZXkxIn06PC9iPjwvdGQ+PHRkPiAkUURhdGF7IkZyZWVUZXh0MSJ9PC90ZD48L3RyPiI7IH0+CiM8ZHRsIGlmICgkRGF0YXsiRnJlZUtleTIifSBuZSAiIikgeyAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmcyIn0gPSAiPHRyPjx0ZCB2YWxpZ249InRvcCI+PGI+JFFEYXRheyJGcmVlS2V5MiJ9OjwvYj48L3RkPjx0ZD4gJFFEYXRheyJGcmVlVGV4dDIifTwvdGQ+PC90cj4iOyB9PgojPGR0bCBpZiAoJERhdGF7IkZyZWVLZXkzIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMyJ9ID0gIjx0cj48dGQgdmFsaWduPSJ0b3AiPjxiPiRRRGF0YXsiRnJlZUtleTMifTo8L2I+PC90ZD48dGQ+ICRRRGF0YXsiRnJlZVRleHQzIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9CiMgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifQojICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmczIn0KIyBzaG93IGFydGljbGUgb3B0aW9ucyBsaWtlIHNpZ25lZCwgY3J5cHRlZCwgLi4uCjwhLS0gZHRsOmJsb2NrOkFydGljbGVPcHRpb24tLT4KICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU3VjY2Vzc2Z1bCJ9IGVxICIwIikgeyAkRGF0YXsiU3RhcnRGb250In0gPSAiPGZvbnQgY29sb3I9InJlZCI+IjsgfT4KICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU3VjY2Vzc2Z1bCJ9IGVxICIwIikgeyAkRGF0YXsiU3RvcEZvbnQifSA9ICI8L2ZvbnQ+IjsgfT4KICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU3VjY2Vzc2Z1bCJ9IGVxICIxIikgeyAkRGF0YXsiU3RhcnRGb250In0gPSAiPGZvbnQgY29sb3I9ImdyZWVuIj4iOyB9PgogICAgICAgIDxkdGwgaWYgKCREYXRheyJTdWNjZXNzZnVsIn0gZXEgIjEiKSB7ICREYXRheyJTdG9wRm9udCJ9ID0gIjwvZm9udD4iOyB9PgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE1JSI+PGI+JFRleHR7IiREYXRheyJLZXkifSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiREYXRheyJTdGFydEZvbnQifSRRRGF0YXsiVmFsdWUiLCI4MCJ9JERhdGF7IlN0b3BGb250In08L2Rpdj48L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVPcHRpb24gLS0+CiAgICAgIDwvdGFibGU+CiREYXRheyJCb2R5Tm90ZSJ9CiAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgokRGF0YXsiQm9keSJ9CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iMjUlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGNsYXNzPSJQcmlvcml0eUlELSREYXRheyJQcmlvcml0eUlEIn0iPgogICAgICA8cD4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJUeXBlIn06PC9iPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkUURhdGF7IlR5cGUifSI+JFFEYXRheyJUeXBlIiwiMTgifTwvZGl2PjwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTdGF0ZSJ9OjwvYj48L3RkPgogICAgICAgICAgICA8dGQ+PGZvbnQgY29sb3I9InJlZCI+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9IiwiMTgifTwvZGl2PjwvZm9udD48L3RkPgogICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUHJpb3JpdHkifTo8L2I+PC90ZD4KIyAgICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiMgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUXVldWUifTo8L2I+PC90ZD4KICAgICAgICAgICAgPHRkPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRRGF0YXsiUXVldWUifSI+JFFEYXRheyJRdWV1ZSIsIjE4In08L2Rpdj48L2ZvbnQ+PC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNlcnZpY2UifTo8L2I+PC90ZD4KICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRRRGF0YXsiU2VydmljZSJ9Ij4kUURhdGF7IlNlcnZpY2UiLCIxOCJ9PC9kaXY+PC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU0xBIn06PC9iPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkUURhdGF7IlNMQSJ9Ij4kUURhdGF7IlNMQSIsIjE4In08L2Rpdj48L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSJ9Ij4kUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lSHVtYW4ifTxici8+JFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgICA8L2ZvbnQ+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiVXBkYXRlIFRpbWUifTo8L2I+PC90ZD4KICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJVcGRhdGVUaW1lV29ya2luZ1RpbWUifSI+JFFEYXRheyJVcGRhdGVUaW1lSHVtYW4ifTxici8+JFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgPC9mb250Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L2I+PC90ZD4KICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiU29sdXRpb25UaW1lV29ya2luZ1RpbWUifSI+JFFEYXRheyJTb2x1dGlvblRpbWVIdW1hbiJ9PGJyLz4kVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgICAgPC9mb250Pgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L2I+PC90ZD4KICAgICAgICAgICAgPHRkPiRUZXh0eyIkRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkltcGFjdCJ9OjwvYj48L3RkPgogICAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJJbXBhY3QifSJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQ+PGI+JFRleHR7IlByaW9yaXR5In06PC9iPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQ+PGI+JFRleHR7IkN1c3RvbWVySUQifTo8L2I+PC90ZD4KICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiRDb25maWd7IkN1c3RvbWVyREJMaW5rIn0iICRDb25maWd7IkN1c3RvbWVyREJMaW5rVGFyZ2V0In0+JFF1b3RleyIkRGF0YXsiQ3VzdG9tZXJJRCJ9IiwiMTgifTwvYT48L3RkPgogICAgICAgICAgPC90cj4KIyAgICAgICAgICA8dHIgIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiT3duZXIifTo8L2I+PC90ZD4KIyAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkUURhdGF7Ik93bmVyIn0iPiRRRGF0YXsiT3duZXIiLCIxOCJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojIC0tCgojIHNob3cgVGlja2V0RnJlZUtleTEtMiBhbmQgVGlja2V0RnJlZVRleHQxLTIKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5IiwiMjUifTo8L2I+PC90ZD4KICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgogICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjI1In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rIC0tPgogICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+PGEgaHJlZj0iJERhdGF7IlRpY2tldEZyZWVUZXh0TGluayJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjI1In08L2E+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluayAtLT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjI1In06PC9iPjwvdGQ+CiMgICAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMSAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDEifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDEiLCIyNSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazEgLS0+CiMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIn0iPjxhIGhyZWY9IiRDb25maWd7IlRpY2tldEZyZWVUZXh0TGluazEifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjUifTwvYT48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazEgLS0+CiMgICAgICAgICAgICA8L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjUifTo8L2I+PC90ZD4KIyAgICAgICAgICAgIDx0ZD4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4yIC0tPgojICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MiJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjI1In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4yIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMiAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+PGEgaHJlZj0iJENvbmZpZ3siVGlja2V0RnJlZVRleHRMaW5rMiJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9hPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMiAtLT4KIyAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KCiMgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2hvdyBUaWNrZXRGcmVlVGltZTEtNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC9iPjwvdGQ+CiAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In08L2Rpdj48L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L2I+PC90ZD4KIyAgICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifTwvZGl2PjwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgoKICAgICAgICA8L3RhYmxlPgojIHNob3cgY3VzdG9tZXIgaW5mbyB0YWJsZQo8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgogICAgICAgIDxwPjxocj48Yj4kVGV4dHsiQ3VzdG9tZXIgSW5mbyJ9OjwvYj4gJERhdGF7IkN1c3RvbWVyVGFibGUifTxocj48L3A+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgPGJyLz4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSI5NSUiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQ+CiMgc2hvdyBjb21wb3NlIGxpbmtzCjwhLS0gZHRsOmJsb2NrOkFnZW50SXNDdXN0b21lciAtLT4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxiPiRUZXh0eyJZb3VyIG93biBUaWNrZXQifTo8L2I+CiAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCI+CiAgICAgICAgICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldEN1c3RvbWVyRm9sbG93VXAmVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJDb21wb3NlIEZvbGxvdyB1cCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IkNvbXBvc2UgRm9sbG93IHVwIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgIDwvcD4KPCEtLSBkdGw6YmxvY2s6QWdlbnRJc0N1c3RvbWVyIC0tPgo8IS0tIGR0bDpibG9jazpBZ2VudEFuc3dlciAtLT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXJDb21wb3NlIC0tPgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGI+JFRleHR7IkNvbXBvc2UgQW5zd2VyIn0gKCRUZXh0eyJlbWFpbCJ9KTo8L2I+CiAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCI+CiAgICAgICAgICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlN0ZFJlc3BvbnNlc1N0cmcifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgIDwvcD4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXJDb21wb3NlIC0tPgo8IS0tIGR0bDpibG9jazpBZ2VudEFuc3dlclBob25lT3V0Ym91bmQgLS0+CiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8Yj4kVGV4dHsiQ29udGFjdCBjdXN0b21lciJ9ICgkVGV4dHsicGhvbmUifSk6PC9iPgogICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgICAgICAgICAgICAgICA8dHIgYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJBZ2VudFBob25lIn0gbmUgIjAiKSB7ICREYXRheyJBZ2VudFBob25lU3RyZyJ9ID0gIjxsaT48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0UGhvbmVPdXRib3VuZCZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSZRdWV1ZUlEPSREYXRheyJRdWV1ZUlEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJQaG9uZSBjYWxsIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiUGhvbmUgY2FsbCJ9PC9hPjwvbGk+IjsgfT4KJERhdGF7IkFnZW50UGhvbmVTdHJnIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyUGhvbmVPdXRib3VuZCAtLT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXIgLS0+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvcD4KICAgICAgPHA+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iOTUlIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpNb3ZlIC0tPgogICAgICAgICAgICAgIDxiPiRUZXh0eyJDaGFuZ2UgcXVldWUifTo8L2I+CiAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldE1vdmUiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlF1ZXVlSUQiIHZhbHVlPSIkUURhdGF7IlF1ZXVlSUQifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgICREYXRheyJNb3ZlUXVldWVzU3RyZyJ9CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7Ik1vdmUifSIvPgogICAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6TW92ZSAtLT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9wPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCB0aWNrZXQgLS0+Cg==
IyAtLQojIEFnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3TGl0ZS5kdGwgLSBwcm92aWRlcyBIVE1MIFRpY2tldFZpZXcgZm9yIEFnZW50VGlja2V0UXVldWUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0UXVldWVUaWNrZXRWaWV3TGl0ZS5kdGwsdiAxLjEgMjAwOC8wNy8wMiAxOTo0NTo0MSB1YiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRRdWV1ZVRpY2tldFZpZXdMaXRlLmR0bCx2IDEuMTcgMjAwOC8wNC8yOSAyMjowMDo1OCBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPCEtLSBzdGFydCB0aWNrZXQgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KPCEtLSBkdGw6YmxvY2s6QnVsayAtLT4KICAgIDx0ZCB3aWR0aD0iMSUiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgIDxmb3JtIG5hbWU9ImFidWxrJERhdGF7IkNvdW50ZXIifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJTZWxlY3RlZCIgdmFsdWU9IjEiIG9uY2xpY2s9IkJ1bGtDaGFuZ2VTZWxlY3RlZCgkRGF0YXsiVGlja2V0SUQifSwkRGF0YXsiQ291bnRlciJ9KSIvPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgo8IS0tIGR0bDpibG9jazpCdWxrIC0tPgogICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNjAlIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kQ29uZmlneyJUaWNrZXQ6Okhvb2sifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlRpdGxlLS0+CiAgICAgICRRRGF0YXsiVGl0bGUiLCI2MCJ9CjwhLS0gZHRsOmJsb2NrOlRpdGxlLS0+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjM5JSIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFnZSJ9OiAkRGF0YXsiQWdlIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iNjAlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJEZXNjcmlwdGlvbiJ9In0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgIDwvdGQ+CiAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iNDAlIiBjbGFzcz0ibWVudSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+ICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjYwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iODUlIiBjbGFzcz0iY29udGVudHZhbHVlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiODAifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgojIHNob3cgdGhlIEFydGljbGU6OkZyZWVLZXkxLTMgYW5kIEFydGljbGU6OkZyZWVUZXh0MS0zCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IktleSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjgwIn08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KIyAtLQojIHNob3cgRnJlZUtleTEtMyBhbmQgRnJlZVRleHQxLTMgKGluIG90aGVyIHdheSBsaWtlIHRoZSBibG9jaywgc28geW91IGNvdWxkIGFkZCBsaW5rIG9yIHNvbWV0aGluIGVsc2UpCiMgLS0KIzxkdGwgaWYgKCREYXRheyJGcmVlS2V5MSJ9IG5lICIiKSB7ICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzEifSA9ICI8dHI+PHRkIHZhbGlnbj0idG9wIj48Yj4kUURhdGF7IkZyZWVLZXkxIn06PC9iPjwvdGQ+PHRkPiAkUURhdGF7IkZyZWVUZXh0MSJ9PC90ZD48L3RyPiI7IH0+CiM8ZHRsIGlmICgkRGF0YXsiRnJlZUtleTIifSBuZSAiIikgeyAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmcyIn0gPSAiPHRyPjx0ZCB2YWxpZ249InRvcCI+PGI+JFFEYXRheyJGcmVlS2V5MiJ9OjwvYj48L3RkPjx0ZD4gJFFEYXRheyJGcmVlVGV4dDIifTwvdGQ+PC90cj4iOyB9PgojPGR0bCBpZiAoJERhdGF7IkZyZWVLZXkzIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMyJ9ID0gIjx0cj48dGQgdmFsaWduPSJ0b3AiPjxiPiRRRGF0YXsiRnJlZUtleTMifTo8L2I+PC90ZD48dGQ+ICRRRGF0YXsiRnJlZVRleHQzIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9CiMgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifQojICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmczIn0KIyAtLQogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiIGNsYXNzPSJQcmlvcml0eUlELSREYXRheyJQcmlvcml0eUlEIn0iPgogICAgICA8dGFibGUgYm9yZGVyPSIwIj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJUeXBlIn06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFFEYXRheyJUeXBlIn0iPiRRRGF0YXsiVHlwZSIsIjE4In08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU3RhdGUifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0iLCIxNCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyJQcmlvcml0eSJ9OjwvYj48L3RkPgojICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxNCJ9PC9kaXY+PC9mb250PjwvdGQ+CiMgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiUXVldWUifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUURhdGF7IlF1ZXVlIn0iPiRRRGF0YXsiUXVldWUiLCIxNCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjIwJSIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBjbGFzcz0iUHJpb3JpdHlJRC0kRGF0YXsiUHJpb3JpdHlJRCJ9Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyJDdXN0b21lcklEIn06PC9iPjwvdGQ+CiMgICAgICAgICAgPHRkPjxhIGhyZWY9IiRDb25maWd7IkN1c3RvbWVyREJMaW5rIn0iICRDb25maWd7IkN1c3RvbWVyREJMaW5rVGFyZ2V0In0+JFF1b3RleyIkRGF0YXsiQ3VzdG9tZXJJRCJ9IiwiMTQifTwvYT48L3RkPgojICAgICAgICA8L3RyPgojIC0tLQo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNlcnZpY2UifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkUURhdGF7IlNlcnZpY2UifSI+JFFEYXRheyJTZXJ2aWNlIiwiMTgifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNMQSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRRRGF0YXsiU0xBIn0iPiRRRGF0YXsiU0xBIiwiMTgifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJQcmlvcml0eSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSIsIjE0In08L2Rpdj48L2ZvbnQ+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkN1c3RvbWVySUQifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD48YSBocmVmPSIkQ29uZmlneyJDdXN0b21lckRCTGluayJ9IiAkQ29uZmlneyJDdXN0b21lckRCTGlua1RhcmdldCJ9PiRRdW90ZXsiJERhdGF7IkN1c3RvbWVySUQifSIsIjE0In08L2E+PC90ZD4KICAgICAgICA8L3RyPgojIC0tLQo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJGaXJzdCBSZXNwb25zZSBUaW1lIn06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lIn0iPiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVIdW1hbiJ9IC8gJFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgPC9mb250Pgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlVwZGF0ZVRpbWVXb3JraW5nVGltZSJ9Ij4kUURhdGF7IlVwZGF0ZVRpbWVIdW1hbiJ9IC8gJFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU29sdXRpb24gVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJTb2x1dGlvblRpbWVXb3JraW5nVGltZSJ9Ij4kUURhdGF7IlNvbHV0aW9uVGltZUh1bWFuIn0gLyAkVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KIyAtLQojIHNob3cgVGlja2V0RnJlZUtleTEtMiBhbmQgVGlja2V0RnJlZVRleHQxLTIKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkiLCIyNSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyNSJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4gLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluayAtLT4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij48YSBocmVmPSIkRGF0YXsiVGlja2V0RnJlZVRleHRMaW5rIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjUifTwvYT48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rIC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgPHRkPjxiPiRRRGF0YXsiVGlja2V0RnJlZUtleTEiLCIyNSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjEgLS0+CiMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIn0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjUifTwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsxIC0tPgojICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MSJ9Ij48YSBocmVmPSIkQ29uZmlneyJUaWNrZXRGcmVlVGV4dExpbmsxIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjI1In08L2E+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsxIC0tPgojICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQ+PGI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MiIsIjI1In06PC9iPjwvdGQ+CiMgICAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMiAtLT4KIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMiAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazIgLS0+CiMgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQyIn0iPjxhIGhyZWY9IiRDb25maWd7IlRpY2tldEZyZWVUZXh0TGluazIifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQyIiwiMjUifTwvYT48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazIgLS0+CiMgICAgICAgICAgICA8L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CgojIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZVRpbWUxLTYKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvYj48L3RkPgojICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC9iPjwvdGQ+CiMgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgojIHVzZSB0aGUgZm9sbG93aW5nIGlmIHlvdSB3YW50IGFsc28gYSBjaGFuZ2UgcXVldWUgb3B0aW9uIGluIHRoaXMgdmlldwojICA8dHI+CiMgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7PC90ZD4KIyAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJQcmlvcml0eUlELSREYXRheyJQcmlvcml0eUlEIn0iPjxiPiRUZXh0eyJDaGFuZ2UgcXVldWUifTo8L2I+PC90ZD4KIyAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJQcmlvcml0eUlELSREYXRheyJQcmlvcml0eUlEIn0iPgojICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgojICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldE1vdmUiLz4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IiREYXRheyJRdWV1ZUlEIn0iLz4KIyAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkRGF0YXsiVGlja2V0SUQifSIvPgojICAgICAgICAkRGF0YXsiTW92ZVF1ZXVlc1N0cmcifQojICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7Ik1vdmUifSIvPgojICAgICAgPC9mb3JtPgojICAgIDwvdGQ+CiMgIDwvdHI+CjwvdGFibGU+CjwhLS0gZW5kIHRpY2tldCAtLT4K
IyAtLQojIEFnZW50VGlja2V0UmVzcG9uc2libGUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciByZXNwb25zaWJsZSBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFJlc3BvbnNpYmxlLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE2OjI4OjI3IHViIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFJlc3BvbnNpYmxlLmR0bCx2IDEuMTUgMjAwOC8wNS8wOCAyMjo1MjozNSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNCiMgLS0tCiRJbmNsdWRleyJBSkFYIn0KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlR5cGVJRCAmJiBkb2N1bWVudC5jb21wb3NlLlR5cGVJRC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJUaWNrZXQgVHlwZSBpcyByZXF1aXJlZCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVHlwZUlELmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQo8IS0tIGR0bDpibG9jazpOb3RlSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIHN1YmplY3QhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlN1YmplY3QuZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgYm9keSEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuQm9keS5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6Tm90ZUpzIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dENoZWNrSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRKU1RleHR7IkEgcmVxdWlyZWQgZmllbGQgaXM6In0gJyArIGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZCJ9LnZhbHVlICsgJyEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0Q2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWVDaGVja0pzIC0tPgogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuJERhdGF7IlRpY2tldEZyZWVUaW1lQ2hlY2sifSAmJiBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uY2hlY2tlZCA9PSBmYWxzZSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIHJlcXVpcmVkIGZpZWxkIGlzOiJ9ICRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSEnKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLiREYXRheyJUaWNrZXRGcmVlVGltZUNoZWNrIn0uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lQ2hlY2tKcyAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgIT0gIiIpIHsKICAgICAgICB2YXIgcmVnID0gL14tezAsMX1cZCs/KChcLnwsKXswLDF9XGQrPyl7MCwxfSQvOwogICAgICAgIGlmIChyZWcudGVzdChkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy52YWx1ZSkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgYWxlcnQoJyRKU1RleHR7IkludmFsaWQgdGltZSEifScpOwogICAgICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5UaW1lVW5pdHMudmFsdWUgPT0gIiIgJiYgJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUifSkgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJZb3UgbmVlZCB0byBhY2NvdW50IHRpbWUhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRpbWVVbml0cy5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzSnMgLS0+CiAgICByZXR1cm4gdHJ1ZTsKfQovLy0tPgo8L3NjcmlwdD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpIHsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBjaGFuZ2Vfc2VsZWN0ZWQoc2VsKSB7CiAgICBzdGFydF9lbGVtZW50cyA9IChzZWwgKyA0KTsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzWzBdLm5hbWUgPT0gIiRDb25maWd7IlNlc3Npb25OYW1lIn0iKSB7CiAgICAgICAgc3RhcnRfZWxlbWVudHMgPSBzdGFydF9lbGVtZW50cyArIDE7CiAgICB9CiAgICBpZiAoIWRvY3VtZW50LmNvbXBvc2UuZWxlbWVudHNbc3RhcnRfZWxlbWVudHNdLmNoZWNrZWQpIHsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLmVsZW1lbnRzW3N0YXJ0X2VsZW1lbnRzXS5jaGVja2VkID0gdHJ1ZTsKICAgIH0KfQovLy0tPgo8L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6T3duZXJKcyAtLT4KCjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ2hhbmdlIHJlc3BvbnNpYmxlIG9mIHRpY2tldCJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRCYWNrIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlblZpZXcifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkJhY2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IkJhY2sifTwvYT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CiAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9d2FybmluZy5wbmciIGFsdD0iJFRleHR7IkluZm8ifSI+OiA8Zm9udCBjb2xvcj0icmVkIj4kVGV4dHsiVGlja2V0IGxvY2tlZCEifTwvZm9udD4gKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRMb2NrJlN1YmFjdGlvbj1VbmxvY2smVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJUaWNrZXQgdW5sb2NrISJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IlRpY2tldCB1bmxvY2shIn08L2E+KQo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzTG9jayAtLT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGJyLz4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIHZhbHVlPSIiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaXRsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiVGl0bGUgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVHlwZVN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTZXJ2aWNlU3RyZyJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IlNlcnZpY2UgaW52YWxpZCJ9In08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJTTEFTdHJnIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiRUZXh0eyIkRGF0YXsiU0xBIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjE4JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOZXcgT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgJERhdGF7Ik5ld093bmVyVHlwZTo6TmV3In0vPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik93bmVyU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByZXZpb3VzIE93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiAkRGF0YXsiTmV3T3duZXJUeXBlOjpPbGQifS8+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT2xkT3duZXJTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUmVzcG9uc2libGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gQWdlbnQifTogKCRUZXh0eyJPcHRpb25hbCJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgo8IS0tIGR0bDpibG9jazpJbnZvbHZlZEFnZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbmZvcm0gaW52b2x2ZWQgQWdlbnRzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iNzAiLz4KICAgICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJTdWJqZWN0IGludmFsaWQifSJ9PC9mb250PgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KICAgICAgICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iI2F0dGFjaG1lbnQiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJBdHRhY2htZW50cyJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gucG5nIj4kVGV4dHsiQXR0YWNobWVudHMifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkJvZHkiIHJvd3M9IjE2IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kVGV4dHsiJERhdGF7IkJvZHkgaW52YWxpZCJ9In08L2ZvbnQ+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIi8+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImF0dGFjaG1lbnQiPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOb3RlIHR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpOb3RlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmV4dCBzdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiU3RhdGVTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGVQZW5kaW5nIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIGRhdGUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkRhdGVTdHJpbmcifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JFRleHR7IiREYXRheyJEYXRlIGludmFsaWQifSJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJJbXBhY3QifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkltcGFjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CiMgLS0tCjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUHJpb3JpdHlTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDIifTwvdGQ+CiMgICAgICAgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVGlja2V0RnJlZVRpbWUyIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn06PC90ZD4KIyAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQxIn08L3RkPgojICAgICAgICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkMiJ9PC90ZD4KIyAgICAgICAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIHNpemU9IjMiLz48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIi8+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyLz4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllcyAtLT4K
IyAtLQojIEFnZW50VGlja2V0Wm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvciBBZ2VudFRpY2tldFpvb20ucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0Wm9vbS5kdGwsdiAxLjMgMjAwOC8wNy8wNyAwNjo1ODoyNyBtaCBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRab29tLmR0bCx2IDEuNDQgMjAwOC8wNy8wMyAxOToyNDozMiBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6SGVhZGVyIC0tPgo8IS0tIHN0YXJ0IHRpY2tldCBoZWFkICREYXRheyJUaWNrZXROdW1iZXIifSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJab29tIn0gJENvbmZpZ3siVGlja2V0OjpIb29rIn06ICREYXRheyJUaWNrZXROdW1iZXIifSAkRW52eyJCb3gxIn0KPCEtLSBkdGw6YmxvY2s6VGl0bGUtLT4KICAgICAgJFFEYXRheyJUaXRsZSIsIjYwIn0KPCEtLSBkdGw6YmxvY2s6VGl0bGUtLT4KICAgIDwvdGQ+CiAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQWdlIn06ICREYXRheyJBZ2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjcwJSIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgogICAgICAtCjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSIgJERhdGF7IkxpbmtQYXJhbSJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7Ik5hbWUifSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjMwJSIgY2xhc3M9Im1lbnUiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiAkVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6Qm9keSAtLT4KICA8dHI+CiAgICA8dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NSUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOlRyZWUgLS0+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtIC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJTZW5kZXJUeXBlIn0tJFFEYXRheyJBcnRpY2xlVHlwZSJ9Ij4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkZyb20iLCI3MCJ9OiAkUURhdGF7IlN1YmplY3QiLCIyMDAifSAtICRUaW1lU2hvcnR7IiRRRGF0YXsiQ3JlYXRlZCJ9In0iPgogICAgICAgICAgICAgICAgICAkRGF0YXsiU3RhcnQyIn0kRGF0YXsiU3BhY2UifSREYXRheyJTdG9wMiJ9JERhdGF7IlN0YXJ0In0kRGF0YXsiU3RhcnQyIn0mbmJzcDskUURhdGF7IkNvdW50In0uJm5ic3A7JERhdGF7IlN0b3AyIn0mbmJzcDs8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0Wm9vbSZUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn0mQXJ0aWNsZUlEPSRRRGF0YXsiQXJ0aWNsZUlEIn0mWm9vbUV4cGFuZD0kTFFEYXRheyJab29tRXhwYW5kIn0jJFFEYXRheyJBcnRpY2xlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiU2VuZGVyVHlwZSJ9In0gKCRUZXh0eyIkUURhdGF7IkFydGljbGVUeXBlIn0ifSknOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiJFFEYXRheyJTZW5kZXJUeXBlIn0ifSZuYnNwOygkVGV4dHsiJFFEYXRheyJBcnRpY2xlVHlwZSJ9In0pPC9hPiREYXRheyJTdG9wIn0KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1FbWFpbCAtLT4KICAgICAgICAgICAgICAgICAgKDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRQbGFpbiZUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn0mQXJ0aWNsZUlEPSRRRGF0YXsiQXJ0aWNsZUlEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJwbGFpbiJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgdGl0bGU9IiRUZXh0eyJwbGFpbiJ9Ij4kVGV4dHsicGxhaW4ifTwvYT4pCjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtRW1haWwgLS0+CiAgICAgICAgICAgICAgICAgICREYXRheyJTdGFydCJ9JFFEYXRheyJGcm9tIiwiMzQifSAkUURhdGF7IlN1YmplY3QiLCIzNCJ9JERhdGF7IlN0b3AifQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InNtYWxsIiBhbGlnbj0icmlnaHQiPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRBdHRhY2htZW50JkFydGljbGVJRD0kUURhdGF7IkFydGljbGVJRCJ9JkZpbGVJRD0kUURhdGF7IkZpbGVJRCJ9IiB0aXRsZT0iJFFEYXRheyJGaWxlbmFtZSJ9IC0gJFFEYXRheyJGaWxlc2l6ZSJ9IiAkRGF0YXsiVGFyZ2V0In0+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gtc21hbGwucG5nIj48L2E+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQXR0YWNobWVudCAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BdHRhY2htZW50TW9yZSAtLT4KICAgICAgICAgICAgICAgICAgJm5ic3A7Wy4uXQo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnRNb3JlIC0tPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICREYXRheyJTdGFydCJ9JFRpbWVTaG9ydHsiJFFEYXRheyJDcmVhdGVkIn0ifSREYXRheyJTdG9wIn0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW0gLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlRyZWUgLS0+CiAgICAgIDxociBzaXplPSIyIj4KICAgICAgPGEgbmFtZT0iJERhdGF7IkFydGljbGVJRCJ9Ij48L2E+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iOTglIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgojIEZyb206LCBUbzosIENjOgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMjAwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gPGRpdiB0aXRsZT0iJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0iPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8L3RyPgojIHNob3cgdGhlIEFydGljbGVGcmVlS2V5MS0zIGFuZCBBcnRpY2xlRnJlZVRleHQxLTMKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFFEYXRheyJLZXkifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIxNjAifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgojIHNob3cgQXJ0aWNsZUZyZWVLZXkxLTMgYW5kIEFydGljbGVGcmVlVGV4dDEtMyAoaW4gb3RoZXIgd2F5IGxpa2UgdGhlIGJsb2NrLCBzbyB5b3UgY291bGQgYWRkIGxpbmsgb3Igc29tZXRoaW4gZWxzZSkKIyAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkxIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkxIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiRnJlZVRleHQxIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMiJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiRnJlZVRleHQyIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkzIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMyJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkzIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiRnJlZVRleHQzIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMSJ9CiMgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifQojICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmczIn0KCiMgc2hvdyBhcnRpY2xlIG9wdGlvbnMgbGlrZSBzaWduZWQsIGNyeXB0ZWQsIC4uLgo8IS0tIGR0bDpibG9jazpBcnRpY2xlT3B0aW9uIC0tPgogICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJTdWNjZXNzZnVsIn0gZXEgIjAiKSB7ICREYXRheyJTdGFydEZvbnQifSA9ICI8Zm9udCBjb2xvcj0icmVkIj4iOyB9PgogICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJTdWNjZXNzZnVsIn0gZXEgIjAiKSB7ICREYXRheyJTdG9wRm9udCJ9ID0gIjwvZm9udD4iOyB9PgogICAgICAgICAgICAgIDxkdGwgaWYgKCREYXRheyJTdWNjZXNzZnVsIn0gZXEgIjEiKSB7ICREYXRheyJTdGFydEZvbnQifSA9ICI8Zm9udCBjb2xvcj0iZ3JlZW4iPiI7IH0+CiAgICAgICAgICAgICAgPGR0bCBpZiAoJERhdGF7IlN1Y2Nlc3NmdWwifSBlcSAiMSIpIHsgJERhdGF7IlN0b3BGb250In0gPSAiPC9mb250PiI7IH0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kRGF0YXsiU3RhcnRGb250In0kUURhdGF7IlZhbHVlIiwiMTYwIn0kRGF0YXsiU3RvcEZvbnQifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZU9wdGlvbiAtLT4KIyBzaG93IGF0dGFjaG1lbnRzCjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFRleHR7IiREYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiREYXRheyJMaW5rIn0iICREYXRheyJUYXJnZXQifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9OiAkUURhdGF7IkZpbGVuYW1lIn0nO3JldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiSW1hZ2UifSIgYm9yZGVyPSIwIiBhbHQ9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9Ij48L2E+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93TGluayAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3dOb0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiSW1hZ2UifSIgYm9yZGVyPSIwIiBhbHQ9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9Ij4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3dOb0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CgokRGF0YXsiQm9keU5vdGUifQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KJERhdGF7IkJvZHkifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgo8IS0tIGR0bDpibG9jazpFeHBhbmQgLS0+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJFeHBhbmQgVmlldyJ9Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9JkFydGljbGVJRD0kUURhdGF7IkFydGljbGVJRCJ9Jlpvb21FeHBhbmQ9MSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkV4cGFuZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1leHBhbmQucG5nIj48L2E+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpFeHBhbmQgLS0+CjwhLS0gZHRsOmJsb2NrOkNvbGxhcHNlIC0tPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiQ29sbGFwc2UgVmlldyJ9Ij4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb20mVGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9JkFydGljbGVJRD0kUURhdGF7IkFydGljbGVJRCJ9Jlpvb21FeHBhbmQ9MCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkNvbGxhcHNlIFZpZXcifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9Y29sbGFwc2UucG5nIj48L2E+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpDb2xsYXBzZSAtLT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgPGhyIHNpemU9IjIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSB3aWR0aD0iOTglIiBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZUNvbXBsZXggLS0+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSIyNSUiIHZhbGlnbj0idG9wIiBjbGFzcz0iUHJpb3JpdHlJRC0kRGF0YXsiUHJpb3JpdHlJRCJ9Ij4KIyBzaG93IHRpY2tldCBzdGF0dXMgKHN0YXRlLCBsb2NrLCAuLi4pCiMgLS0tCiMgSVRTTQojIC0tLQojPCEtLSBkdGw6YmxvY2s6U3RhdHVzIC0tPgojICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiM8IS0tIGR0bDpibG9jazpUeXBlIC0tPgojICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiVHlwZSJ9OjwvYj48L3RkPgojICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVHlwZSJ9Ij4kUURhdGF7IlR5cGUiLCIxOCJ9PC9kaXY+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiMgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTdGF0ZSJ9OjwvYj48L3RkPgojICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9IiwiMTgifTwvZGl2PgojICAgICAgICAgICAgPC9mb250PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiMgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyJMb2NrZWQifTo8L2I+PC90ZD4KIyAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJMb2NrIn0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiTG9jayJ9In0iLCIxOCJ9PC9kaXY+CiMgICAgICAgICAgICA8L2ZvbnQ+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIyAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICA8dGQ+PGI+JFRleHR7IlByaW9yaXR5In06PC9iPjwvdGQ+CiMgICAgICAgICAgPHRkPgojICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+CiMgICAgICAgICAgICA8L2ZvbnQ+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIyAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICA8dGQ+PGI+JFRleHR7IlF1ZXVlIn06PC9iPjwvdGQ+CiMgICAgICAgICAgPHRkPgojICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlF1ZXVlIn0iPiRRRGF0YXsiUXVldWUiLCIxOCJ9PC9kaXY+CiMgICAgICAgICAgICA8L2ZvbnQ+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiMgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTZXJ2aWNlIn06PC9iPjwvdGQ+CiMgICAgICAgICAgPHRkPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJTZXJ2aWNlIn0iPiRRRGF0YXsiU2VydmljZSIsIjE4In08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KIyAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNMQSJ9OjwvYj48L3RkPgojICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiU0xBIn0iPiRRRGF0YXsiU0xBIiwiMTgifTwvZGl2PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpTTEEgLS0+CiM8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KIyAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICA8dGQ+PGI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L2I+PC90ZD4KIyAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdGFydCAtLT4KIyAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgojPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RhcnQgLS0+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSJ9Ij4KIyAgICAgICAgICAgICRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVIdW1hbiJ9CiMgICAgICAgICAgICA8YnIvPgojICAgICAgICAgICAgJFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KIyAgICAgICAgICAgIDwvZGl2PgojPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RvcCAtLT4KIyAgICAgICAgICAgIDwvZm9udD4KIzwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0b3AgLS0+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgojPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KIyAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICA8dGQ+PGI+JFRleHR7IlVwZGF0ZSBUaW1lIn06PC9iPjwvdGQ+CiMgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdGFydCAtLT4KIyAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgojPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdGFydCAtLT4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJVcGRhdGVUaW1lV29ya2luZ1RpbWUifSI+CiMgICAgICAgICAgICAkUURhdGF7IlVwZGF0ZVRpbWVIdW1hbiJ9CiMgICAgICAgICAgICA8YnIvPgojICAgICAgICAgICAgJFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifQojICAgICAgICAgICAgPC9kaXY+CiM8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiMgICAgICAgICAgICA8L2ZvbnQ+CiM8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiMgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyJTb2x1dGlvbiBUaW1lIn06PC9iPjwvdGQ+CiMgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0YXJ0IC0tPgojICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiM8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiU29sdXRpb25UaW1lV29ya2luZ1RpbWUifSI+CiMgICAgICAgICAgICAkUURhdGF7IlNvbHV0aW9uVGltZUh1bWFuIn0KIyAgICAgICAgICAgIDxici8+CiMgICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KIyAgICAgICAgICAgIDwvZGl2PgojPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiMgICAgICAgICAgICA8L2ZvbnQ+CiM8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RvcCAtLT4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgojICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQ3VzdG9tZXJJRCJ9OjwvYj48L3RkPgojICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgIDxhIGhyZWY9IiRDb25maWd7IkN1c3RvbWVyREJMaW5rIn0iICRDb25maWd7IkN1c3RvbWVyREJMaW5rVGFyZ2V0In0+JFF1b3RleyIkRGF0YXsiQ3VzdG9tZXJJRCJ9IiwiMTgifTwvYT4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiQWNjb3VudGVkIHRpbWUifTo8L2I+PC90ZD4KIyAgICAgICAgICA8dGQ+JERhdGF7IlRpY2tldFRpbWVVbml0cyJ9PC90ZD4KIyAgICAgICAgPC90cj4KIyMgdXNlIHRpY2tldCBpcyBwZW5kaW5nCiMgICAgICAgIDxkdGwgaWYgKCREYXRheyJQZW5kaW5nVW50aWwifSBuZSAiIikgeyAkRGF0YXsiUGVuZGluZ1VudGlsU3RyaW5nIn0gPSAiPHRyIHZhbGlnbj0idG9wIj48dGQ+PGI+JFRleHR7IlBlbmRpbmcgdGlsbCJ9OjwvYj48L3RkPjx0ZD4kRGF0YXsiUGVuZGluZ1VudGlsIn08L3RkPjwvdHI+IjsgfT4KIyAgICAgICAgJERhdGF7IlBlbmRpbmdVbnRpbFN0cmluZyJ9CiM8IS0tIGR0bDpibG9jazpPd25lciAtLT4KIyAgICAgICAgPHRyICB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyJPd25lciJ9OjwvYj48L3RkPgojICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVXNlckxvZ2luIn0gKCRRRGF0YXsiVXNlckZpcnN0bmFtZSJ9JFFEYXRheyJVc2VyTGFzdG5hbWUifSkiPgojICAgICAgICAgICAgJFFEYXRheyJVc2VyTG9naW4iLCIxOCJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMTgifSkKIyAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpPd25lciAtLT4KIzwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgojICAgICAgICA8dHIgIHZhbGlnbj0idG9wIj4KIyAgICAgICAgICA8dGQ+PGI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC9iPjwvdGQ+CiMgICAgICAgICAgPHRkPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJVc2VyTG9naW4ifSAoJFFEYXRheyJVc2VyRmlyc3RuYW1lIn0kUURhdGF7IlVzZXJMYXN0bmFtZSJ9KSI+CiMgICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjE4In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIxOCJ9KQojICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgojIyBzaG93IFRpY2tldEZyZWVLZXkxLTE2IGFuZCBUaWNrZXRGcmVlVGV4dDEtMTYKIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkiLCIyNSJ9OjwvYj48L3RkPgojICAgICAgICAgIDx0ZD4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4gLS0+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyNSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rIC0tPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij48YSBocmVmPSIkRGF0YXsiVGlja2V0RnJlZVRleHRMaW5rIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjUifTwvYT48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluayAtLT4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojIyAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkxIiwiMjUifTo8L2I+PC90ZD4KIyMgICAgICAgICAgICA8dGQ+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjEgLS0+CiMjICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MSJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjI1In08L2Rpdj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMSAtLT4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsxIC0tPgojIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDEifSI+PGEgaHJlZj0iJENvbmZpZ3siVGlja2V0RnJlZVRleHRMaW5rMSJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDEiLCIyNSJ9PC9hPjwvZGl2PgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazEgLS0+CiMjICAgICAgICAgICAgPC90ZD4KIyMgICAgICAgICAgPC90cj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojIyAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjUifTo8L2I+PC90ZD4KIyMgICAgICAgICAgICA8dGQ+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjIgLS0+CiMjICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MiJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjI1In08L2Rpdj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMiAtLT4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsyIC0tPgojIyAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+PGEgaHJlZj0iJENvbmZpZ3siVGlja2V0RnJlZVRleHRMaW5rMiJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9hPjwvZGl2PgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazIgLS0+CiMjICAgICAgICAgICAgPC90ZD4KIyMgICAgICAgICAgPC90cj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMKIyMgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2hvdyBUaWNrZXRGcmVlVGltZTEtNgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiMgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMgICAgICAgICAgPHRkPjxiPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L2I+PC90ZD4KIyAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyMgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC9iPjwvdGQ+CiMjICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9PC9kaXY+PC90ZD4KIyMgICAgICAgICAgPC90cj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojIyAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L2I+PC90ZD4KIyMgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In08L2Rpdj48L3RkPgojIyAgICAgICAgICA8L3RyPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIwojIyBvYmplY3QgbGlua3MKIzwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KIyAgICAgICAgJERhdGF7IkxpbmtUYWJsZVN0cmcifQojPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgojICAgICAgPC90YWJsZT4KIyMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlCiM8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgojICAgICAgPHA+CiMgICAgICAgIDxocj4KIyAgICAgICAgPGI+JFRleHR7IkN1c3RvbWVyIEluZm8ifTo8L2I+CiMgICAgICAgICREYXRheyJDdXN0b21lclRhYmxlIn0KIyAgICAgICAgPGhyPgojICAgICAgPC9wPgojPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJUYWJsZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlN0YXR1cyAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdHVzIC0tPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJUeXBlIn06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVHlwZSJ9Ij4kUURhdGF7IlR5cGUiLCIxOCJ9PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU3RhdGUifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSIsIjE4In08L2Rpdj4KICAgICAgICAgICAgPC9mb250PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IlF1ZXVlIn06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlF1ZXVlIn0iPiRRRGF0YXsiUXVldWUiLCIxOCJ9PC9kaXY+CiAgICAgICAgICAgIDwvZm9udD4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJMb2NrZWQifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGZvbnQgY29sb3I9InJlZCI+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJMb2NrIn0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiTG9jayJ9In0iLCIxOCJ9PC9kaXY+CiAgICAgICAgICAgIDwvZm9udD4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiAgICAgICAgPHRyICB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7Ik93bmVyIn06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVXNlckxvZ2luIn0gKCRRRGF0YXsiVXNlckZpcnN0bmFtZSJ9JFFEYXRheyJVc2VyTGFzdG5hbWUifSkiPgogICAgICAgICAgICAkUURhdGF7IlVzZXJMb2dpbiIsIjE4In0gKCRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIxOCJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgIDx0ciAgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlVzZXJMb2dpbiJ9ICgkUURhdGF7IlVzZXJGaXJzdG5hbWUifSRRRGF0YXsiVXNlckxhc3RuYW1lIn0pIj4KICAgICAgICAgICAgJFFEYXRheyJVc2VyTG9naW4iLCIxOCJ9ICgkUXVvdGV7IiREYXRheyJVc2VyRmlyc3RuYW1lIn0gJERhdGF7IlVzZXJMYXN0bmFtZSJ9IiwiMTgifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgojIHVzZSB0aWNrZXQgaXMgcGVuZGluZwogICAgICAgIDxkdGwgaWYgKCREYXRheyJQZW5kaW5nVW50aWwifSBuZSAiIikgeyAkRGF0YXsiUGVuZGluZ1VudGlsU3RyaW5nIn0gPSAiPHRyIHZhbGlnbj0idG9wIj48dGQ+PGI+JFRleHR7IlBlbmRpbmcgdGlsbCJ9OjwvYj48L3RkPjx0ZD4kRGF0YXsiUGVuZGluZ1VudGlsIn08L3RkPjwvdHI+IjsgfT4KICAgICAgICAkRGF0YXsiUGVuZGluZ1VudGlsU3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNlcnZpY2UifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJTZXJ2aWNlIn0iPiRRRGF0YXsiU2VydmljZSIsIjE4In08L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IlNMQSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlNMQSJ9Ij4kUURhdGF7IlNMQSIsIjE4In08L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJGaXJzdCBSZXNwb25zZSBUaW1lIn06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lIn0iPgogICAgICAgICAgICAkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lSHVtYW4ifQogICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlIn0ifQogICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWVGb250U3RvcCAtLT4KICAgICAgICAgICAgPC9mb250Pgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0YXJ0IC0tPgogICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdGFydCAtLT4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlVwZGF0ZVRpbWVXb3JraW5nVGltZSJ9Ij4KICAgICAgICAgICAgJFFEYXRheyJVcGRhdGVUaW1lSHVtYW4ifQogICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IlVwZGF0ZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZUZvbnRTdG9wIC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiU29sdXRpb24gVGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWVGb250U3RhcnQgLS0+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJTb2x1dGlvblRpbWVXb3JraW5nVGltZSJ9Ij4KICAgICAgICAgICAgJFFEYXRheyJTb2x1dGlvblRpbWVIdW1hbiJ9CiAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifQogICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICAgIDwvZm9udD4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lRm9udFN0b3AgLS0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkNyaXRpY2FsaXR5In06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJDcml0aWNhbGl0eSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiSW1wYWN0In06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+JFRleHR7IiREYXRheyJJbXBhY3QifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IlByaW9yaXR5In06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9kaXY+CiAgICAgICAgICAgIDwvZm9udD4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkRlY2lzaW9uIFJlc3VsdCJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPiRUZXh0eyIkUURhdGF7IlRpY2tldEZyZWVUZXh0MTYiLCIyMCJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXk1In0ifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lNSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkzIn0ifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMyJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXk0In0ifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lNCJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXk2In0ifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4kVGltZVNob3J0eyIkRGF0YXsiVGlja2V0RnJlZVRpbWU2In0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRUZXh0eyJBY2NvdW50ZWQgdGltZSJ9OjwvYj48L3RkPgogICAgICAgICAgPHRkPiREYXRheyJUaWNrZXRUaW1lVW5pdHMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgojIHNob3cgVGlja2V0RnJlZUtleTEtMTYgYW5kIFRpY2tldEZyZWVUZXh0MS0xNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgPHRkPjxiPiRRRGF0YXsiVGlja2V0RnJlZUtleSIsIjI1In06PC9iPjwvdGQ+CiAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4gLS0+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjI1In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbiAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rIC0tPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPjxhIGhyZWY9IiREYXRheyJUaWNrZXRGcmVlVGV4dExpbmsifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyNSJ9PC9hPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgogICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICA8dGQ+PGI+JFRleHR7IkN1c3RvbWVySUQifTo8L2I+PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGEgaHJlZj0iJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmsifSIgJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmtUYXJnZXQifT4kUXVvdGV7IiREYXRheyJDdXN0b21lcklEIn0iLCIxOCJ9PC9hPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgoKIyBvYmplY3QgbGlua3MKPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgogICAgICAgICREYXRheyJMaW5rVGFibGVTdHJnIn0KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgogICAgICA8L3RhYmxlPgojIHNob3cgY3VzdG9tZXIgaW5mbyB0YWJsZQo8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgogICAgICA8cD4KICAgICAgICA8aHI+CiAgICAgICAgPGI+JFRleHR7IkN1c3RvbWVyIEluZm8ifTo8L2I+CiAgICAgICAgJERhdGF7IkN1c3RvbWVyVGFibGUifQogICAgICAgIDxocj4KICAgICAgPC9wPgo8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgo8IS0tIGR0bDpibG9jazpTdGF0dXMgLS0+CiMgLS0tCiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9Ijk1JSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgojIHNob3cgY29tcG9zZSBsaW5rcwo8IS0tIGR0bDpibG9jazpBZ2VudElzQ3VzdG9tZXIgLS0+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIDxiPiRUZXh0eyJZb3VyIG93biBUaWNrZXQifTo8L2I+CiAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0Q3VzdG9tZXJGb2xsb3dVcCZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkNvbXBvc2UgRm9sbG93IHVwIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiQ29tcG9zZSBGb2xsb3cgdXAifTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOkFnZW50SXNDdXN0b21lciAtLT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBbnN3ZXIgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyQ29tcG9zZSAtLT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+JFRleHR7IkNvbXBvc2UgQW5zd2VyIn0gKCRUZXh0eyJlbWFpbCJ9KTo8L2I+CiAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICREYXRheyJTdGRSZXNwb25zZXNTdHJnIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9wPgo8IS0tIGR0bDpibG9jazpBZ2VudEFuc3dlckNvbXBvc2UgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyUGhvbmVPdXRib3VuZCAtLT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+JFRleHR7IkNvbnRhY3QgY3VzdG9tZXIifSAoJFRleHR7InBob25lIn0pOjwvYj4KICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9JlF1ZXVlSUQ9JERhdGF7IlF1ZXVlSUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlBob25lIGNhbGwifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJQaG9uZSBjYWxsIn08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KJERhdGF7IkFnZW50UGhvbmVTdHJnIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9wPgo8IS0tIGR0bDpibG9jazpBZ2VudEFuc3dlclBob25lT3V0Ym91bmQgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50QW5zd2VyIC0tPgojIHNob3cgYXJ0aWNsZSBsaW5rcwo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb20gLS0+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIDxiPiRUZXh0eyJBcnRpY2xlIn06PC9iPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiMgY2hlY2sgaWYgcHJpbnQgc2hvdWxkIGJlIHNob3duCjwhLS0gZHRsOmJsb2NrOkFnZW50QXJ0aWNsZUNvbVByaW50IC0tPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRQcmludCZUaWNrZXRJRD0kRGF0YXsiVGlja2V0SUQifSZBcnRpY2xlSUQ9JERhdGF7IkFydGljbGVJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiUHJpbnQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyJQcmludCJ9PC9hPgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21QcmludCAtLT4KIyBjaGVjayBpZiBmb3J3YXJkIHNob3VsZCBiZSBzaG93bgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21Gb3J3YXJkIC0tPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRGb3J3YXJkJlRpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9JkFydGljbGVJRD0kRGF0YXsiQXJ0aWNsZUlEIn0mUXVldWVJRD0kRGF0YXsiUXVldWVJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiRm9yd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IkZvcndhcmQifTwvYT4KPCEtLSBkdGw6YmxvY2s6QWdlbnRBcnRpY2xlQ29tRm9yd2FyZCAtLT4KIyBjaGVjayBpZiBib3VuY2Ugc2hvdWxkIGJlIHNob3duCjwhLS0gZHRsOmJsb2NrOkFnZW50QXJ0aWNsZUNvbUJvdW5jZSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZVR5cGUifSBlcSAiZW1haWwtZXh0ZXJuYWwiKSB7ICREYXRheyJBcnRpY2xlQm91bmNlU3RyaW5nIn0gPSAiQm91bmNlIjsgfT4KICAgICAgICAgICAgICAgICAgICA8ZHRsIGlmICgkRGF0YXsiU2VuZGVyVHlwZSJ9IG5lICJjdXN0b21lciIpIHsgJERhdGF7IkFydGljbGVCb3VuY2VTdHJpbmcifSA9ICIiOyB9PgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRCb3VuY2UmVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0mQXJ0aWNsZUlEPSREYXRheyJBcnRpY2xlSUQifSZRdWV1ZUlEPSREYXRheyJRdWV1ZUlEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJCb3VuY2UifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyIkRGF0YXsiQXJ0aWNsZUJvdW5jZVN0cmluZyJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOkFnZW50QXJ0aWNsZUNvbUJvdW5jZSAtLT4KIyBjaGVjayBpZiBzcGxpdCBzaG91bGQgYmUgc2hvd24KPCEtLSBkdGw6YmxvY2s6QWdlbnRBcnRpY2xlQ29tUGhvbmUgLS0+CiAgICAgICAgICAgICAgICAgICAgPGR0bCBpZiAoJERhdGF7IlNlbmRlclR5cGUifSBlcSAiY3VzdG9tZXIiKSB7ICREYXRheyJBcnRpY2xlU3BsaXRTdHJpbmcifSA9ICJTcGxpdCI7IH0+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFBob25lJkFydGljbGVJRD0kRGF0YXsiQXJ0aWNsZUlEIn0mUXVldWVJRD0kRGF0YXsiUXVldWVJRCJ9JkxpbmtUaWNrZXRJRD0kUURhdGF7IlRpY2tldElEIn0iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJTcGxpdCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IiREYXRheyJBcnRpY2xlU3BsaXRTdHJpbmcifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb21QaG9uZSAtLT4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9wPgo8IS0tIGR0bDpibG9jazpBZ2VudEFydGljbGVDb20gLS0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0iUHJpb3JpdHlJRC0kRGF0YXsiUHJpb3JpdHlJRCJ9Ij4KPCEtLSBkdGw6YmxvY2s6TW92ZSAtLT4KICAgICAgPHA+CiAgICAgICAgPGI+JFRleHR7IkNoYW5nZSBxdWV1ZSJ9OjwvYj48YnIvPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0TW92ZSIvPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IiRRRGF0YXsiUXVldWVJRCJ9Ii8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgICAgJERhdGF7Ik1vdmVRdWV1ZXNTdHJnIn0KICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTW92ZSJ9Ii8+CiAgICAgICAgPC9mb3JtPgogICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOk1vdmUgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkJvZHkgLS0+CjwhLS0gZHRsOmJsb2NrOkZvb3RlciAtLT4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6Rm9vdGVyIC0tPgo=
IyAtLQojIEN1c3RvbWVyVGlja2V0UHJpbnQuZHRsIC0gcHJvdmlkZXMgSFRNTCBwcmludCB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lclRpY2tldFByaW50LmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE4OjU5OjA3IHViIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFByaW50LmR0bCx2IDEuMTAgMjAwOC8wNi8yMCAxNjoyMTo0NCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kQ29uZmlneyJUaWNrZXQ6Okhvb2sifTogJFFEYXRheyJUaWNrZXROdW1iZXIifSAvICRRRGF0YXsiVGl0bGUifTwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJUaWNrZXQtSW5mbyJ9OgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPiRUZXh0eyJTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjYwJSI+JFRleHR7IiREYXRheyJTdGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgojICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifTwvdGQ+CiMgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUXVldWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiUXVldWUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMb2NrIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IkxvY2sifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkN1c3RvbWVySUQifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDdXN0b21lcklEIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3duZXIifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiT3duZXIifSAoJFFEYXRheyJVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJVc2VyTGFzdG5hbWUifSk8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlJlc3BvbnNpYmxlU3RyaW5nIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU2VydmljZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJTTEEifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiQ3JpdGljYWxpdHkifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkltcGFjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJJbXBhY3QifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPiRUZXh0eyJBZ2UifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPiRRRGF0YXsiQWdlIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWNjb3VudGVkIHRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRUaW1lVW5pdHMifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIHRpbGwifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQZW5kaW5nVW50aWwifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlVwZGF0ZSBUaW1lIn06PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZVNob3J0eyIkUURhdGF7IlVwZGF0ZVRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU29sdXRpb24gVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVTaG9ydHsiJFFEYXRheyJTb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSIzMCUiPjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgIDwvdHI+CgojIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZUtleTEtMTYgYW5kIFRpY2tldEZyZWVUZXh0MS0xNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleSIsIjIwIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjAifTwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgPHRyPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjIwIn06PC90ZD4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjAifTwvZGl2PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleTIiLCIyMCJ9OjwvdGQ+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjIwIn08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVUaW1lMS02CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICRUZXh0eyJDdXN0b21lciBJbmZvIn06CiAgICAgICREYXRheyJDdXN0b21lclRhYmxlIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBzdGFydCB0aWNrZXQgJERhdGF7IlRpY2tldE51bWJlciJ9IC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJnY29sb3I9IiMwMDAwMDAiIGNsYXNzPSJjb250YWluZXIiPgogIDx0cj4KICAgIDx0ZD4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMDAlIiBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KIyBGcm9tOiwgVG86LCBDYzoKPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFRleHR7IiREYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjE2MCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9ICRUZXh0eyJieSJ9ICREYXRheyJTZW5kZXJUeXBlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgc2hvdyB0aGUgQXJ0aWNsZTo6RnJlZUtleTEtMyBhbmQgQXJ0aWNsZTo6RnJlZVRleHQxLTMKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+JFFEYXRheyJLZXkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIxNjAifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IkFydGljbGVUeXBlIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJBcnRpY2xlOjpBVE0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPC90YWJsZT4KJERhdGF7IlRleHROb3RlIn0KICAgICAgICAgICAgICAgICAgPHByZT4KJERhdGF7IkJvZHkifQogICAgICAgICAgICAgICAgICA8L3ByZT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8YnIvPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlIC0tPgo=
IyAtLQojIEN1c3RvbWVyVGlja2V0Wm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIFRpY2tldFpvb20gZm9yIEN1c3RvbWVyVGlja2V0Wm9vbS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3VzdG9tZXJUaWNrZXRab29tLmR0bCx2IDEuMSAyMDA4LzA3LzAyIDE5OjE2OjE0IHViIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFpvb20uZHRsLHYgMS4zMyAyMDA4LzA1LzE1IDA5OjQzOjAxIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8IS0tIHN0YXJ0IHRpY2tldCAkRGF0YXsiVGlja2V0TnVtYmVyIn0gLS0+CjwhLS0gVGhpcyBqYXZhIHNjcmlwdCBpcyBqdXN0IGZvciBuaWNlIHRvIGhhdmUgZnVua3Rpb25zISAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpIHsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuQm9keS52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckSlNUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBib2R5ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Cb2R5LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+Cgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjUwJSIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifSAkQ29uZmlneyJUaWNrZXQ6Okhvb2sifTogJERhdGF7IlRpY2tldE51bWJlciJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjUwJSIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFnZSJ9OiAkRGF0YXsiQWdlIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1DdXN0b21lclRpY2tldFByaW50JlRpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifSIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlByaW50IFRpY2tldCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgdGFyZ2V0PSJfYmxhbmsiPiRUZXh0eyJQcmludCJ9PC9hPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIzMCUiIGNsYXNzPSJtZW51Ij4KICAgICAgPGI+JFRleHR7IkNyZWF0ZWQifTo8L2I+ICRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1JSIgY2xhc3M9InNtYWxsIj4KPCEtLSBkdGw6YmxvY2s6VHJlZSAtLT4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtIC0tPgogICAgICAgIDx0ciBjbGFzcz0iJFFEYXRheyJTZW5kZXJUeXBlIn0tJFFEYXRheyJBcnRpY2xlVHlwZSJ9Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkZyb20iLCI1MCJ9OiAkUURhdGF7IlN1YmplY3QiLCIyMDAifSAtICRUaW1lTG9uZ3siJFFEYXRheyJDcmVhdGVkIn0ifSI+JERhdGF7IlNwYWNlIn0kRGF0YXsiU3RhcnQifSAkUURhdGF7IkNvdW50In0uIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249Q3VzdG9tZXJUaWNrZXRab29tJlRpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifSZBcnRpY2xlSUQ9JFFEYXRheyJBcnRpY2xlSUQifSMkUURhdGF7IkFydGljbGVJRCJ9IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJTZW5kZXJUeXBlIn0ifSAoJFRleHR7IiRRRGF0YXsiQXJ0aWNsZVR5cGUifSJ9KSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPiRUZXh0eyIkUURhdGF7IlNlbmRlclR5cGUifSJ9ICgkVGV4dHsiJFFEYXRheyJBcnRpY2xlVHlwZSJ9In0pPC9hPgogICAgICAgICAgICAkUURhdGF7IkZyb20iLCIxNiJ9OiAkUURhdGF7IlN1YmplY3QiLCIyMCJ9IC0gJFRpbWVMb25neyIkUURhdGF7IkNyZWF0ZWQifSJ9JERhdGF7IlN0b3AifQo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICZuYnNwOzxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249Q3VzdG9tZXJUaWNrZXRBdHRhY2htZW50JkFydGljbGVJRD0kUURhdGF7IkFydGljbGVJRCJ9JkZpbGVJRD0kUURhdGF7IkZpbGVJRCJ9IiB0aXRsZT0iJFFEYXRheyJGaWxlbmFtZSJ9IC0gJFFEYXRheyJGaWxlc2l6ZSJ9IiAkRGF0YXsiVGFyZ2V0In0+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1hdHRhY2gtc21hbGwucG5nIj48L2E+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQXR0YWNobWVudCAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BdHRhY2htZW50TW9yZSAtLT4KICAgICAgICAgICAgJm5ic3A7Wy4uXQo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnRNb3JlIC0tPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW0gLS0+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlRyZWUgLS0+CiAgICAgIDxocj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIyMDAifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgojIHNob3cgdGhlIEFydGljbGU6OkZyZWVLZXkxLTMgYW5kIEFydGljbGU6OkZyZWVWYWx1ZTEtMwogICAgICAgIDxkdGwgaWYgKCREYXRheyJBcnRpY2xlRnJlZUtleTEifSBuZSAiIikgeyAkRGF0YXsiQXJ0aWNsZUZyZWVTdHJpbmcxIn0gPSAiPHRyPjx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJBcnRpY2xlRnJlZUtleTEifTo8L3RkPjx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFFEYXRheyJBcnRpY2xlRnJlZVRleHQxIn08L3RkPjwvdHI+IjsgfT4KICAgICAgICA8ZHRsIGlmICgkRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn0gbmUgIiIpIHsgJERhdGF7IkFydGljbGVGcmVlU3RyaW5nMiJ9ID0gIjx0cj48dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiQXJ0aWNsZUZyZWVLZXkyIn06PC90ZD48dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRRRGF0YXsiQXJ0aWNsZUZyZWVUZXh0MiJ9PC90ZD48L3RyPiI7IH0+CiAgICAgICAgPGR0bCBpZiAoJERhdGF7IkFydGljbGVGcmVlS2V5MyJ9IG5lICIiKSB7ICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzMifSA9ICI8dHI+PHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IkFydGljbGVGcmVlS2V5MyJ9OjwvdGQ+PHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkUURhdGF7IkFydGljbGVGcmVlVGV4dDMifTwvdGQ+PC90cj4iOyB9PgogICAgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzEifQogICAgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzIifQogICAgICAgICREYXRheyJBcnRpY2xlRnJlZVN0cmluZzMifQojIHNob3cgYXR0YWNobWVudHMKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnQgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj4kVGV4dHsiJERhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93TGluayAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJERhdGF7IkxpbmsifSIgJERhdGF7IlRhcmdldCJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In06ICRRRGF0YXsiRmlsZW5hbWUifSc7cmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJJbWFnZSJ9IiBib3JkZXI9IjAiIGFsdD0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iPjwvYT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJJbWFnZSJ9IiBib3JkZXI9IjAiIGFsdD0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudCAtLT4KICAgICAgPC90YWJsZT4KJERhdGF7IkFydGljbGU6OlRleHROb3RlIn0KICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+CiREYXRheyJBcnRpY2xlOjpUZXh0In0KICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvbGxvd1VwIC0tPgogICAgICA8aHI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQ3VzdG9tZXJUaWNrZXRab29tIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFydGljbGVJRCIgdmFsdWU9IiRRRGF0YXsiQXJ0aWNsZTo6QXJ0aWNsZUlEIn0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjcwIi8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjQwMCI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iLz4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiLz48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5leHQgc3RhdGUifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJOZXh0U3RhdGVzU3RyZyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICREYXRheyJQcmlvcml0eVN0cmcifTwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KICAgICAgICA8L3RhYmxlPgogICAgICAgIDxici8+CiAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ii8+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6Rm9sbG93VXAgLS0+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSIyNSUiIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJtZW51Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iOTUlIj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiVHlwZSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlR5cGUifSJ9IiwiMTgifTwvZGl2PjwvZm9udD48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3RhdGUifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSIsIjE4In08L2Rpdj48L2ZvbnQ+PC90ZD4KICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgPHRyPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCI+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9IiwiMTgifTwvZGl2PjwvZm9udD48L3RkPgojICAgICAgICA8L3RyPgojIC0tLQogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlF1ZXVlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUURhdGF7IlF1ZXVlIn0iPiRRRGF0YXsiUXVldWUiLCIxOCJ9PC9kaXY+PC9mb250PjwvdGQ+CiAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIj48ZGl2IHRpdGxlPSIkUURhdGF7IlNlcnZpY2UifSI+JFFEYXRheyJTZXJ2aWNlIiwiMTgifTwvZGl2PjwvZm9udD48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRRGF0YXsiU0xBIn0iPiRRRGF0YXsiU0xBIiwiMTgifTwvZGl2PjwvZm9udD48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcml0aWNhbGl0eSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJDcml0aWNhbGl0eSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiSW1wYWN0In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IkltcGFjdCJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiPjxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSIsIjE4In08L2Rpdj48L2ZvbnQ+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3VzdG9tZXJJRCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFFEYXRheyJDdXN0b21lcklEIn0iPiRRRGF0YXsiQ3VzdG9tZXJJRCIsIjE4In08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CiMgICAgICA8dHI+CiMgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFjY291bnRlZCB0aW1lIn06PC90ZD4KIyAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUaWNrZXRUaW1lVW5pdHMifTwvdGQ+CiMgICAgICA8L3RyPgojICAgICAgPHRyPgojICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPd25lciJ9OjwvdGQ+CiMgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48ZGl2IHRpdGxlPSIkUURhdGF7Ik93bmVyIn0iPiRRRGF0YXsiT3duZXIiLCIxOCJ9PC9kaXY+PC90ZD4KIyAgICAgIDwvdHI+CgojIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZUtleTEtMTYgYW5kIFRpY2tldEZyZWVUZXh0MS0xNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleSIsIjIwIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjAifTwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgPHRyPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjIwIn06PC90ZD4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjAifTwvZGl2PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleTIiLCIyMCJ9OjwvdGQ+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjIwIn08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVUaW1lMS02CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgoKICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlLnBtLHYgMS4xIDIwMDgvMDcvMDIgMjI6MDI6MDEgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpRdWV1ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UXVldWVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlF1ZXVlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UHJpb3JpdHlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlcn0gICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUeXBlT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VHlwZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJ0lUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlJzsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VyIGxpc3QKICAgIG15ICVVc2VyTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0U3RhdGVzQnlUeXBlKAogICAgICAgIFN0YXRlVHlwZSA9PiBbJ2Nsb3NlZCddLAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHF1ZXVlIGxpc3QKICAgIG15ICVRdWV1ZUxpc3QgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0QWxsUXVldWVzKCk7CgogICAgIyBnZXQgcHJpb3JpdHkgbGlzdAogICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57UHJpb3JpdHlPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdRdWV1ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVRdWV1ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdQcmlvcml0eUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDcmVhdGVkIGluIFF1ZXVlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnQ3JlYXRlZFF1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRQcmlvcml0eUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyTG9naW4nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnRnJvbScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUbycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NjJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0JvZHknLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlIFRpbWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVUaW1lJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywgICAgIyAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ1RpbWUnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgIG15ICVTTEEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnU2VydmljZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdTTEEnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnU0xBSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgdHlwZSBsaXN0CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZTEgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdUeXBlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGUxOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpVc2VBZ2VudEVsZW1lbnRJblN0YXRzJykgKSB7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0FnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ093bmVySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDcmVhdGVkIGJ5IEFnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ0NyZWF0ZWRVc2VySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpDdXN0b21lcklEQXNNdWx0aVNlbGVjdCcpICkgewoKICAgICAgICAjIEdldCBDdXN0b21lcklECiAgICAgICAgIyAoVGhpcyB3YXkgYWxzbyBjYW4gYmUgdGhlIHNvbHV0aW9uIGZvciB0aGUgQ3VzdG9tZXJVc2VySUQpCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIERJU1RJTkNUIGN1c3RvbWVyX2lkIEZST00gdGlja2V0IiwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlQ3VzdG9tZXJJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBpZiAoICRSb3dbMF0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRHsgJFJvd1swXSB9ID0gJFJvd1swXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJUN1c3RvbWVySUQsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KCiAgICBGUkVFS0VZOgogICAgZm9yIG15ICRGcmVlS2V5ICggMSAuLiAxNiApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IGZyZWUga2V5IGNvbmZpZwogICAgICAgIG15ICRUaWNrZXRGcmVlS2V5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlS2V5JyAuICRGcmVlS2V5ICk7CgogICAgICAgIG5leHQgRlJFRUtFWSBpZiByZWYgJFRpY2tldEZyZWVLZXkgbmUgJ0hBU0gnOwoKICAgICAgICBteSBARnJlZUtleSA9IGtleXMgJXskVGlja2V0RnJlZUtleX07CiAgICAgICAgbXkgJE5hbWUgICAgPSAnJzsKCiAgICAgICAgaWYgKCBzY2FsYXIgQEZyZWVLZXkgPT0gMSApIHsKICAgICAgICAgICAgJE5hbWUgPSAkVGlja2V0RnJlZUtleS0+eyAkRnJlZUtleVswXSB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE5hbWUgPSAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXk7CgogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnVGlja2V0RnJlZUtleScgLiAkRnJlZUtleSwKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1RpY2tldEZyZWVLZXknIC4gJEZyZWVLZXksCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gJFRpY2tldEZyZWVLZXksCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBteSAkVGlja2V0RnJlZVRleHQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICBUeXBlICAgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFRpY2tldEZyZWVUZXh0KSB7CgogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+ICRUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXksLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBhbGwgY2xvc2VkIHN0YXRzIGlmIG5vIHN0YXRlcyBhcmUgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEc30gKSB7CiAgICAgICAgJFBhcmFte1N0YXRlVHlwZX0gPSBbJ2Nsb3NlZCddOwogICAgfQoKICAgICMgc3RhcnQgdGlja2V0IHNlYXJjaAogICAgbXkgQFRpY2tldFNlYXJjaElEcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VhcmNoKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cyA9IDA7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRTZWFyY2hJRHMpIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhIGxpc3QKICAgICAgICBteSAkQXJ0aWNsZURhdGFMaXN0ID0gJFNlbGYtPl9BcnRpY2xlRGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkQXJ0aWNsZURhdGFMaXN0OwoKICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICFAeyRBcnRpY2xlRGF0YUxpc3R9OwogICAgICAgIG5leHQgVElDS0VUSUQgaWYgQHskQXJ0aWNsZURhdGFMaXN0fSA+IDI7CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhIHBob25lIGFydGljbGUKICAgICAgICBpZiAoICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FydGljbGVUeXBlSUR9IGVxICRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVEYXRhTGlzdC0+WzFdICkgewogICAgICAgICAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhbiBleHRlcm5hbCBlbWFpbCBhcnRpY2xlCiAgICAgICAgaWYgKCAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlVHlwZUlEfSBlcSAkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpbGNlIGNvbWVzIGZyb20gYW4gYWdlbnQgKEVtYWlsLVRpY2tldCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QWdlbnRTZW5kZXJUeXBlSUR9IGVxICRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9CiAgICAgICAgICAgICAgICAmJiAhJEFydGljbGVEYXRhTGlzdC0+WzFdCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGaXJzdExldmVsU29sdXRpb25UaWNrZXRzKys7CiAgICAgICAgICAgICAgICBuZXh0IFRJQ0tFVElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZpcnN0IGFydGljbGUgY29tZXMgZnJvbSBjdXN0b21lciBhbmQgdGhlIHNlY29uZCBvbmUgZnJvbSBhbiBhZ2VudAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBZ2VudFNlbmRlclR5cGVJRH0gZXEgJFNlbGYtPntDdXN0b21lclNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmICRBcnRpY2xlRGF0YUxpc3QtPlsxXQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVEYXRhTGlzdC0+WzFdLT57QWdlbnRTZW5kZXJUeXBlSUR9IGVxICRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGaXJzdExldmVsU29sdXRpb25UaWNrZXRzKys7CiAgICAgICAgICAgICAgICBuZXh0IFRJQ0tFVElEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0czsKfQoKc3ViIF9BcnRpY2xlRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBpZCBvZiBhcnRpY2xlIHR5cGUgJ3Bob25lJwogICAgaWYgKCAhJFNlbGYtPntQaG9uZVR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntQaG9uZVR5cGVJRH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTG9va3VwKAogICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAncGhvbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSB0eXBlICdlbWFpbC1leHRlcm5hbCcKICAgIGlmICggISRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntFbWFpbEV4dGVybmFsVHlwZUlEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMb29rdXAoCiAgICAgICAgICAgIEFydGljbGVUeXBlID0+ICdlbWFpbC1leHRlcm5hbCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpZCBvZiBhcnRpY2xlIHNlbmRlciB0eXBlICdhZ2VudCcKICAgIGlmICggISRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57QWdlbnRTZW5kZXJUeXBlSUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlU2VuZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSBzZW5kZXIgdHlwZSAnY3VzdG9tZXInCiAgICBpZiAoICEkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVNlbmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICApOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBhcnRpY2xlX3R5cGVfaWQsIGFydGljbGVfc2VuZGVyX3R5cGVfaWQgIgogICAgICAgICAgICAuICJGUk9NIGFydGljbGUgIgogICAgICAgICAgICAuICJXSEVSRSB0aWNrZXRfaWQgPSAkUGFyYW17VGlja2V0SUR9IEFORCAiCiAgICAgICAgICAgIC4gImFydGljbGVfdHlwZV9pZCBJTiAiCiAgICAgICAgICAgIC4gIiggJFNlbGYtPntQaG9uZVR5cGVJRH0sICRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0gKSBBTkQgIgogICAgICAgICAgICAuICJhcnRpY2xlX3NlbmRlcl90eXBlX2lkIElOICIKICAgICAgICAgICAgLiAiKCAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfSwgJFNlbGYtPntDdXN0b21lclNlbmRlclR5cGVJRH0gKSAiCiAgICAgICAgICAgIC4gIk9SREVSIEJZIGNyZWF0ZV90aW1lIiwKICAgICAgICBMaW1pdCA9PiAzLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBBcnRpY2xlRGF0YUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlQXJ0aWNsZURhdGE7CiAgICAgICAgJEFydGljbGVEYXRhe0FydGljbGVUeXBlSUR9ICAgICAgID0gJFJvd1swXTsKICAgICAgICAkQXJ0aWNsZURhdGF7QXJ0aWNsZVNlbmRlclR5cGVJRH0gPSAkUm93WzFdOwoKICAgICAgICBwdXNoIEBBcnRpY2xlRGF0YUxpc3QsIFwlQXJ0aWNsZURhdGE7CiAgICB9CgogICAgcmV0dXJuIFxAQXJ0aWNsZURhdGFMaXN0Owp9CgpzdWIgRXhwb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBcJVBhcmFtOwp9CgpzdWIgSW1wb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBcJVBhcmFtOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIHNvbHV0aW9uIHRpbWUgYXZlcmFnZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2UucG0sdiAxLjEgMjAwOC8wNy8wMiAyMjowMjowMSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlF1ZXVlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUeXBlOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBUaW1lT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntRdWV1ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6UXVldWUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGlja2V0T2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntQcmlvcml0eU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHktPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyfSAgID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntTTEFPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U0xBLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1R5cGVPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpUeXBlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAnSVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2UnOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgbGlzdAogICAgbXkgJVVzZXJMaXN0ID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgbXkgJVF1ZXVlTGlzdCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRBbGxRdWV1ZXMoKTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJFNlbGYtPntQcmlvcml0eU9iamVjdH0tPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1F1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgaW4gUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdDcmVhdGVkUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQm9keScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnVGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgICAgIG15ICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNsYSBsaXN0CiAgICAgICAgbXkgJVNMQSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQE9iamVjdEF0dHJpYnV0ZUFkZCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdTZXJ2aWNlSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdTTEFJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHVuc2hpZnQgQE9iamVjdEF0dHJpYnV0ZXMsIEBPYmplY3RBdHRyaWJ1dGVBZGQ7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCB0eXBlIGxpc3QKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VHlwZU9iamVjdH0tPlR5cGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlMSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1R5cGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTE7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OlVzZUFnZW50RWxlbWVudEluU3RhdHMnKSApIHsKCiAgICAgICAgbXkgQE9iamVjdEF0dHJpYnV0ZUFkZCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnT3duZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgYnkgQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnQ3JlYXRlZFVzZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIEBPYmplY3RBdHRyaWJ1dGVBZGQ7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkN1c3RvbWVySURBc011bHRpU2VsZWN0JykgKSB7CgogICAgICAgICMgR2V0IEN1c3RvbWVySUQKICAgICAgICAjIChUaGlzIHdheSBhbHNvIGNhbiBiZSB0aGUgc29sdXRpb24gZm9yIHRoZSBDdXN0b21lclVzZXJJRCkKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgRElTVElOQ1QgY3VzdG9tZXJfaWQgRlJPTSB0aWNrZXQiLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICVDdXN0b21lcklEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEeyAkUm93WzBdIH0gPSAkUm93WzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ3VzdG9tZXJJRCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQoKICAgIEZSRUVLRVk6CiAgICBmb3IgbXkgJEZyZWVLZXkgKCAxIC4uIDE2ICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgZnJlZSBrZXkgY29uZmlnCiAgICAgICAgbXkgJFRpY2tldEZyZWVLZXkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVLZXknIC4gJEZyZWVLZXkgKTsKCiAgICAgICAgbmV4dCBGUkVFS0VZIGlmIHJlZiAkVGlja2V0RnJlZUtleSBuZSAnSEFTSCc7CgogICAgICAgIG15IEBGcmVlS2V5ID0ga2V5cyAleyRUaWNrZXRGcmVlS2V5fTsKICAgICAgICBteSAkTmFtZSAgICA9ICcnOwoKICAgICAgICBpZiAoIHNjYWxhciBARnJlZUtleSA9PSAxICkgewogICAgICAgICAgICAkTmFtZSA9ICRUaWNrZXRGcmVlS2V5LT57ICRGcmVlS2V5WzBdIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTmFtZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleTsKCiAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdUaWNrZXRGcmVlS2V5JyAuICRGcmVlS2V5LAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnVGlja2V0RnJlZUtleScgLiAkRnJlZUtleSwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiAkVGlja2V0RnJlZUtleSwKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dAogICAgICAgIG15ICRUaWNrZXRGcmVlVGV4dCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgIFR5cGUgICA9PiAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXksCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgkVGlja2V0RnJlZVRleHQpIHsKCiAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXksCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gJFRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleSwsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQE9iamVjdEF0dHJpYnV0ZXM7Cn0KCnN1YiBHZXRTdGF0RWxlbWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGFsbCBjbG9zZWQgc3RhdHMgaWYgbm8gc3RhdGVzIGFyZSBnaXZlbgogICAgaWYgKCAhJFBhcmFte1N0YXRlSURzfSApIHsKICAgICAgICAkUGFyYW17U3RhdGVUeXBlfSA9IFsnY2xvc2VkJ107CiAgICB9CgogICAgIyBzdGFydCB0aWNrZXQgc2VhcmNoCiAgICBteSBAVGlja2V0U2VhcmNoSURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgJVBhcmFtLAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICBMaW1pdCAgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICApOwoKICAgIHJldHVybiAnLScgaWYgIUBUaWNrZXRTZWFyY2hJRHM7CgogICAgbXkgJFRpbWUgPSAwOwoKICAgIFRJQ0tFVElEOgogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldFNlYXJjaElEcykgewoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICRUaWNrZXREYXRhID0gJFNlbGYtPl9UaWNrZXREYXRhR2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICdFUlJPUicgaWYgISV7JFRpY2tldERhdGF9OwoKICAgICAgICAjIGdldCByZWxldmFudCB0aWNrZXQgaGlzdG9yeQogICAgICAgIG15ICRIaXN0b3J5RGF0YSA9ICRTZWxmLT5fVGlja2V0SGlzdG9yeURhdGFHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJ0VSUk9SJyBpZiAhJEhpc3RvcnlEYXRhOwoKICAgICAgICAjIGlmIHRpY2tldCBpcyBjbG9zZWQgaW4gdGhlIHRpY2tldCBjcmVhdGUgbWFzawogICAgICAgIGlmICggQHskSGlzdG9yeURhdGF9ID09IDEgKSB7CiAgICAgICAgICAgICRUaW1lICs9ICggMyAqIDYwICk7CiAgICAgICAgICAgIG5leHQgVElDS0VUSUQ7CiAgICAgICAgfQoKICAgICAgICBteSAlVGltZXNwYW5zOwogICAgICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7JEhpc3RvcnlEYXRhfSApIHsKCiAgICAgICAgICAgIGlmICggJFRpbWVzcGFuc3skQ291bnRlcn0gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPntWaWV3YWJsZX07CgogICAgICAgICAgICAgICAgIyBzZXQgc3RvcCB0aW1lCiAgICAgICAgICAgICAgICAkVGltZXNwYW5zeyRDb3VudGVyfS0+e1N0b3BUaW1lfSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRW50cnktPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICEkRW50cnktPntWaWV3YWJsZX07CgogICAgICAgICAgICAgICAgIyBzZXQgc3RhcnQgdGltZQogICAgICAgICAgICAgICAgJFRpbWVzcGFuc3skQ291bnRlcn0tPntTdGFydFRpbWV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbnRyeS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2FsZW5kYXIKICAgICAgICBteSAkQ2FsZW5kYXIgPSAkU2VsZi0+X0NhbGVuZGFyR2V0KAogICAgICAgICAgICBUaWNrZXREYXRhID0+ICRUaWNrZXREYXRhLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkQ291bnQgKCBzb3J0IGtleXMgJVRpbWVzcGFucyApIHsKCiAgICAgICAgICAgICMgZXh0cmFjdCB0aW1lc3RhbXAKICAgICAgICAgICAgbXkgJFRpbWVzcGFuID0gJFRpbWVzcGFuc3skQ291bnR9OwoKICAgICAgICAgICAgJFRpbWVzcGFuLT57U3RvcFRpbWV9IHx8PSAkVGltZXNwYW4tPntTdGFydFRpbWV9ICsgKCAzICogNjAgKTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHdvcmtpbmcgdGltZQogICAgICAgICAgICBteSAkV29ya2luZ1RpbWVQYXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+V29ya2luZ1RpbWUoCiAgICAgICAgICAgICAgICAleyRUaW1lc3Bhbn0sCiAgICAgICAgICAgICAgICBDYWxlbmRhciA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkVGltZSArPSAkV29ya2luZ1RpbWVQYXJ0OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGlja2V0Q291bnQgPSBAVGlja2V0U2VhcmNoSURzOwogICAgbXkgJEF2ZXJhZ2VUaW1lID0gJFRpbWUgLyAkVGlja2V0Q291bnQ7CgogICAgIyB0cmFuc2xhdGUgc2Vjb25kcyBpbiBhIHJlYWRhYmxlIGZvcm1hdAogICAgbXkgJFZhbHVlID0gJFNlbGYtPl9TZWNvbmRlVG9TdHJpbmcoCiAgICAgICAgU2Vjb25kcyA9PiBpbnQgJEF2ZXJhZ2VUaW1lLAogICAgKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9CgpzdWIgX1RpY2tldERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4ge30gaWYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIHF1ZXVlX2lkLCBzbGFfaWQsIGNyZWF0ZV90aW1lX3VuaXggIgogICAgICAgICAgICAuICJGUk9NIHRpY2tldCBXSEVSRSBpZCA9ICRQYXJhbXtUaWNrZXRJRH0iLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRpY2tldERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUaWNrZXREYXRhe1F1ZXVlSUR9ICAgID0gJFJvd1swXTsKICAgICAgICAkVGlja2V0RGF0YXtTTEFJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFRpY2tldERhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiBcJVRpY2tldERhdGE7Cn0KCnN1YiBfQ2FsZW5kYXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb3B0aW9uCiAgICAkU2VsZi0+e1RpY2tldFNlcnZpY2VGZWF0dXJlfSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpOwoKICAgIG15ICVFc2NhbGF0aW9uRGF0YTsKICAgIGlmICggJFNlbGYtPntUaWNrZXRTZXJ2aWNlRmVhdHVyZX0gJiYgJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9ICkgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgICAgICBTTEFJRCAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRQYXJhbXtUaWNrZXREYXRhfS0+e1F1ZXVlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEVzY2FsYXRpb25EYXRhe0NhbGVuZGFyfSB8fCB1bmRlZjsKfQoKc3ViIF9UaWNrZXRIaXN0b3J5RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBpZCBvZiBoaXN0b3kgdHlwZSBTdGF0ZVVwZGF0ZQogICAgaWYgKCAhJFNlbGYtPntTdGF0ZVVwZGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+e1N0YXRlVXBkYXRlSUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZSA9PiAnU3RhdGVVcGRhdGUnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgaGlzdG95IHR5cGUgTmV3VGlja2V0CiAgICBpZiAoICEkU2VsZi0+e05ld1RpY2tldElEfSApIHsKICAgICAgICAkU2VsZi0+e05ld1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeVR5cGVMb29rdXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2aWV3YWJsZSBzdGF0ZSBpZHMKICAgIGlmICggISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgQFZpZXdhYmxlU3RhdGVJRHMgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgICAgIFR5cGUgICA9PiAnVmlld2FibGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICAgICApOwoKICAgICAgICBteSAlVmlld2FibGVTdGF0ZUlETGlzdDsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKEBWaWV3YWJsZVN0YXRlSURzKSB7CiAgICAgICAgICAgICRWaWV3YWJsZVN0YXRlSURMaXN0eyRTdGF0ZUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1ZpZXdhYmxlU3RhdGVJRHN9ID0gXCVWaWV3YWJsZVN0YXRlSURMaXN0OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBzdGF0ZV9pZCwgY3JlYXRlX3RpbWUgIgogICAgICAgICAgICAuICJGUk9NIHRpY2tldF9oaXN0b3J5ICIKICAgICAgICAgICAgLiAiV0hFUkUgdGlja2V0X2lkID0gJFBhcmFte1RpY2tldElEfSBBTkQgIgogICAgICAgICAgICAuICJoaXN0b3J5X3R5cGVfaWQgSU4gKCAkU2VsZi0+e1N0YXRlVXBkYXRlSUR9LCAkU2VsZi0+e05ld1RpY2tldElEfSApICIKICAgICAgICAgICAgLiAiT1JERVIgQlkgY3JlYXRlX3RpbWUiLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBUaWNrZXRIaXN0b3J5TGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICVIaXN0b3J5RGF0YTsKICAgICAgICAkSGlzdG9yeURhdGF7U3RhdGVJRH0gICAgPSAkUm93WzBdOwogICAgICAgICRIaXN0b3J5RGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbMV07CgogICAgICAgIHB1c2ggQFRpY2tldEhpc3RvcnlMaXN0LCBcJUhpc3RvcnlEYXRhOwogICAgfQoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoQFRpY2tldEhpc3RvcnlMaXN0KSB7CgogICAgICAgICRFbnRyeS0+e1ZpZXdhYmxlfSA9IDA7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAhJFNlbGYtPntWaWV3YWJsZVN0YXRlSURzfS0+eyAkRW50cnktPntTdGF0ZUlEfSB9OwogICAgICAgICRFbnRyeS0+e1ZpZXdhYmxlfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFxAVGlja2V0SGlzdG9yeUxpc3Q7Cn0KCnN1YiBfU2Vjb25kZVRvU3RyaW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICFkZWZpbmVkICRQYXJhbXtTZWNvbmRzfTsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgc2Vjb25kcwogICAgbXkgJFNlY29uZHMgPSAkUGFyYW17U2Vjb25kc30gJSA2MDsKICAgICRQYXJhbXtTZWNvbmRzfSA9ICggJFBhcmFte1NlY29uZHN9IC0gJFNlY29uZHMgKSAvIDYwOwoKICAgICMgY2FsY3VsYXRlIHRoZSBtaW51dGVzCiAgICBteSAkTWludXRlcyA9ICRQYXJhbXtTZWNvbmRzfSAlIDYwOwoKICAgICMgY2FsY3VsYXRlIHRoZSBob3VycwogICAgbXkgJEhvdXJzID0gKCAkUGFyYW17U2Vjb25kc30gLSAkTWludXRlcyApIC8gNjA7CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZQogICAgJEhvdXJzICAgfHw9IDA7CiAgICAkTWludXRlcyB8fD0gMDsKICAgICRTZWNvbmRzIHx8PSAwOwoKICAgIGlmICggJFNlY29uZHMgPj0gMzAgKSB7CiAgICAgICAgJE1pbnV0ZXMrKzsKICAgIH0KCiAgICAkTWludXRlcyA9IHNwcmludGYgIiUwMmQiLCAkTWludXRlczsKCiAgICBteSAkSG91cnNTdHJpbmcgICA9ICdIb3Vycyc7CiAgICBteSAkTWludXRlc1N0cmluZyA9ICdNaW51dGVzJzsKCiAgICByZXR1cm4gIiRIb3VycyAkSG91cnNTdHJpbmcgJE1pbnV0ZXMgJE1pbnV0ZXNTdHJpbmciOwp9CgpzdWIgRXhwb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBcJVBhcmFtOwp9CgpzdWIgSW1wb3J0V3JhcHBlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBcJVBhcmFtOwp9CgoxOwo=
IyAtLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtLHYgMS40IDIwMDgvMDcvMTUgMDc6MzA6MTUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlR5cGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VHlwZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlR5cGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbmV3IHRpY2tldCBzdGF0ZXMgdG8gdmFsaWQKICAgIHsKICAgICAgICBteSBAU3RhdGVOYW1lcyA9ICgKICAgICAgICAgICAgJ2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHN0YXRlcyB0byB2YWxpZAogICAgICAgICRTZWxmLT5fU2V0U3RhdGVWYWxpZCgKICAgICAgICAgICAgU3RhdGVOYW1lcyA9PiBcQFN0YXRlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IG5ldyB0aWNrZXQgdHlwZXMgdG8gdmFsaWQKICAgIHsKICAgICAgICBteSBAVHlwZU5hbWVzID0gKAogICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OlNlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ0luY2lkZW50OjpEaXNhc3RlcicsCiAgICAgICAgICAgICdQcm9ibGVtJywKICAgICAgICAgICAgJ1Byb2JsZW06Oktub3duRXJyb3InLAogICAgICAgICAgICAnUHJvYmxlbTo6UGVuZGluZ1JmQycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gdmFsaWQKICAgICAgICAkU2VsZi0+X1NldFR5cGVWYWxpZCgKICAgICAgICAgICAgVHlwZU5hbWVzID0+IFxAVHlwZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJFNlbGYtPl9TdGF0c0luc3RhbGwoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbmV3IHRpY2tldCBzdGF0ZXMgdG8gdmFsaWQKICAgIHsKICAgICAgICBteSBAU3RhdGVOYW1lcyA9ICgKICAgICAgICAgICAgJ2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHN0YXRlcyB0byB2YWxpZAogICAgICAgICRTZWxmLT5fU2V0U3RhdGVWYWxpZCgKICAgICAgICAgICAgU3RhdGVOYW1lcyA9PiBcQFN0YXRlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IG5ldyB0aWNrZXQgdHlwZXMgdG8gdmFsaWQKICAgIHsKICAgICAgICBteSBAVHlwZU5hbWVzID0gKAogICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OlNlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ0luY2lkZW50OjpEaXNhc3RlcicsCiAgICAgICAgICAgICdQcm9ibGVtJywKICAgICAgICAgICAgJ1Byb2JsZW06Oktub3duRXJyb3InLAogICAgICAgICAgICAnUHJvYmxlbTo6UGVuZGluZ1JmQycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gdmFsaWQKICAgICAgICAkU2VsZi0+X1NldFR5cGVWYWxpZCgKICAgICAgICAgICAgVHlwZU5hbWVzID0+IFxAVHlwZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJFNlbGYtPl9TdGF0c0luc3RhbGwoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbmV3IHRpY2tldCBzdGF0ZXMgdG8gaW52YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIGludmFsaWQKICAgICAgICAkU2VsZi0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgICAgIFN0YXRlTmFtZXMgPT4gXEBTdGF0ZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBuZXcgdGlja2V0IHR5cGVzIHRvIGludmFsaWQKICAgIHsKICAgICAgICBteSBAVHlwZU5hbWVzID0gKAogICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OlNlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ0luY2lkZW50OjpEaXNhc3RlcicsCiAgICAgICAgICAgICdQcm9ibGVtJywKICAgICAgICAgICAgJ1Byb2JsZW06Oktub3duRXJyb3InLAogICAgICAgICAgICAnUHJvYmxlbTo6UGVuZGluZ1JmQycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gaW52YWxpZAogICAgICAgICRTZWxmLT5fU2V0VHlwZVZhbGlkKAogICAgICAgICAgICBUeXBlTmFtZXMgPT4gXEBUeXBlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZXRTdGF0ZVZhbGlkKCkKCnNldHMgc3RhdGVzIHRvIHZhbGlkfGludmFsaWQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgIFN0YXRlTmFtZXMgPT4gWyAnbmV3JywgJ29wZW4nIF0sCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2V0U3RhdGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U3RhdGVOYW1lc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgU3RhdGVOYW1lcyEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIHZhbGlkIGlkCiAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgJVZhbGlkTGlzdCA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgIG15ICRWYWxpZElEID0gJFBhcmFte1ZhbGlkfSA/ICRWYWxpZExpc3R7dmFsaWR9IDogJFZhbGlkTGlzdHtpbnZhbGlkfTsKCiAgICBTVEFURU5BTUU6CiAgICBmb3IgbXkgJFN0YXRlTmFtZSAoIEB7ICRQYXJhbXtTdGF0ZU5hbWVzfSB9ICkgewoKICAgICAgICAjIGdldCBzdGF0ZQogICAgICAgIG15ICVTdGF0ZSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkU3RhdGVOYW1lLAogICAgICAgICk7CgogICAgICAgIG5leHQgU1RBVEVOQU1FIGlmICElU3RhdGU7CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlVXBkYXRlKAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfU2V0VHlwZVZhbGlkKCkKCnNldHMgdHlwZXMgdG8gdmFsaWR8aW52YWxpZAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1NldFR5cGVWYWxpZCgKICAgICAgICBUeXBlTmFtZXMgPT4gWyAnSW5jaWRlbnQnLCAnUHJvYmxlbScgXSwKICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1NldFR5cGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VHlwZU5hbWVzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBUeXBlTmFtZXMhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB2YWxpZCBpZAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICVWYWxpZExpc3QgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRJRCA9ICRQYXJhbXtWYWxpZH0gPyAkVmFsaWRMaXN0e3ZhbGlkfSA6ICRWYWxpZExpc3R7aW52YWxpZH07CgogICAgVFlQRU5BTUU6CiAgICBmb3IgbXkgJFR5cGVOYW1lICggQHsgJFBhcmFte1R5cGVOYW1lc30gfSApIHsKCiAgICAgICAgIyBsb29rdXAgdHlwZSBpZAogICAgICAgIG15ICRUeXBlSUQgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlID0+ICRUeXBlTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRZUEVOQU1FIGlmICEkVHlwZUlEOwoKICAgICAgICAjIGdldCB0eXBlCiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlR2V0KAogICAgICAgICAgICBJRCA9PiAkVHlwZUlELAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGUKICAgICAgICAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlVXBkYXRlKAogICAgICAgICAgICAlVHlwZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TdGF0c0luc3RhbGwoKQoKaW5zdGFsbHMgc3RhdHMKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TdGF0c0luc3RhbGwoKTsKCj1jdXQKCnN1YiBfU3RhdHNJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE1vZHVsZU5hbWUgPSAndmFyOjpwYWNrYWdlc2V0dXA6OklUU01TZXJ2aWNlTGV2ZWxNYW5hZ2VtZW50JzsKCiAgICByZXR1cm4gMSBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlTmFtZSk7CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQ29kZU9iamVjdCA9ICRNb2R1bGVOYW1lLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBpbnN0YWxsIHRoZSBzdGF0cwogICAgJENvZGVPYmplY3QtPl9TdGF0c0luc3RhbGwoKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDgvMDcvMTUgMDc6MzA6MTUgJAoKPWN1dAo=
closed with workaround
ticket is closed with workaround
3
1
current_timestamp
1
current_timestamp
1
Incident
1
current_timestamp
1
current_timestamp
1
Incident::ServiceRequest
1
current_timestamp
1
current_timestamp
1
Incident::Disaster
1
current_timestamp
1
current_timestamp
1
Problem
1
current_timestamp
1
current_timestamp
1
Problem::KnownError
1
current_timestamp
1
current_timestamp
1
Problem::PendingRfC
1
current_timestamp
1
current_timestamp
1