ITSMService
1.0.6
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Build for OTRS::ITSM 1.0.6.
Build for OTRS::ITSM 1.0.5.
Build for OTRS::ITSM 1.0.4.
Build for OTRS::ITSM 1.0.3.
Build for OTRS::ITSM 1.0.2.
Build for OTRS::ITSM 1.0.1.
Build for OTRS::ITSM 1.0.0 rc2.
Build for OTRS::ITSM 1.0.0 rc1.
Build for OTRS::ITSM 1.0.0 beta4.
Build for OTRS::ITSM 1.0.0 beta3.
Update version number of package.
Testbuild for OTRS::ITSM 1.0.0 beta2.
Reworked zoom view.
Improved features and updated framework files.
Update framework files.
Init release.
The OTRS::ITSM service package.
Das OTRS::ITSM Service Paket.
2.2.6
<br>
WELCOME<br>
<br>
You are about to install the OTRS module ITSMService.<br>
<br>
<br>
REQUIRED OTRS PACKAGES
<ul>
<li>GeneralCatalog 1.0.6</li>
<li>LinkObject 1.0.6</li>
<li>ITSMCore 1.0.6</li>
</ul>
<br>
ATTENTION<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ITSMService zu installieren.<br>
<br>
<br>
BENÖTIGTE OTRS-PAKETE
<ul>
<li>GeneralCatalog 1.0.6</li>
<li>LinkObject 1.0.6</li>
<li>ITSMCore 1.0.6</li>
</ul>
<br>
ACHTUNG<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WELCOME<br>
<br>
You are about to upgrade the OTRS module ITSMService.<br>
<br>
<br>
REQUIRED OTRS PACKAGES
<ul>
<li>GeneralCatalog 1.0.6</li>
<li>LinkObject 1.0.6</li>
<li>ITSMCore 1.0.6</li>
</ul>
<br>
ATTENTION<br>
<br>
Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
<br>
WILLKOMMEN<br>
<br>
Sie sind im Begriff das OTRS-Modul ITSMService zu aktualisieren.<br>
<br>
<br>
BENÖTIGTE OTRS-PAKETE
<ul>
<li>GeneralCatalog 1.0.6</li>
<li>LinkObject 1.0.6</li>
<li>ITSMCore 1.0.6</li>
</ul>
<br>
ACHTUNG<br>
<br>
Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br>
<br>
<br>
((enjoy))<br>
<br>
GeneralCatalog
ITSMCore
2008-03-29 23:09:21
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNU2VydmljZS54bWwsdiAxLjEzLjIuMiAyMDA4LzAxLzE0IDEzOjM4OjM1IG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01TZXJ2aWNlIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNU2VydmljZS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+SVRTTSBTZXJ2aWNlIE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNlcnZpY2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+U2VydmljZTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZXJ2aWNlLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNlcnZpY2U8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5pdHNtX3NlcnZpY2UucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNU2VydmljZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPlNlcnZpY2U8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMxMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNU2VydmljZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5TZXJ2aWNlPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNU2VydmljZVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU2VydmljZVpvb20gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01TZXJ2aWNlWm9vbS1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+U2VydmljZSBab29tPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5ab29tPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNlcnZpY2U8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50SVRTTVNMQVpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNU0xBWm9vbSBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50SVRTTVNMQVpvb20tT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNMQSBab29tPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5ab29tPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlNMQTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNU2VydmljZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDAtQmFjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGJhY2sgbGluayBpbiBzZXJ2aWNlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFp1cvxjay1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTZXJ2aWNlLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01TZXJ2aWNlOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TZXJ2aWNlTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+JEVudnsiSVRTTVNlcnZpY2VMYXN0U2NyZWVuT3ZlcnZpZXcifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01TZXJ2aWNlOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzEwMC1MaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlIGxpbmsgbGluayBpbiBzZXJ2aWNlIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFZlcmtu/HBmZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgU2VydmljZS1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpJVFNNU2VydmljZTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU2VydmljZU1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5MaW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudExpbmtPYmplY3QyJmFtcDtTb3VyY2VDbGFzcz1TZXJ2aWNlJmFtcDtTb3VyY2VLZXk9JFFEYXRheyJTZXJ2aWNlSUQifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01TTEE6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDAwLUJhY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBiYWNrIGxpbmsgaW4gc2xhIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIFp1cvxjay1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBTTEEtQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTVNMQTo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU0xBTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+JEVudnsiSVRTTVNlcnZpY2VMYXN0U2NyZWVuVmlldyJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OlBvc3NpYmxlUGFydG5lciMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Qb3NzaWJsZSBwYXJ0bmVyIGZyb20gU2VydmljZSBvYmplY3QgdG8gb3RoZXIgb2JqZWN0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TfZnbGljaGUgUGFydG5lciB2b20gU2VydmljZSB6dSBhbmRlcmVuIE9iamVrdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3QyOjpQb3NzaWJsZVBhcnRuZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUNvbmZpZ0l0ZW0iPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+UmVsZXZhbnRUbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RGVwZW5kc09uPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBUaWNrZXRJVFNNU2VydmljZS54bWwsdiAxLjMuMi4yIDIwMDgvMDMvMTcgMTA6Mzc6MTYgbWggRXhwICQ8L0NWUz4KICAgIDxDVlM+JE9sZElkOiBUaWNrZXQueG1sLHYgMS4xNDcuMi43IDIwMDgvMDMvMTYgMTk6MjE6NTEgbWFydGluIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OlNlcnZpY2UiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB0aWNrZXQgc2VydmljZS9TTEEgZmVhdHVyZSBpcyBlbmFibGVkLCB5b3UgY2FuIGRlZmluZSB0aWNrZXQgc2VydmljZXMgYW5kIFNMQXMgZm9yIHRpY2tldHMgKGUuIGcuIGVtYWlsLCBkZXNrdG9wLCBuZXR3b3JrLCAuLi4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XZW5uIGRhcyBUaWNrZXQtU2VydmljZS9TTEEgRmVhdHVlcyBha3RpdmllcnQgaXN0LCBr9m5uZW4gVGlja2V0IFNlcnZpY2VzIHVuZCBTTEFzIHBybyBUaWNrZXQgZ2VzZXR6dCB3ZXJkZW4gKHouIEIuIEVtYWlsLCBBcmJlaXRzcGxhdHosIE5ldHp3ZXJrLCAuLi4pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNU2VydmljZS5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgSVRTTVNlcnZpY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogYmdfSVRTTVNlcnZpY2UucG0sdiAxLjEuMi4yIDIwMDgvMDEvMTQgMTM6Mzg6MzUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01TZXJ2aWNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlLUFyZWEnfSA9ICcnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ID0gJ8zo7ejs4Ovt7iDi8OXs5SDs5ebk8yDo7fbo5OXt8ujy5Sc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBc3NvY2lhdGVkIFNMQXMnfSA9ICfR4vrw5+Dt6CBTTEEg5O7j7uLu8OgnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgRW5kJ30gPSAnzvHt7uLt4CDx6PHy5ezgL0JhY2tFbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVtb25zdHJhdGlvbid9ID0gJ8Tl7O7t8fLw4Pbo/yc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgVXNlciBTZXJ2aWNlJ30gPSAn0/Hr8+PoIOfgIOrw4Ont6CDv7vLw5eHo8uXr6Cc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udCBFbmQnfSA9ICfK6+jl7fLx6uAg8ejx8uXs4C9Gcm9udEVuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBNYW5hZ2VtZW50J30gPSAn0+/w4OLr5e3o5SDt4CDI0ic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBPcGVyYXRpb25hbCd9ID0gJ8jSIM7v5fDg9ujoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnxPDz4+gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvamVjdCd9ID0gJ8/w7uXq8ic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBvcnRpbmcnfSA9ICfO8vfl8u3u8fInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhaW5pbmcnfSA9ICfO4fP35e3o5Sc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSA9ICfO8e3u4uXtIOTu4+7i7vAnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F2YWlsYWJpbGl0eSd9ID0gJ8Tu8fL67+3u8fInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3JzJ30gPSAnw/Dl+OroJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnxPDz4+gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgVGltZSd9ID0gJ8Lw5ezlIOfgIOL65/Hy4O3u4v/i4O3lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc29sdXRpb24gUmF0ZSd9ID0gJ8Lw5ezlIOfgIPDg5/Dl+ODi4O3lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3BvbnNlIFRpbWUnfSA9ICfC8OXs5SDn4CDu8uPu4u7wJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zYWN0aW9ucyd9ID0gJ9Hk5evq6C/y8ODt5+Dq9ujoJzsKCiAgICByZXR1cm4gMTsKfQoKMTs=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNU2VydmljZS5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBJVFNNU2VydmljZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBjel9JVFNNU2VydmljZS5wbSx2IDEuMS4yLjIgMjAwOC8wMS8xNCAxMzozODozNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3pfSVRTTVNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UtQXJlYSd9ID0gJyc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWluaW11bSBUaW1lIEJldHdlZW4gSW5jaWRlbnRzJ30gPSAnTWluaW3DoWxuw60gxI1hcyBtZXppIGluY2lkZW50eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBc3NvY2lhdGVkIFNMQXMnfSA9ICdQxZlpZHJ1xb5lbsOpIFNMQSBzbWxpdXZ5JzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYWNrIEVuZCd9ID0gJ1rDoWtsYWRuw60gc2Now6ltYS9CYWNrRW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlbW9uc3RyYXRpb24nfSA9ICdEZW1vbnN0cmFjZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgVXNlciBTZXJ2aWNlJ30gPSAnU2x1xb5ieSBrb25jb3bDvWNoIHXFvml2YXRlbMWvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250IEVuZCd9ID0gJ1rDoWthem5pY2vDvSBzeXN0w6ltL0Zyb250RW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lUIE1hbmFnZW1lbnQnfSA9ICfFmMOtemVuw60gSVQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSVQgT3BlcmF0aW9uYWwnfSA9ICdJVCBPcGVyYWNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J090aGVyJ30gPSAnRGFsxaHDrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcm9qZWN0J30gPSAnUHJvamVrdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBvcnRpbmcnfSA9ICdacHJhdm9kYWpzdHbDrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFpbmluZyd9ID0gJ8Wga29sZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbmRlcnBpbm5pbmcgQ29udHJhY3QnfSA9ICdaw6FrbGFkbsOtIHNtbG91dmEnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F2YWlsYWJpbGl0eSd9ID0gJ0Rvc3R1cG5vc3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3JzJ30gPSAnQ2h5YnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdEYWzFocOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFRpbWUnfSA9ICdEb2JhIG9ibm92ZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvbHV0aW9uIFJhdGUnfSA9ICdEb2JhIMWZZcWhZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNwb25zZSBUaW1lJ30gPSAnRG9iYSBvZHBvdsSbZGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNhY3Rpb25zJ30gPSAnT2JjaG9keS90cmFuc2FrY2UnOwoKICAgIHJldHVybiAxOwp9CgoxOw==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNU2VydmljZS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgSVRTTVNlcnZpY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSVRTTVNlcnZpY2UucG0sdiAxLjkuMi4xIDIwMDgvMDEvMTQgMTM6Mzg6MzUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01TZXJ2aWNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlLUFyZWEnfSA9ICdTZXJ2aWNlLUJlcmVpY2gnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyd9ID0gJ01pbmRlc3R6ZWl0IHp3aXNjaGVuIEluY2lkZW50cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBc3NvY2lhdGVkIFNMQXMnfSA9ICdadWdlaPZyaWdlIFNMQXMnOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2sgRW5kJ30gPSAnQmFja2VuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZW1vbnN0cmF0aW9uJ30gPSAnRGVtb25zdHJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgVXNlciBTZXJ2aWNlJ30gPSAnQW53ZW5kZXItU2VydmljZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udCBFbmQnfSA9ICdGcm9udGVuZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBNYW5hZ2VtZW50J30gPSAnSVQgTWFuYWdlbWVudCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJVCBPcGVyYXRpb25hbCd9ID0gJ0lUIEJldHJpZWInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3RoZXInfSA9ICdTb25zdGlnZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJvamVjdCd9ID0gJ1Byb2pla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwb3J0aW5nJ30gPSAnUmVwb3J0aW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYWluaW5nJ30gPSAnVHJhaW5pbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5kZXJwaW5uaW5nIENvbnRyYWN0J30gPSAnVW5kZXJwaW5uaW5nIENvbnRyYWN0JzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBdmFpbGFiaWxpdHknfSA9ICdWZXJm/GdiYXJrZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9ycyd9ID0gJ0ZlaGxlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdGhlcid9ID0gJ1NvbnN0aWdlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBUaW1lJ30gPSAnV2llZGVyaGVyc3RlbGx1bmdzemVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvbHV0aW9uIFJhdGUnfSA9ICdM9nN1bmdzemVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNwb25zZSBUaW1lJ30gPSAnUmVha3Rpb25zemVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc2FjdGlvbnMnfSA9ICdUcmFuc2FrdGlvbmVuJzsKCiAgICByZXR1cm4gMTsKfQoKMTs=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU2VydmljZS5wbSAtIGFkbWluIGZyb250ZW5kIHRvIG1hbmFnZSBzZXJ2aWNlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TZXJ2aWNlLnBtLHYgMS42LjIuMiAyMDA4LzAzLzI3IDE1OjU3OjQyIHViIEV4cCAkCiMgJE9sZElkOiBBZG1pblNlcnZpY2UucG0sdiAxLjYuMi4yIDIwMDgvMDMvMjUgMTM6Mjc6MDUgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluU2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS42LjIuMiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBnZXQgY29tbW9uIG9wamVjdHMKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIik7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlcnZpY2UgZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZUVkaXQnKSB7CiAgICAgICAgbXkgJVNlcnZpY2VEYXRhOwogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTZXJ2aWNlSUQiKTsKICAgICAgICBpZiAoJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0gbmUgJ05FVycpIHsKICAgICAgICAgICAgJVNlcnZpY2VEYXRhID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZURhdGF7U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICMgZ2VuZXJhdGUgUGFyZW50T3B0aW9uU3RyZwogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJykgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KICAgICAgICBteSAlU2VydmljZUxpc3QgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlRGF0YXtQYXJlbnRPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnUGFyZW50SUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZXJ2aWNlRGF0YXtQYXJlbnRJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgRGlzYWJsZWRCcmFuY2ggPT4gJFNlcnZpY2VEYXRhe05hbWV9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBNYXggPT4gMjAwLAogICAgICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZ2VuZXJhdGUgVHlwZU9wdGlvblN0cmcKICAgICAgICBteSAkVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlRGF0YXtUeXBlT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+ICRUeXBlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VydmljZURhdGF7VHlwZUlEfSwKICAgICAgICApOwogICAgICAgICMgZ2VuZXJhdGUgQ3JpdGljYWxpdHlPcHRpb25TdHJnCiAgICAgICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcml0aWNhbGl0eU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkQ3JpdGljYWxpdHlMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IFwlVmFsaWRMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdWYWxpZElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VydmljZURhdGF7VmFsaWRJRH0gfHwgMSwKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IHNlcnZpY2UgZWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2VFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlU2VydmljZURhdGEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2VydmljZSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZXJ2aWNlU2F2ZScpIHsKICAgICAgICBteSAlU2VydmljZURhdGE7CiAgICAgICAgIyBnZXQgcGFyYW1zCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBmb3JlYWNoIChxdyhTZXJ2aWNlSUQgUGFyZW50SUQgTmFtZSBWYWxpZElEIENvbW1lbnQpKSB7CiAgICAgICAgZm9yZWFjaCAocXcoU2VydmljZUlEIFBhcmVudElEIE5hbWUgVmFsaWRJRCBDb21tZW50IFR5cGVJRCBDcml0aWNhbGl0eUlEKSkgewojIC0tLQogICAgICAgICAgICAkU2VydmljZURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICIkXyIpIHx8ICcnOwogICAgICAgIH0KICAgICAgICAjIHNhdmUgdG8gZGF0YWJhc2UKICAgICAgICBpZiAoJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0gZXEgJ05FVycpIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICAgICAgJVNlcnZpY2VEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCEkU3VjY2VzcykgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAgICAgJVNlcnZpY2VEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCEkU3VjY2VzcykgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc2VydmljZSBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAjIGNoZWNrIGlmIHNlcnZpY2UgaXMgZW5hYmxlZCB0byB1c2UgaXQgaGVyZQogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAnJFRleHR7IllvdSBuZWVkIHRvIGFjdGl2YXRlICVzIGZpcnN0IHRvIHVzZSBpdCEiLCAiU2VydmljZSJ9JywKICAgICAgICAgICAgICAgIExpbmsgPT4gJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWRtaW5TeXNDb25maWcmU3ViYWN0aW9uPUVkaXQmU3lzQ29uZmlnR3JvdXA9VGlja2V0JlN5c0NvbmZpZ1N1Ykdyb3VwPUNvcmU6OlRpY2tldCNUaWNrZXQ6OlNlcnZpY2UiJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcgcmVzdWx0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZUxpc3QgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICAgICAgZm9yZWFjaCAoa2V5cyAlU2VydmljZUxpc3QpIHsKICAgICAgICAgICAgJFNlcnZpY2VMaXN0eyRffSAuPSAnOjonOwogICAgICAgIH0KICAgICAgICBteSAkQ3NzQ2xhc3M7CiAgICAgICAgZm9yZWFjaCBteSAkU2VydmljZUlEIChzb3J0IHskU2VydmljZUxpc3R7JGF9IGNtcCAkU2VydmljZUxpc3R7JGJ9fSBrZXlzICVTZXJ2aWNlTGlzdCkgewogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgaWYgKCRDc3NDbGFzcyAmJiAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScpIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlU2VydmljZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNlcnZpY2VEYXRhe05hbWVTaG9ydH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHskU2VydmljZURhdGF7VmFsaWRJRH19LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgQEZyYWdtZW50ID0gc3BsaXQoJzo6JywgJFNlcnZpY2VEYXRhe05hbWV9KTsKICAgICAgICAgICAgICAgIHBvcChARnJhZ21lbnQpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoQEZyYWdtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93U3BhY2UnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVTZXJ2aWNlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAkVmFsaWRMaXN0eyRTZXJ2aWNlRGF0YXtWYWxpZElEfX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU0xBLnBtIC0gYWRtaW4gZnJvbnRlbmQgdG8gbWFuYWdlIHNsYXMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluU0xBLnBtLHYgMS44LjIuMyAyMDA4LzAzLzI3IDE2OjIzOjU5IHViIEV4cCAkCiMgJE9sZElkOiBBZG1pblNMQS5wbSx2IDEuNi4yLjIgMjAwOC8wMy8yNSAxMzoyNzowNSB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TTEE7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjguMi4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBjb21tb24gb3BqZWN0cwogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBhbGwgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICghJFNlbGYtPnskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTTEFPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzbGEgZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU0xBRWRpdCcpIHsKICAgICAgICBteSAlU0xBRGF0YTsKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAkU0xBRGF0YXtTTEFJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlNMQUlEIik7CiAgICAgICAgaWYgKCRTTEFEYXRhe1NMQUlEfSkgewogICAgICAgICAgICAlU0xBRGF0YSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgICAgICAgICAgU0xBSUQgPT4gJFNMQURhdGF7U0xBSUR9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTTEFEYXRhe1NlcnZpY2VJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlNlcnZpY2VJRCIpOwogICAgICAgIH0KICAgICAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZUxpc3QgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICMgZ2VuZXJhdGUgU2VydmljZU9wdGlvblN0cmcKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScpIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1NlcnZpY2VPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU0xBRGF0YXtTZXJ2aWNlSUR9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJlZVZpZXcgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIE1heCA9PiAyMDAsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBnZW5lcmF0ZSBUeXBlT3B0aW9uU3RyZwogICAgICAgIG15ICRUeXBlTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiAkVHlwZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNMQURhdGF7VHlwZUlEfSwKICAgICAgICApOwojIC0tLQogICAgICAgICMgZ2VuZXJhdGUgQ2FsZW5kYXJPcHRpb25TdHJnCiAgICAgICAgbXkgJUNhbGVuZGFyTGlzdDsKICAgICAgICBmb3JlYWNoICgxLi4yMCkgewogICAgICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpbWVWYWNhdGlvbkRheXM6OkNhbGVuZGFyJF8iKSkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyTGlzdHskX30gPSAiQ2FsZW5kYXIgJF8gLSAiLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGltZVpvbmU6OkNhbGVuZGFyIi4kXy4iTmFtZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTTEFEYXRhe0NhbGVuZGFyT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IFwlQ2FsZW5kYXJMaXN0LAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhcicsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNMQURhdGF7Q2FsZW5kYXJ9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgJFNMQURhdGF7VmFsaWRPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTTEFEYXRhe1ZhbGlkSUR9IHx8IDEsCiAgICAgICAgKTsKICAgICAgICAjIG91dHB1dCBzbGEgZWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTTEFFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU0xBJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzbGEgc2F2ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU0xBU2F2ZScpIHsKICAgICAgICBteSAlU0xBRGF0YTsKICAgICAgICAjIGdldCBwYXJhbXMKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIGZvcmVhY2ggKHF3KFNMQUlEIFNlcnZpY2VJRCBOYW1lIENhbGVuZGFyIEZpcnN0UmVzcG9uc2VUaW1lIFNvbHV0aW9uVGltZSBVcGRhdGVUaW1lIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICBmb3JlYWNoIChxdyhTTEFJRCBTZXJ2aWNlSUQgTmFtZSBDYWxlbmRhciBGaXJzdFJlc3BvbnNlVGltZSBTb2x1dGlvblRpbWUgVXBkYXRlVGltZSBWYWxpZElEIENvbW1lbnQgVHlwZUlEIE1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzKSkgewojIC0tLQogICAgICAgICAgICAkU0xBRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIiRfIikgfHwgJyc7CiAgICAgICAgfQogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIGlmICghJFNMQURhdGF7U0xBSUR9KSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFBZGQoCiAgICAgICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICghJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFVcGRhdGUoCiAgICAgICAgICAgICAgICAlU0xBRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICghJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzbGEgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIGlzIGVuYWJsZWQgdG8gdXNlIGl0IGhlcmUKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJyRUZXh0eyJZb3UgbmVlZCB0byBhY3RpdmF0ZSAlcyBmaXJzdCB0byB1c2UgaXQhIiwgIlNlcnZpY2UifScsCiAgICAgICAgICAgICAgICBMaW5rID0+ICckRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3lzQ29uZmlnJlN1YmFjdGlvbj1FZGl0JlN5c0NvbmZpZ0dyb3VwPVRpY2tldCZTeXNDb25maWdTdWJHcm91cD1Db3JlOjpUaWNrZXQjVGlja2V0OjpTZXJ2aWNlIicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBWYWxpZCA9PiAwLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyBnZW5lcmF0ZSBTZXJ2aWNlT3B0aW9uU3RyZwogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJykgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KICAgICAgICBteSAkU2VydmljZU9wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgTWF4ID0+IDIwMCwKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFNlcnZpY2VPcHRpb25TdHJnID0+ICRTZXJ2aWNlT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgICAgICBmb3JlYWNoIChrZXlzICVTZXJ2aWNlTGlzdCkgewogICAgICAgICAgICAkU2VydmljZUxpc3R7JF99IC49ICc6Oic7CiAgICAgICAgfQogICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICBmb3JlYWNoIG15ICRTZXJ2aWNlSUQgKHNvcnQgeyRTZXJ2aWNlTGlzdHskYX0gY21wICRTZXJ2aWNlTGlzdHskYn19IGtleXMgJVNlcnZpY2VMaXN0KSB7CiAgICAgICAgICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgICAgICAgICAgJC8gPSAnOjonOwogICAgICAgICAgICBjaG9tcCgkU2VydmljZU5hbWUpOwogICAgICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgICAgICBteSAlU0xBTGlzdCA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTGlzdCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFNMQUlEIChzb3J0IHskU0xBTGlzdHskYX0gY21wICRTTEFMaXN0eyRifX0ga2V5cyAlU0xBTGlzdCkgewogICAgICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICAgICBpZiAoJENzc0NsYXNzICYmICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJykgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgICAgICAgICBteSAlU0xBRGF0YSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVNMQURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7JFNMQURhdGF7VmFsaWRJRH19LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNMQScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2UucG0gLSB0aGUgT1RSUzo6SVRTTSBTZXJ2aWNlIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01TZXJ2aWNlLnBtLHYgMS41IDIwMDcvMDgvMDIgMTI6NDg6NDkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNU2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjUgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICghJFNlbGYtPnskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKQogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIG91dHB1dCBoZWFkZXIKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKICAgICMgZ2V0IHR5cGUgbGlzdAogICAgbXkgJFR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICk7CiAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICApOwogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBteSAlU2VydmljZUxpc3QgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICBmb3JlYWNoIChrZXlzICVTZXJ2aWNlTGlzdCkgewogICAgICAgICRTZXJ2aWNlTGlzdHskX30gLj0gJzo6JzsKICAgIH0KICAgIG15ICRDc3NDbGFzczsKICAgIGZvcmVhY2ggbXkgJFNlcnZpY2VJRCAoc29ydCB7JFNlcnZpY2VMaXN0eyRhfSBjbXAgJFNlcnZpY2VMaXN0eyRifX0ga2V5cyAlU2VydmljZUxpc3QpIHsKICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICBpZiAoJENzc0NsYXNzICYmICRDc3NDbGFzcyBlcSAnc2VhcmNocGFzc2l2ZScpIHsKICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgfQogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlU2VydmljZSwKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRTZXJ2aWNle05hbWVTaG9ydH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZUxpc3QtPnskU2VydmljZXtUeXBlSUR9fSwKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkQ3JpdGljYWxpdHlMaXN0LT57JFNlcnZpY2V7Q3JpdGljYWxpdHlJRH19LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15IEBGcmFnbWVudCA9IHNwbGl0KCc6OicsICRTZXJ2aWNle05hbWV9KTsKICAgICAgICAgICAgcG9wKEBGcmFnbWVudCk7CiAgICAgICAgICAgIGZvcmVhY2ggKEBGcmFnbWVudCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jvd1NwYWNlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlU2VydmljZSwKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRTZXJ2aWNle05hbWVTaG9ydH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkVHlwZUxpc3QtPnskU2VydmljZXtUeXBlSUR9fSwKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkQ3JpdGljYWxpdHlMaXN0LT57JFNlcnZpY2V7Q3JpdGljYWxpdHlJRH19LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudElUU01TZXJ2aWNlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgIyBzZXQgbGFzdCBzY3JlZW4gdmlldwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdJVFNNU2VydmljZUxhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgVmFsdWUgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iLAogICAgKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOw==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNlcnZpY2Vab29tLnBtIC0gdGhlIE9UUlM6OklUU00gU2VydmljZSB6b29tIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01TZXJ2aWNlWm9vbS5wbSx2IDEuNiAyMDA3LzA4LzAyIDEyOjQ4OjQ5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNlcnZpY2Vab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjYgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICghJFNlbGYtPnskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKQogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdDJ9ID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NMQU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U0xBLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJE91dHB1dDsKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJFNlcnZpY2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU2VydmljZUlEIik7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCEkU2VydmljZUlEKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIFNlcnZpY2VJRCBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQogICAgIyBvdXRwdXQgaGVhZGVyCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlELAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCEkU2VydmljZXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIlNlcnZpY2VJRCAkU2VydmljZUlEIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQogICAgIyBnZXQgc2VydmljZSB0eXBlIGxpc3QKICAgIG15ICRTZXJ2aWNlVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgKTsKICAgICRTZXJ2aWNle1R5cGV9ID0gJFNlcnZpY2VUeXBlTGlzdC0+eyRTZXJ2aWNle1R5cGVJRH19OwogICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgKTsKICAgICRTZXJ2aWNle0NyaXRpY2FsaXR5fSA9ICRDcml0aWNhbGl0eUxpc3QtPnskU2VydmljZXtDcml0aWNhbGl0eUlEfX07CiAgICAjIHJ1biBjb25maWcgaXRlbSBtZW51IG1vZHVsZXMKICAgIGlmIChyZWYoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01TZXJ2aWNlOjpGcm9udGVuZDo6TWVudU1vZHVsZScpKSBlcSAnSEFTSCcpIHsKICAgICAgICBteSAlTWVudXMgPSAleyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNU2VydmljZTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKX07CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvcmVhY2ggbXkgJE1lbnUgKHNvcnQga2V5cyAlTWVudXMpIHsKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTWVudXN7JE1lbnV9LT57TW9kdWxlfSkpIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VsZi0+e1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU2VydmljZSA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciA9PiAkQ291bnRlciwKICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyID0gMDsKICAgICMgZ2V0IHNsYSBsaXN0CiAgICBteSAlU0xBTGlzdCA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICglU0xBTGlzdCkgewogICAgICAgICRPdXRwdXRIb3Jpem9udGFsUnVsZXIgPSAxOwogICAgICAgICMgZ2V0IHNsYSB0eXBlIGxpc3QKICAgICAgICBteSAkU0xBVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpTTEE6OlR5cGUnLAogICAgICAgICk7CiAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICApOwogICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICBmb3JlYWNoIG15ICRTTEFJRCAoc29ydCB7JFNMQUxpc3R7JGF9IGNtcCAkU0xBTGlzdHskYn19IGtleXMgJVNMQUxpc3QpIHsKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgIGlmICgkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ3NzQ2xhc3MgPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgICAgIG15ICVTTEEgPSAkU2VsZi0+e1NMQU9iamVjdH0tPlNMQUdldCgKICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTTEFJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVTTEEsCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkU0xBVHlwZUxpc3QtPnskU0xBe1R5cGVJRH19LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgIyBnZXQgcGFydG5lciBsaW5rIGRhdGEgbGlzdAogICAgbXkgJFBhcnRuZXJMaW5rRGF0YUxpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lckxpbmtEYXRhTGlzdCgKICAgICAgICBDbGFzcyA9PiAnU2VydmljZScsCiAgICAgICAgS2V5ID0+ICRTZXJ2aWNlSUQsCiAgICApOwogICAgIyBnZW5lcmF0ZSBibG9jayBsaXN0CiAgICBteSAkQmxvY2tMaXN0ID0ge307CiAgICBmb3JlYWNoIG15ICRJdGVtIChAeyRQYXJ0bmVyTGlua0RhdGFMaXN0fSkgewogICAgICAgICRCbG9ja0xpc3QtPnskSXRlbS0+e0Jsb2NrbmFtZTF9fS0+eyRJdGVtLT57QmxvY2tuYW1lMn19LT57JEl0ZW0tPntMaW5rSUR9fSA9ICRJdGVtOwogICAgfQogICAgIyBzdGFydCBwYXJ0bmVyIG91dHB1dAogICAgZm9yZWFjaCBteSAkQmxvY2tuYW1lMSAoc29ydCBrZXlzICV7JEJsb2NrTGlzdH0pIHsKICAgICAgICBmb3JlYWNoIG15ICRCbG9ja25hbWUyIChzb3J0IGtleXMgJXskQmxvY2tMaXN0LT57JEJsb2NrbmFtZTF9fSkgewogICAgICAgICAgICAkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyID0gMTsKICAgICAgICAgICAgbXkgJEl0ZW1MaXN0ID0gJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfTsKICAgICAgICAgICAgIyBnZXQgcGFydG5lciB0YWJsZSBjb2x1bW5zCiAgICAgICAgICAgIG15IEBMaW5rSURzID0ga2V5cygleyRJdGVtTGlzdH0pOwogICAgICAgICAgICBteSAkUGFydG5lclRhYmxlQ29sdW1uID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJUYWJsZUNvbHVtbkdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtTGlzdC0+eyRMaW5rSURzWzBdfS0+e1BhcnRuZXJDbGFzc30sCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtTGlzdC0+eyRMaW5rSURzWzBdfSwKICAgICAgICAgICAgICAgIExpbmtUeXBlQ29sdW1uID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgY291bnQgY29sdW1ucwogICAgICAgICAgICBteSAkQ29sdW1uQ291bnQgPSBAeyRQYXJ0bmVyVGFibGVDb2x1bW59OwogICAgICAgICAgICAjIG91dHB1dCBsaW5rIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEJsb2NrbmFtZTEgPT4gJEJsb2NrbmFtZTEsCiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMiA9PiAkQmxvY2tuYW1lMiwKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuID0+ICRDb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgb3V0cHV0IGNvbHVtbiB3aWR0aCBibG9jawogICAgICAgICAgICBmb3JlYWNoIG15ICRDb2x1bW4gKEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0pIHsKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgaGVhZGVyIGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rQ29sdW1uV2lkdGgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBXaWR0aCA9PiAkQ29sdW1uLT57SFRNTE91dHB1dH0tPntUYWJsZVdpZHRofSB8fCAnKicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUgY29sdW1uIGJsb2NrCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJENvbHVtbiAoQHskUGFydG5lclRhYmxlQ29sdW1ufSkgewogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBoZWFkZXIgY29sdW1uIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtIZWFkZXJDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRDb2x1bW4tPntIZWFkbGluZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENzc0NsYXNzOwogICAgICAgICAgICBmb3JlYWNoIG15ICRMaW5rRGF0YSAoc29ydCBrZXlzICV7JEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfX0pIHsKICAgICAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAgICAgaWYgKCRDc3NDbGFzcyAmJiAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaHBhc3NpdmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ3NzQ2xhc3MgPSAnc2VhcmNocGFzc2l2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtSb3cnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJENvbHVtbkRhdGEgKEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0pIHsKICAgICAgICAgICAgICAgICAgICAjIGxvb2t1cCBjb250ZW50CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3QyQ29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfS0+eyRMaW5rRGF0YX0tPntQYXJ0bmVyQ2xhc3N9LAogICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5EYXRhID0+ICRDb2x1bW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rRGF0YSA9PiAkQmxvY2tMaXN0LT57JEJsb2NrbmFtZTF9LT57JEJsb2NrbmFtZTJ9LT57JExpbmtEYXRhfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgcm93IGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtSb3dDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbnRlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICMgb3V0cHV0IGhvcml6b250YWwgcnVsZXIKICAgIGlmICgkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSG9yaXpvbnRhbFJ1bGVyJywKICAgICAgICApOwogICAgfQogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNlcnZpY2V7Q3JlYXRlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvcmVhY2ggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAkU2VydmljZXsnQ3JlYXRlJyAuICRffSA9ICRDcmVhdGVVc2VyeyRffTsKICAgIH0KICAgICMgZ2V0IGNoYW5nZSB1c2VyIGRhdGEKICAgIG15ICVDaGFuZ2VVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTZXJ2aWNle0NoYW5nZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CiAgICBmb3JlYWNoIChxdyhVc2VyTG9naW4gVXNlckZpcnN0bmFtZSBVc2VyTGFzdG5hbWUpKSB7CiAgICAgICAgJFNlcnZpY2V7J0NoYW5nZScgLiAkX30gPSAkQ2hhbmdlVXNlcnskX307CiAgICB9CiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNlcnZpY2Vab29tJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlU2VydmljZSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICMgc2V0IGxhc3Qgc2NyZWVuIHZpZXcgKElUU01TZXJ2aWNlKQogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ID0+ICdJVFNNQ29uZmlnSXRlbUxhc3RTY3JlZW5WaWV3JywKICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTZXJ2aWNlSUQ9JFNlcnZpY2VJRCIsCiAgICApOwogICAgIyBzZXQgbGFzdCBzY3JlZW4gdmlldyAoTGlua09iamVjdDIpCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgPT4gJ0xpbmtPYmplY3QyTGFzdFNjcmVlbicsCiAgICAgICAgVmFsdWUgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU2VydmljZUlEPSRTZXJ2aWNlSUQiLAogICAgKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOw==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVNMQVpvb20ucG0gLSB0aGUgT1RSUzo6SVRTTSBTTEEgem9vbSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU0xBWm9vbS5wbSx2IDEuNCAyMDA3LzA4LzAyIDEyOjQ4OjQ5IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVNMQVpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U0xBOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkU2VsZi0+eyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpCiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkT3V0cHV0OwogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU0xBSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlNMQUlEIik7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCEkU0xBSUQpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gU0xBSUQgaXMgZ2l2ZW4hIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KICAgICMgb3V0cHV0IGhlYWRlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgIFNMQUlEID0+ICRTTEFJRCwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICghJFNMQXtTTEFJRH0pIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiU0xBSUQgJFNMQUlEIG5vdCBmb3VuZCBpbiBkYXRhYmFzZSEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQogICAgIyBnZXQgdHlwZSBsaXN0CiAgICBteSAkVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OlNMQTo6VHlwZScsCiAgICApOwogICAgJFNMQXtUeXBlfSA9ICRUeXBlTGlzdC0+eyRTTEF7VHlwZUlEfX07CiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgU2VydmljZUlEID0+ICRTTEF7U2VydmljZUlEfSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRTTEF7U2VydmljZX0gPSAkU2VydmljZXtOYW1lfTsKICAgICMgZ2V0IGNhbGVuZGFyIG5hbWUKICAgICRTTEF7Q2FsZW5kYXJOYW1lfSA9ICJDYWxlbmRhciAkU0xBe0NhbGVuZGFyfSAtICIuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaW1lWm9uZTo6Q2FsZW5kYXIiLiAkU0xBe0NhbGVuZGFyfSAuIk5hbWUiKTsKICAgICMgcnVuIGNvbmZpZyBpdGVtIG1lbnUgbW9kdWxlcwogICAgaWYgKHJlZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSkgZXEgJ0hBU0gnKSB7CiAgICAgICAgbXkgJU1lbnVzID0gJXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTVNMQTo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKX07CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGZvcmVhY2ggbXkgJE1lbnUgKHNvcnQga2V5cyAlTWVudXMpIHsKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTWVudXN7JE1lbnV9LT57TW9kdWxlfSkpIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIFNMQUlEID0+ICRTZWxmLT57U0xBSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgJENvdW50ZXIgPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiBcJVNMQSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICMgZ2V0IGNyZWF0ZSB1c2VyIGRhdGEKICAgIG15ICVDcmVhdGVVc2VyID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRTTEF7Q3JlYXRlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvcmVhY2ggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAkU0xBeydDcmVhdGUnIC4gJF99ID0gJENyZWF0ZVVzZXJ7JF99OwogICAgfQogICAgIyBnZXQgY2hhbmdlIHVzZXIgZGF0YQogICAgbXkgJUNoYW5nZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFNMQXtDaGFuZ2VCeX0sCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwogICAgZm9yZWFjaCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRTTEF7J0NoYW5nZScgLiAkX30gPSAkQ2hhbmdlVXNlcnskX307CiAgICB9CiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTVNMQVpvb20nLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTTEEsCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU2VydmljZU1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01TZXJ2aWNlTWVudUdlbmVyaWMucG0sdiAxLjIgMjAwNy8wNy8wMiAxNDowMzozNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01TZXJ2aWNlTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgU2VydmljZU9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoISRQYXJhbXtTZXJ2aWNlfSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgU2VydmljZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51JywKICAgICAgICBEYXRhID0+IHt9LAogICAgKTsKICAgIGlmICgkUGFyYW17Q291bnRlcn0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskUGFyYW17U2VydmljZX19LAogICAgICAgICAgICAleyRQYXJhbXtDb25maWd9fSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNU0xBTWVudUdlbmVyaWMucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTVNMQU1lbnVHZW5lcmljLnBtLHYgMS4yIDIwMDcvMDcvMDIgMTQ6MDM6MzUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNU0xBTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgU0xBT2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICghJFBhcmFte1NMQX0pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkIFNMQSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51JywKICAgICAgICBEYXRhID0+IHt9LAogICAgKTsKICAgIGlmICgkUGFyYW17Q291bnRlcn0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXskUGFyYW17U0xBfX0sCiAgICAgICAgICAgICV7JFBhcmFte0NvbmZpZ319LAogICAgICAgIH0sCiAgICApOwogICAgJFBhcmFte0NvdW50ZXJ9Kys7CgogICAgcmV0dXJuICRQYXJhbXtDb3VudGVyfTsKfQoKMTs=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0MkxheW91dFNlcnZpY2UucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGlua09iamVjdDJMYXlvdXRTZXJ2aWNlLnBtLHYgMS4zIDIwMDcvMDcvMDIgMTQ6MDM6MzUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0MkxheW91dFNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3QyTGF5b3V0U2VydmljZSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBzZXJ2aWNlIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0MkxheW91dFNlcnZpY2UtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IExheW91dE9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFBhcmFtT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldygleyRTZWxmfSk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb250ZW50U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5Db250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgIENvbHVtbkRhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgTGlua0RhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJENvbnRlbnRTdHJpbmcgPSAnJzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhDb2x1bW5EYXRhIExpbmtEYXRhKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCRQYXJhbXtDb2x1bW5EYXRhfS0+e1R5cGV9IGVxICdEYXRlVGltZScpIHsKICAgICAgICAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkUURhdGF7IkRhdGUifSJ9JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEYXRlID0+ICRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+eyRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX19IHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0NoZWNrYm94JykgewogICAgICAgICRDb250ZW50U3RyaW5nID0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJyAuICRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57TmFtZX0gLiciICcuCiAgICAgICAgICAgICd2YWx1ZT0iJy4gJFBhcmFte0xpbmtEYXRhfS0+eyRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX19IC4nIj4nOwogICAgfQogICAgZWxzaWYgKCRQYXJhbXtDb2x1bW5EYXRhfS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycpIHsKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NvbHVtbkRhdGF9LT57RGF0YX0tPntDbGFzc30sCiAgICAgICAgKTsKICAgICAgICAkQ29udGVudFN0cmluZyA9ICRDbGFzc0xpc3QtPnskUGFyYW17TGlua0RhdGF9LT57RGF0YX0tPnskUGFyYW17Q29sdW1uRGF0YX0tPntLZXl9fX07CiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57SFRNTE91dHB1dH0tPntUcmFuc2xhdGlvbn0pIHsKICAgICAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkQ29udGVudFN0cmluZyk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRQYXJhbXtDb2x1bW5EYXRhfS0+e1R5cGV9IGVxICdMaW5rJyAmJgogICAgICAgICRQYXJhbXtDb2x1bW5EYXRhfS0+e0RhdGF9LT57TGlua1R5cGV9ICYmICRQYXJhbXtDb2x1bW5EYXRhfS0+e0RhdGF9LT57TGlua1R5cGV9IGVxICdab29tJwogICAgKSB7CiAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAnPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbSZTZXJ2aWNlSUQ9Jy4KICAgICAgICAgICAgJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57U2VydmljZUlEfSAuICciPicuCiAgICAgICAgICAgICRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+eyRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX19IC4gJzwvYT4nOwogICAgfQogICAgZWxzaWYgKCRQYXJhbXtDb2x1bW5EYXRhfS0+e1R5cGV9IGVxICdUZXh0JyAmJiAkUGFyYW17Q29sdW1uRGF0YX0tPntIVE1MT3V0cHV0fS0+e01heExlbmd0aH0pIHsKICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17TGlua0RhdGF9LT57RGF0YX0tPnskUGFyYW17Q29sdW1uRGF0YX0tPntLZXl9fSB8fCAnJzsKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICgkUGFyYW17Q29sdW1uRGF0YX0tPntIVE1MT3V0cHV0fS0+e1RyYW5zbGF0aW9ufSkgewogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpOwogICAgICAgIH0KICAgICAgICAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFFEYXRheyJEYXRlIiwiJy4gJFBhcmFte0NvbHVtbkRhdGF9LT57SFRNTE91dHB1dH0tPntNYXhMZW5ndGh9IC4nIn0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERhdGUgPT4gJFZhbHVlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0xpbmtUeXBlJykgewogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDI6OlR5cGUnKTsKICAgICAgICBteSAkTGlua1R5cGUgPSAkUGFyYW17TGlua0RhdGF9LT57JFBhcmFte0NvbHVtbkRhdGF9LT57S2V5fX07CgogICAgICAgIGlmICgkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfSAmJgogICAgICAgICAgICAkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfS0+e05vcm1hbE5hbWV9ICYmCiAgICAgICAgICAgICRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9LT57UmV2ZXJzZU5hbWV9CiAgICAgICAgKSB7CiAgICAgICAgICAgICRDb250ZW50U3RyaW5nID0gJExpbmtUeXBlTGlzdC0+eyRMaW5rVHlwZX0tPntOb3JtYWxOYW1lfTsKICAgICAgICAgICAgaWYgKCRQYXJhbXtMaW5rRGF0YX0tPntQYXJ0bmVyQ29tYmluYXRpb259IGVxICdSZXZlcnNlJykgewogICAgICAgICAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfS0+e1JldmVyc2VOYW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICgkUGFyYW17Q29sdW1uRGF0YX0tPntIVE1MT3V0cHV0fS0+e1RyYW5zbGF0aW9ufSkgewogICAgICAgICAgICAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRDb250ZW50U3RyaW5nKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ29udGVudFN0cmluZyA9ICRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+eyRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX19IHx8ICcnOwogICAgICAgICMgdHJhbnNsYXRlCiAgICAgICAgaWYgKCRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57VHJhbnNsYXRpb259KSB7CiAgICAgICAgICAgICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJENvbnRlbnRTdHJpbmcpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkQ29udGVudFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgSXRlbSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRTdHJpbmdDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJElucHV0U3RyaW5nID0gJyc7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoSXRlbSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9IGVxICdUZXh0JykgewogICAgICAgICRJbnB1dFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cIlRleHRcIiBuYW1lPVwiJFBhcmFte0l0ZW19LT57S2V5fVwiIHNpemU9XCI2MFwiPiI7OwogICAgfQogICAgZWxzaWYgKCRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycpIHsKICAgICAgICAjIGdldCBnZW5lcmFsIGNhdGFsb2cgbGlzdAogICAgICAgIG15ICRTZWxlY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntDbGFzc30gfHwgJycsCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgICAgICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFNlbGVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICAgICAgICAgU2l6ZSA9PiA1LAogICAgICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRJbnB1dFN0cmluZzsKfQoKPWl0ZW0gUGFydG5lclNlYXJjaEZvcm1HZXQoKQoKZ2V0IGFsbCBzZWFyY2ggZm9ybSBkYXRhIGFuZCByZXR1cm4gaXQgYXMgMmQgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+UGFydG5lclNlYXJjaEZvcm1HZXQoKTsKCj1jdXQKCnN1YiBQYXJ0bmVyU2VhcmNoRm9ybUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJEZvcm1EYXRhID0ge307CiAgICAjIGdldCB2YWx1ZXMKICAgIGZvcmVhY2ggKHF3KE5hbWUpKSB7CiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICIkXyIpOwogICAgICAgIGlmICgkVmFsdWUpIHsKICAgICAgICAgICAgJFZhbHVlID1+IHMvXCovJS9nOwogICAgICAgICAgICAkRm9ybURhdGEtPnskX30gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQogICAgIyBnZXQgYXJyYXlzCiAgICBmb3JlYWNoIChxdyhUeXBlSURzIENyaXRpY2FsaXR5SURzKSkgewogICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAiJF8iKTsKICAgICAgICBpZiAoQEFycmF5KSB7CiAgICAgICAgICAgICRGb3JtRGF0YS0+eyRffSA9IFxAQXJyYXk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDcvMDcvMDIgMTQ6MDM6MzUgJAoKPWN1dA==
IyAtLQojIEFkbWluU2VydmljZS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU2VydmljZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblNlcnZpY2UuZHRsLHYgMS40IDIwMDcvMDcvMDIgMTQ6MDA6MDAgbWggRXhwICQKIyAkT2xkSWQ6IEFkbWluU2VydmljZS5kdGwsdiAxLjQgMjAwNy8wNi8yOCAyMzo1NTozMyBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZXJ2aWNlIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlcnZpY2VFZGl0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZXJ2aWNlSUQiIHZhbHVlPSJORVciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgU2VydmljZS4ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI2MCUiPiRUZXh0eyJTZXJ2aWNlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsidmFsaWQifS8kVGV4dHsiaW52YWxpZCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3dTcGFjZSAtLT4KICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvd1NwYWNlIC0tPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZXJ2aWNlRWRpdCZTZXJ2aWNlSUQ9JFFEYXRheyJTZXJ2aWNlSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7IlZhbGlkIn0ifQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZUVkaXQgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VydmljZVNhdmUiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNlcnZpY2VJRCIgdmFsdWU9IiRRRGF0YXsiU2VydmljZUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkVkaXQifTo8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWVTaG9ydCJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViLVNlcnZpY2Ugb2YifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJQYXJlbnRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyaXRpY2FsaXR5In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiQ3JpdGljYWxpdHlPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI2MCIgbWF4bGVuZ3RoPSIxNTAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlRWRpdCAtLT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBlbmQgZm9ybSAtLT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEFkbWluU0xBLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5TTEEKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5TTEEuZHRsLHYgMS45IDIwMDcvMDcvMDIgMTQ6MDE6MzQgbWggRXhwICQKIyAkT2xkSWQ6IEFkbWluU0xBLmR0bCx2IDEuOCAyMDA3LzA2LzI4IDIzOjU1OjMzIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlNMQSBNYW5hZ2VtZW50In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgd2lkdGg9IjMwJSIgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTTEFFZGl0Ij4KICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgU0xBIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgU0xBLiJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjcwJSIgY2xhc3M9Im1haW5ib2R5Ij4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikxpc3QifTo8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+JFRleHR7IlNMQSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJ2YWxpZCJ9LyRUZXh0eyJpbnZhbGlkIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2hhbmdlZCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TTEFFZGl0JlNMQUlEPSRRRGF0YXsiU0xBSUQifSI+JFFEYXRheyJOYW1lIn08L2E+PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdCAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBRWRpdCAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTTEFTYXZlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTTEFJRCIgdmFsdWU9IiRRRGF0YXsiU0xBSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjIwMCI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlR5cGVPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlNlcnZpY2VPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2FsZW5kYXIifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJDYWxlbmRhck9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGaXJzdCBSZXNwb25zZSBUaW1lIn0gKCRUZXh0eyJtaW51dGVzIn0pOiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkZpcnN0UmVzcG9uc2VUaW1lIiB2YWx1ZT0iJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZSJ9IiBzaXplPSIxMCIgbWF4bGVuZ3RoPSIxNSI+ICRUZXh0eyIwID0gbm8gZXNjYWxhdGlvbiJ9IC0gMjQgJFRleHR7ImhvdXJzIn0gPSAxNDQwICRUZXh0eyJtaW51dGVzIn0KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlVwZGF0ZSBUaW1lIn0gKCRUZXh0eyJtaW51dGVzIn0pOiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlVwZGF0ZVRpbWUiIHZhbHVlPSIkUURhdGF7IlVwZGF0ZVRpbWUifSIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTUiPiAkVGV4dHsiMCA9IG5vIGVzY2FsYXRpb24ifSAtIDI0ICRUZXh0eyJob3VycyJ9ID0gMTQ0MCAkVGV4dHsibWludXRlcyJ9CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTb2x1dGlvbiBUaW1lIn0gKCRUZXh0eyJtaW51dGVzIn0pOiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlNvbHV0aW9uVGltZSIgdmFsdWU9IiRRRGF0YXsiU29sdXRpb25UaW1lIn0iIHNpemU9IjEwIiBtYXhsZW5ndGg9IjE1Ij4gJFRleHR7IjAgPSBubyBlc2NhbGF0aW9uIn0gLSAyNCAkVGV4dHsiaG91cnMifSA9IDE0NDAgJFRleHR7Im1pbnV0ZXMifQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik1pbmltdW0gVGltZSBCZXR3ZWVuIEluY2lkZW50cyJ9ICgkVGV4dHsibWludXRlcyJ9KTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJNaW5UaW1lQmV0d2VlbkluY2lkZW50cyIgdmFsdWU9IiRRRGF0YXsiTWluVGltZUJldHdlZW5JbmNpZGVudHMifSIgc2l6ZT0iMTAiIG1heGxlbmd0aD0iMTUiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI2MCIgbWF4bGVuZ3RoPSIxNTAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpTTEFFZGl0IC0tPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCBmb3JtIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4K
IyAtLQojIEFnZW50SVRTTVNlcnZpY2UuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01TZXJ2aWNlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNlcnZpY2UuZHRsLHYgMS40IDIwMDcvMDYvMDYgMTQ6NDk6MzEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJPdmVydmlldyJ9OiAkVGV4dHsiU2VydmljZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JpdGljYWxpdHkifTwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJMYXN0IENoYW5nZSJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSb3dTcGFjZSAtLT4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Um93U3BhY2UgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb20mU2VydmljZUlEPSRRRGF0YXsiU2VydmljZUlEIn0iPgogICAgICAgICAgICAkUURhdGF7Ik5hbWUifQogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kVGV4dHsiJFFEYXRheyJDcml0aWNhbGl0eSJ9In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iIHdpZHRoPSIxNTAiPiRUaW1lTG9uZ3siJFFEYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSb3cgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEFnZW50SVRTTVNlcnZpY2Vab29tLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNU2VydmljZVpvb20KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNU2VydmljZVpvb20uZHRsLHYgMS42IDIwMDcvMDYvMTUgMTM6MjA6MDUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifTogJFRleHR7IlNlcnZpY2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgd2lkdGg9Ijc1JSIgY2xhc3M9Im1lbnUiPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgogICAgICAtCjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSIgJERhdGF7IkxpbmtQYXJhbSJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7Ik5hbWUifSJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyIgY2xhc3M9Im1lbnVpdGVtIj4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CiAgICA8L3RkPgogICAgPHRkIGFsaWduPSJyaWdodCIgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPjwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU2VydmljZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcml0aWNhbGl0eSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IkNyaXRpY2FsaXR5In0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6SG9yaXpvbnRhbFJ1bGVyIC0tPgogICAgICA8aHIgc2l6ZT0iMiI+CjwhLS0gZHRsOmJsb2NrOkhvcml6b250YWxSdWxlciAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iPgogICAgICAgICAgICAgICAgICA8Yj48aT4kVGV4dHsiQXNzb2NpYXRlZCBTTEFzIn08L2k+PC9iPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU0xBIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ikxhc3QgQ2hhbmdlIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNMQVJvdyAtLT4KICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01TTEFab29tJlNMQUlEPSRRRGF0YXsiU0xBSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiVHlwZSJ9In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iIHdpZHRoPSIxNTAiPiRUaW1lTG9uZ3siJFFEYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U0xBUm93IC0tPgogICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIHdpZHRoPSI5OCUiIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8Y29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICA8Y29sIHdpZHRoPSIkUURhdGF7IldpZHRoIn0iPgo8IS0tIGR0bDpibG9jazpMaW5rQ29sdW1uV2lkdGggLS0+CiAgICAgICAgPC9jb2xncm91cD4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iPgogICAgICAgICAgICA8Yj48aT4kVGV4dHsiUmVsYXRlZCBPYmplY3RzIn06ICRUZXh0eyIkUURhdGF7IkJsb2NrbmFtZTEifSJ9ICRRRGF0YXsiQmxvY2tuYW1lMiJ9PC9pPjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtIZWFkZXJDb2x1bW4gLS0+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiJFFEYXRheyJDb250ZW50In0ifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkxpbmtIZWFkZXJDb2x1bW4gLS0+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1JvdyAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KPCEtLSBkdGw6YmxvY2s6TGlua1Jvd0NvbHVtbiAtLT4KICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kRGF0YXsiQ29udGVudCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6TGlua1Jvd0NvbHVtbiAtLT4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjI1JSIgY2xhc3M9Im1lbnUiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJDcmVhdGVkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDcmVhdGVVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ3JlYXRlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ3JlYXRlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDcmVhdGVVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4ifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSJ9KSI+CiAgICAgICAgICAgICRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIiwiMTUifSAoJFF1b3RleyIkRGF0YXsiQ2hhbmdlVXNlckZpcnN0bmFtZSJ9ICREYXRheyJDaGFuZ2VVc2VyTGFzdG5hbWUifSIsIjE1In0pCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIEFnZW50SVRTTVNMQVpvb20uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudElUU01TTEFab29tCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTVNMQVpvb20uZHRsLHYgMS41IDIwMDcvMDYvMTYgMTI6Mjc6NTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifTogJFRleHR7IlNMQSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNzUlIiBjbGFzcz0ibWVudSI+CjwhLS0gZHRsOmJsb2NrOk1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtU3BsaXQgLS0+CiAgICAgIC0KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiTmFtZSJ9In0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBjbGFzcz0ibWVudWl0ZW0iPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KICAgIDwvdGQ+CiAgICA8dGQgYWxpZ249InJpZ2h0IiB3aWR0aD0iMjUlIiBjbGFzcz0ibWVudSI+PC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTTEEifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiRRRGF0YXsiVHlwZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2FsZW5kYXIifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJDYWxlbmRhck5hbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVXBkYXRlVGltZSJ9ICRUZXh0eyJtaW51dGVzIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU29sdXRpb24gVGltZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU29sdXRpb25UaW1lIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJNaW5pbXVtIFRpbWUgQmV0d2VlbiBJbmNpZGVudHMifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik1pblRpbWVCZXR3ZWVuSW5jaWRlbnRzIn0gJFRleHR7Im1pbnV0ZXMifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iMjUlIiBjbGFzcz0ibWVudSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRRRGF0YXsiU2VydmljZSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW52YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiQ3JlYXRlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ3JlYXRlVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNyZWF0ZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ3JlYXRlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNoYW5nZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCBieSJ9OjwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ2hhbmdlVXNlckxvZ2luIn0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlVXNlckxhc3RuYW1lIn0ifSkiPgogICAgICAgICAgICAkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiIsIjE1In0gKCRRdW90ZXsiJERhdGF7IkNoYW5nZVVzZXJGaXJzdG5hbWUifSAkRGF0YXsiQ2hhbmdlVXNlckxhc3RuYW1lIn0iLCIxNSJ9KQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU2VydmljZS5wbSAtIGFsbCBzZXJ2aWNlIGZ1bmN0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTZXJ2aWNlLnBtLHYgMS4xMS4yLjMgMjAwOC8wMy8xMSAxODo1Njo0OCBtaCBFeHAgJAojICRPbGRJZDogU2VydmljZS5wbSx2IDEuMTguMi4xIDIwMDgvMDMvMTEgMTU6MjE6MTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjExLjIuMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlIC0gc2VydmljZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHNlcnZpY2UgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFNlcnZpY2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFNlcnZpY2VMaXN0KCkKCnJldHVybiBhIGhhc2ggbGlzdCBvZiBzZXJ2aWNlcwoKICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCA9PiAwLCAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJVNlcnZpY2VMaXN0OwogICAgbXkgJVNlcnZpY2VWYWxpZExpc3Q7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtWYWxpZH0pKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBuYW1lLCB2YWxpZF9pZCBGUk9NIHNlcnZpY2UiLAogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRTZXJ2aWNlTGlzdHskUm93WzBdfSA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VWYWxpZExpc3R7JFJvd1swXX0gPSAkUm93WzJdOwogICAgfQogICAgaWYgKCRQYXJhbXtWYWxpZH0pIHsKICAgICAgICAjIGdldCB2YWxpZCBpZHMKICAgICAgICBteSBAVmFsaWRJRHMgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKTsKICAgICAgICAjIGR1cGxpY2F0ZSBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZUxpc3RUbXAgPSAlU2VydmljZUxpc3Q7CiAgICAgICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgICAgICBmb3JlYWNoIG15ICRTZXJ2aWNlSUQgKGtleXMgJVNlcnZpY2VMaXN0VG1wKSB7CiAgICAgICAgICAgICRTZXJ2aWNlTGlzdFRtcHskU2VydmljZUlEfSAuPSAnOjonOwogICAgICAgIH0KICAgICAgICBteSAlU2VydmljZUludmFsaWRMaXN0OwogICAgICAgIGZvcmVhY2ggbXkgJFNlcnZpY2VJRCAoc29ydCB7JFNlcnZpY2VMaXN0VG1weyRhfSBjbXAgJFNlcnZpY2VMaXN0VG1weyRifX0ga2V5cyAlU2VydmljZUxpc3RUbXApIHsKICAgICAgICAgICAgbXkgJEludmFsaWQgPSAxOwogICAgICAgICAgICBmb3JlYWNoIG15ICRWYWxpZElEIChAVmFsaWRJRHMpIHsKICAgICAgICAgICAgICAgIGlmICgkU2VydmljZVZhbGlkTGlzdHskU2VydmljZUlEfSBlcSAkVmFsaWRJRCkgewogICAgICAgICAgICAgICAgICAgICRJbnZhbGlkID0gMDsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkSW52YWxpZCkgewogICAgICAgICAgICAgICAgJFNlcnZpY2VJbnZhbGlkTGlzdHskU2VydmljZUxpc3R7JFNlcnZpY2VJRH19ID0gMTsKICAgICAgICAgICAgICAgIGRlbGV0ZSgkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZGVsZXRlIGludmFsaWQgc2VydmljZXMgYW4gY2hpbGRzCiAgICAgICAgZm9yZWFjaCBteSAkU2VydmljZUlEIChrZXlzICVTZXJ2aWNlTGlzdCkgewogICAgICAgICAgICBmb3JlYWNoIG15ICRJbnZhbGlkTmFtZSAoa2V5cyAlU2VydmljZUludmFsaWRMaXN0KSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9fiBteyBcQSAkSW52YWxpZE5hbWUgOjogfXhtcyApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUoJFNlcnZpY2VMaXN0eyRTZXJ2aWNlSUR9KTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICVTZXJ2aWNlTGlzdDsKfQoKPWl0ZW0gU2VydmljZUdldCgpCgpyZXR1cm4gYSBzZXJ2aWNlIGFzIGhhc2gKClJldHVybgogICAgJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0KICAgICRTZXJ2aWNlRGF0YXtQYXJlbnRJRH0KICAgICRTZXJ2aWNlRGF0YXtOYW1lfQogICAgJFNlcnZpY2VEYXRhe05hbWVTaG9ydH0KICAgICRTZXJ2aWNlRGF0YXtWYWxpZElEfQogICAgJFNlcnZpY2VEYXRhe0NvbW1lbnR9CiAgICAkU2VydmljZURhdGF7Q3JlYXRlVGltZX0KICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVCeX0KICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VUaW1lfQogICAgJFNlcnZpY2VEYXRhe0NoYW5nZUJ5fQojIC0tLQojIElUU00KIyAtLS0KICAgICRTZXJ2aWNlRGF0YXtUeXBlSUR9CiAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0KIyAtLS0KCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTZXJ2aWNlSUQgVXNlcklEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU2VydmljZUlEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBzZXJ2aWNlIGZyb20gZGIKICAgIG15ICVTZXJ2aWNlRGF0YSA9ICgpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAiLgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgIiwgdHlwZV9pZCwgY3JpdGljYWxpdHlfaWQgIi4KIyAtLS0KICAgICAgICAgICAgIkZST00gc2VydmljZSBXSEVSRSBpZCA9ICRQYXJhbXtTZXJ2aWNlSUR9IiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9ID0gJFJvd1swXTsKICAgICAgICAkU2VydmljZURhdGF7TmFtZX0gPSAkUm93WzFdOwogICAgICAgICRTZXJ2aWNlRGF0YXtWYWxpZElEfSA9ICRSb3dbMl07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NvbW1lbnR9ID0gJFJvd1szXSB8fCAnJzsKICAgICAgICAkU2VydmljZURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzRdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVCeX0gPSAkUm93WzVdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NoYW5nZUJ5fSA9ICRSb3dbN107CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICRTZXJ2aWNlRGF0YXtUeXBlSUR9ID0gJFJvd1s4XTsKICAgICAgICAkU2VydmljZURhdGF7Q3JpdGljYWxpdHlJRH0gPSAkUm93WzldOwojIC0tLQogICAgfQogICAgIyBjaGVjayBzZXJ2aWNlCiAgICBpZiAoISRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIk5vIHN1Y2ggU2VydmljZUlEICgkUGFyYW17U2VydmljZUlEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgY3JlYXRlIHNob3J0IG5hbWUgYW5kIHBhcmVudGlkCiAgICAkU2VydmljZURhdGF7TmFtZVNob3J0fSA9ICRTZXJ2aWNlRGF0YXtOYW1lfTsKICAgIGlmICgkU2VydmljZURhdGF7TmFtZX0gPX4gL14oLiopOjooLis/KSQvKSB7CiAgICAgICAgJFNlcnZpY2VEYXRhe05hbWVTaG9ydH0gPSAkMjsKICAgICAgICAjIGxvb2t1cCBwYXJlbnQKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJDEsCiAgICAgICAgKTsKICAgICAgICAkU2VydmljZURhdGF7UGFyZW50SUR9ID0gJFNlcnZpY2VJRDsKICAgIH0KICAgIHJldHVybiAlU2VydmljZURhdGE7Cn0KCj1pdGVtIFNlcnZpY2VMb29rdXAoKQoKcmV0dXJuIGEgc2VydmljZSBuYW1lIGFuZCBpZAoKICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgIFNlcnZpY2VJRCA9PiAxMjMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgIE5hbWUgPT4gJ1NlcnZpY2U6OlN1YlNlcnZpY2UnLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlTG9va3VwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoISRQYXJhbXtTZXJ2aWNlSUR9ICYmICEkUGFyYW17TmFtZX0pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkIFNlcnZpY2VJRCBvciBOYW1lISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICgkUGFyYW17U2VydmljZUlEfSkgewogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBpZiAoJFNlbGYtPnsiQ2FjaGU6OlNlcnZpY2VMb29rdXA6OklEOjokUGFyYW17U2VydmljZUlEfSJ9KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+eyJDYWNoZTo6U2VydmljZUxvb2t1cDo6SUQ6OiRQYXJhbXtTZXJ2aWNlSUR9In07CiAgICAgICAgfQogICAgICAgIG15ICRTZXJ2aWNlTmFtZTsKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte1NlcnZpY2VJRH0sICdJbnRlZ2VyJyk7CiAgICAgICAgIyBsb29rdXAKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgbmFtZSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkUGFyYW17U2VydmljZUlEfSIsCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJFNlcnZpY2VOYW1lID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgIyBjYWNoZQogICAgICAgICRTZWxmLT57IkNhY2hlOjpTZXJ2aWNlTG9va3VwOjpJRDo6JFBhcmFte1NlcnZpY2VJRH0ifSA9ICRTZXJ2aWNlTmFtZTsKICAgICAgICByZXR1cm4gJFNlcnZpY2VOYW1lOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIGlmICgkU2VsZi0+eyJDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JFBhcmFte05hbWV9In0pIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57IkNhY2hlOjpTZXJ2aWNlTG9va3VwOjpOYW1lOjokUGFyYW17TmFtZX0ifTsKICAgICAgICB9CiAgICAgICAgbXkgJFNlcnZpY2VJRDsKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte05hbWV9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXtOYW1lfSk7CiAgICAgICAgIyBsb29rdXAKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSAnJFBhcmFte05hbWV9JyIsCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgICMgY2FjaGUKICAgICAgICAkU2VsZi0+eyJDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JFBhcmFte05hbWV9In0gPSAkU2VydmljZUlEOwogICAgICAgIHJldHVybiAkU2VydmljZUlEOwogICAgfQp9Cgo9aXRlbSBTZXJ2aWNlQWRkKCkKCmFkZCBhIHNlcnZpY2UKCiAgICBteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICAgICAgTmFtZSA9PiAnU2VydmljZSBOYW1lJ